📄 gobanghallcanvas.java
字号:
package com.tianxia.qipai.view.game.gobang;
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;
import com.tianxia.qipai.control.game.gobang.GobangControl;
import com.tianxia.qipai.event.GobangEvent;
import com.tianxia.qipai.event.MainGameEvent;
import com.tianxia.qipai.event.UniGameEvent;
import com.tianxia.qipai.model.game.gobang.GobangDeal;
import com.tianxia.qipai.model.game.gobang.GobangTimer;
import com.tianxia.qipai.model.game.gobang.HandSprite;
import com.tianxia.qipai.model.game.gobang.PlayerSprite;
import com.tianxia.qipai.model.game.gobang.PlayerStruct;
import com.tianxia.qipai.model.game.gobang.TimeAdd;
import com.tianxia.qipai.model.util.CommStructNode;
import com.tianxia.qipai.model.util.GameEventDeal;
public class GobangHallCanvas extends GameCanvas implements CommandListener,
GameEventDeal,TimeAdd {
// private Runtime tt = Runtime.getRuntime();
//private long testa = tt.freeMemory();
/*************************************************************************************************
//各种图层单元大小和格数
* **********************************************************************************************/
public final static int BGTILE_WIDTH = 89; //背景 单元宽度 89px
public final static int BGTILE_HEIGHT = 55; //背景 单元高度 55px
public final static int TABLE_WIDTH = 51;//69; //游戏桌宽度 10px 要求:能被3整除
public final static int TABLE_HEIGHT = 60;//81; //背景 单元高度 10px 要求:能被3整除
private final static int HAND_WIDTH = 20; //指针图片单元宽度
private final static int HAND_HEIGHT = 16; //指针图片单元高度
private final static int USER_WIDTH = 27;//32; //人物图片单元宽度
private final static int USER_HEIGHT = 27;//32; //人物图片单元高度
private final static int BGWIDTH_IN_TILES = 2; //背景 游戏域宽度(以单元宽度计算) 16 .. N
private final static int BGHEIGHT_IN_TILES = 10;//15; //背景 游戏域高度(以单元高度计算)
private final static int TBWIDTH_IN_TILES = 3; //游戏桌 游戏域宽度(以单元宽度计算) 16 .. N
private final static int TBHEIGHT_IN_TILES = 8; //游戏桌 游戏域高度(以单元高度计算)
private final static int MY_INFO_WIDTH = 130; //显示用户本身信息的图层的大小
private final static int MY_INFO_HEIGHT = 90;
private final static int HELP_INFO_WIDTH = 130; //显示帮助信息的图层的大小
private final static int HELP_INFO_HEIGHT = 100;
private final static int MENU_RECT_WIDTH = 54; //菜单单元格图层的大小
private final static int MENU_RECT_HEIGHT = 18;
private final static int OTHER_INFO_WIDTH = 100; //60; //用户简单信息的图片宽度和高度
private final static int OTHER_INFO_HEIGHT = 50; //30;
private final static int OTHER_DETAIL_WIDTH = 130; //用户详细信息的图片宽度和高度
private final static int OTHER_DETAIL_HEIGHT = 90;
/*************************************************************************************************
//各种图层和显示元件
* **********************************************************************************************/
private static GobangHallCanvas instance = null;
private Display display;
private Graphics g;
private LayerManager lm;
private HandSprite handsprite;
private Sprite userinfosprite; //在座用简单户信息精灵
private Sprite otherinfosprite;//在座用户的详细信息
private Sprite myinfosprite; //我的详细信息
private Sprite helpsprite; //帮助信息显示精灵
private TiledLayer gaminglayer; //游戏开始表示图层 大小与桌子图层相同
//定义背景、桌子、指针的单元图片
private Image boyimage1,boyimage2,girlimage1,girlimage2; //玩家图片
private MenuControl menucontrol; //菜单控件
private Font infofont = Font.getFont(0,0,Font.SIZE_SMALL);
/*************************************************************************************************
//各种图层的初始位置
* **********************************************************************************************/
private final static int ORIGIN_X = 0;//layermanager相对与屏幕窗口的原点位置
private final static int ORIGIN_Y = 0;
private final static int TBVIEW_X = 10; //20; //游戏桌图层相对layermanager的位置
private final static int TBVIEW_Y = 20; //40;
private final static int BGVIEW_X = 0; //背景图层相对layermanager的位置
private final static int BGVIEW_Y = 0;
private final static int FIR_X = TBVIEW_X+7; //25; //游戏大厅里第一桌两个位置的指针的初始坐标
private final static int FIR_Y = TBVIEW_Y+28; //70;
private final static int SEC_X = TBVIEW_X+45; //75;
private final static int SEC_Y = TBVIEW_Y; //40;
private final static int PFIR_X = TBVIEW_X-1; //20; //游戏大厅里第一桌两个位置的玩家的初始坐标
private final static int PFIR_Y = TBVIEW_Y+7; //50;
private final static int PSEC_X = TBVIEW_X+33; //63;
private final static int PSEC_Y = TBVIEW_Y-15; //20;
private final static int MYINFO_X = 30; //用户本身信息的图层的初始位置
private final static int MYINFO_Y = 40;
private final static int OTHERINFO_X = 30; //其他用户详细信息的图层的初始位置
private final static int OTHERINFO_Y = 40;
private final static int HELPINFO_X = 30; //帮助信息的图层的初始位置
private int HELPINFO_Y = 40;
/*************************************************************************************************
//各种图片和显示控件的宽度和高度
* **********************************************************************************************/
public final static int BG_WIDTH = BGWIDTH_IN_TILES * BGTILE_WIDTH;
public final static int BG_HEIGHT = BGHEIGHT_IN_TILES * BGTILE_HEIGHT;
/*************************************************************************************************
//各种状态参数
* **********************************************************************************************/
//游戏菜单的各种参数
private final static int STATE_NUM=5; //游戏菜单的子项数
private final static int EXITMENU = 0;
private final static int MYINFO = 1;
private final static int EXITROOM = 3;
private final static int HELP = 2;
private final static int EXITGAME = 4;
private final static int SITCOUNT = TBWIDTH_IN_TILES*TBHEIGHT_IN_TILES*2; //房间座位数目
private PlayerSprite playersprite[] = new PlayerSprite[SITCOUNT+1];
public static int mainWidth; //屏幕宽度
public static int mainHeight; //屏幕高度
private GobangControl gobangcontrol;
private PlayerStruct player[] = new PlayerStruct[SITCOUNT+1]; //存放所有坐下的用户信息
//初始化为不使用窗口区域视野
private boolean userViewWindow = false;
private GobangDeal gobangdeal;
private MainGameEvent maingameevent;
private CommStructNode commstructnode;
private CommStructNode otherinfonode; //存放房间里其他用户的信息
private int xViewWindow; //LayerManager的偏移坐标
private int yViewWindow;
private int wViewWindow;
private int hViewWindow;
private int currcount = 0;
private boolean myinfoflag; //用户信息是否正在显示
private boolean inroomflag; //是否已经获的了大厅里的信息
private int moveheight; //屏幕窗口垂直移动量
private boolean sendflag; //已经发出一次数据请求标志
private int resendflag; //数据包重发记数
private GobangTimer gobangtimer;
private boolean initflag;//是否是刚进入本界面
// private long testb = tt.freeMemory();
public GobangHallCanvas() {
super(false);
setFullScreenMode(true);
mainWidth = getWidth();
mainHeight = this.getHeight()+20;
inroomflag = false;
// System.out.println("freeMorytesta: "+String.valueOf(testa));
//System.out.println("freeMorytestb: "+String.valueOf(testb));
Runtime aa = Runtime.getRuntime();
System.out.println("freeMoryinit1: "+String.valueOf(aa.freeMemory()));
// TODO 自动生成构造函数存根
}
public static synchronized GobangHallCanvas getInstance(){
if(instance == null){
instance = new GobangHallCanvas();
}
return instance;
}
public void init(GobangControl gobangcontrol){
initflag = true;
sendflag = false;
currcount=30;
resendflag = 0;
this.gobangcontrol = gobangcontrol;
display = gobangcontrol.getDisplay();
gobangdeal = GobangDeal.getInstance();
maingameevent = gobangcontrol.getMainGameEvent();
commstructnode = maingameevent.getCommNode();
if(g==null)
g = getGraphics();
if(lm == null){
lm = new LayerManager();
}
System.out.println("freeMoryinit0: "+String.valueOf(gobangcontrol.rt.freeMemory()));
Image userimage = null;
try {
userimage = Image.createImage("/png/userpicture.png");
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
boyimage1 = Image.createImage(USER_WIDTH*2,USER_HEIGHT);
Graphics usergra = boyimage1.getGraphics();
usergra.drawImage(userimage,0,0,Graphics.TOP|Graphics.LEFT);
boyimage1=this.setImageAlph(boyimage1,true,0xffffffff);
usergra = null;
boyimage2 = Image.createImage(USER_WIDTH*2,USER_HEIGHT);
usergra = boyimage2.getGraphics();
usergra.drawImage(userimage,-1*USER_WIDTH*2,0,Graphics.TOP|Graphics.LEFT);
boyimage2=this.setImageAlph(boyimage2,true,0xffffffff);
girlimage1 = Image.createImage(USER_WIDTH*2,USER_HEIGHT);
usergra = null;
usergra = girlimage1.getGraphics();
usergra.drawImage(userimage,-2*USER_WIDTH*2,0,Graphics.TOP|Graphics.LEFT);
girlimage1=this.setImageAlph(girlimage1,true,0xffffffff);
usergra = null;
girlimage2 = Image.createImage(USER_WIDTH*2,USER_HEIGHT);
usergra = girlimage2.getGraphics();
usergra.drawImage(userimage,-3*USER_WIDTH*2,0,Graphics.TOP|Graphics.LEFT);
girlimage2=this.setImageAlph(girlimage2,true,0xffffffff);
usergra = null;
userimage = null;
myinfoflag = false;
gobangcontrol.rt.gc();
System.out.println("freeMoryinit1: "+String.valueOf(gobangcontrol.rt.freeMemory()));
gobangdeal.setEventDeal(this);
hallinit(); //大厅初始化
if(!inroomflag){
moveheight = 0; //显示顶端信息
sendflag = true;
gobangdeal.getHallInfo(maingameevent); //获取大厅里所有玩家的信息
}else{
handsprite.reflesh();
handsprite.setRelase();
handsprite.setVisible(true);
drawhallinfo();
paintCanvas();
}
paintCanvas();
if(gobangtimer != null){
gobangtimer.ToExit();
gobangtimer = null;
}
gobangtimer = new GobangTimer(this);
gobangtimer.start();
System.out.println("freeMoryinit: "+String.valueOf(gobangcontrol.rt.freeMemory()));
}
private void initother(){
// 插入指针精灵
if(!inroomflag){
Image handimage = null;
try {
handimage = Image.createImage("/png/mouse.png"); //读取指针图片
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
if(handsprite == null)
handsprite = new HandSprite(handimage,HAND_WIDTH,HAND_HEIGHT);
handsprite.init(FIR_X,FIR_Y,SEC_X,SEC_Y,TABLE_WIDTH,TABLE_HEIGHT,TBWIDTH_IN_TILES,TBHEIGHT_IN_TILES);
handimage = null;
gobangcontrol.rt.gc();
}
lm.insert(handsprite,0);
System.out.println("freeMoryhandimage: "+String.valueOf(gobangcontrol.rt.freeMemory()));
}
/**
* 画布重画事件,替代Canvas中的paint()事件, 根据不同的游戏状态(gameState)画出游戏画面
* 本方法由thread每次重新启动, 最后执行flushGraphics()重画缓冲区
*/
public synchronized void paintCanvas(){
if(lm!=null && g != null){
lm.paint(g,ORIGIN_X,ORIGIN_Y);
this.flushGraphics();
}
}
//初始化大厅
protected void hallinit(){
if(!inroomflag){
//判断是否使用预览模式窗口
//根据显示设备,设置合适的最大区和显示视野
this.xViewWindow = 0;
if(BG_WIDTH > mainWidth){
//现有设备不能容纳所有游戏区域
this.wViewWindow = mainWidth;
}else{
//现有设备可以容纳所有游戏区域
this.wViewWindow = BG_WIDTH;
}
this.yViewWindow = 0;
if(BG_HEIGHT > mainHeight){
this.hViewWindow = mainHeight;
}else{
this.hViewWindow = BG_HEIGHT;
}
}
//设定图层显示方式
this.lm.setViewWindow(xViewWindow, yViewWindow, wViewWindow, hViewWindow);
Image tempimage = null;
// 画场地背景
TiledLayer bglayer; //定义背景图层
Image bgtile=null;
try {
bgtile = Image.createImage("/png/floor.png"); //读取背景图片
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
bglayer = new TiledLayer(BGWIDTH_IN_TILES, BGHEIGHT_IN_TILES,bgtile, BGTILE_WIDTH, BGTILE_HEIGHT);
bglayer.fillCells(0,0,BGWIDTH_IN_TILES,BGHEIGHT_IN_TILES,1);
bglayer.setPosition(BGVIEW_X,BGVIEW_Y);
lm.insert(bglayer,0);
bgtile = null;
bglayer = null;
gobangcontrol.rt.gc();
System.out.println("freeMoryfloor: "+String.valueOf(gobangcontrol.rt.freeMemory()));
Image tableimage = null;
try {
tableimage = Image.createImage("/png/deskandgaming.png"); //读取游戏桌单元的背景图片
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
// 画游戏桌
TiledLayer tablelayer; //桌子图层
Image tabletile = Image.createImage(TABLE_WIDTH,TABLE_HEIGHT);
Graphics tablegra = tabletile.getGraphics();
tablegra.drawImage(tableimage,0,0,Graphics.TOP|Graphics.LEFT);
//tempimage = tabletile;
tempimage = this.setImageAlph(tabletile,true,0xffffffff);
tablelayer = new TiledLayer(TBWIDTH_IN_TILES, TBHEIGHT_IN_TILES,tempimage, TABLE_WIDTH, TABLE_HEIGHT);
tablelayer.fillCells(0,0,TBWIDTH_IN_TILES,TBHEIGHT_IN_TILES,1);
tablelayer.setPosition(TBVIEW_X,TBVIEW_Y);
//tablelayer.setVisible(true);
lm.insert(tablelayer,0);
tempimage = null;
tablegra = null;
tabletile = null;
tablelayer = null;
gobangcontrol.rt.gc();
System.out.println("freeMorytable: "+String.valueOf(gobangcontrol.rt.freeMemory()));
//画游戏开始提示图层
Image gamingimage = Image.createImage(TABLE_WIDTH,TABLE_HEIGHT);
Graphics gaminggra = gamingimage.getGraphics();
gaminggra.drawImage(tableimage,0-TABLE_WIDTH,0,Graphics.TOP|Graphics.LEFT);
tempimage = this.setImageAlph(gamingimage,true,0xffffffff);
if(gaminglayer==null)
gaminglayer = new TiledLayer(TBWIDTH_IN_TILES, TBHEIGHT_IN_TILES,tempimage, TABLE_WIDTH, TABLE_HEIGHT);
gaminglayer.fillCells(0,0,TBWIDTH_IN_TILES,TBHEIGHT_IN_TILES,0);
gaminglayer.setPosition(TBVIEW_X,TBVIEW_Y);
tempimage = null;
gaminggra = null;
gamingimage = null;
tableimage = null;
gobangcontrol.rt.gc();
lm.insert(gaminglayer,0);
System.out.println("freeMorygaming: "+String.valueOf(gobangcontrol.rt.freeMemory()));
//画编号(屏幕大小改变时,这个数值要改变)图片内容格式
//1 2 3 4 5 6 7 8
//9 10 11 12 13 14 15 16
//17 1819 20 21 22 23 24
TiledLayer numlayer; //定义编号的图层
Image numimage=Image.createImage(TABLE_WIDTH*8 /3,TABLE_HEIGHT*3 /3); //制作编号图片 每一个单元格是游戏桌单元图片的1/9
Graphics gra = numimage.getGraphics();
for(int j = 0;j<TBWIDTH_IN_TILES;j++){
for(int i = 0;i<TBHEIGHT_IN_TILES;i++){
int x = TABLE_WIDTH/11+i*TABLE_WIDTH/3;
int y = TABLE_HEIGHT/15+j*TABLE_HEIGHT/3;
String tempstr = String.valueOf(i+1+8*j);
gra.drawString(tempstr,x,y,Graphics.LEFT | Graphics.TOP);
}
}
tempimage = setImageAlph(numimage,true,0xffffffff);
numlayer = new TiledLayer(TBWIDTH_IN_TILES*3,TBHEIGHT_IN_TILES*3,tempimage, TABLE_WIDTH/3,TABLE_HEIGHT/3);
for(int j=0;j<TBHEIGHT_IN_TILES;j++){
for(int i=0;i<TBWIDTH_IN_TILES;i++){
numlayer.setCell(1+3*i,2+j*3,i+1+3*j);
}
}
numlayer.setPosition(TBVIEW_X,TBVIEW_Y);
lm.insert(numlayer,0);
tempimage = null;
numimage = null;
numlayer = null;
gobangcontrol.rt.gc();
System.out.println("freeMorynumber: "+String.valueOf(gobangcontrol.rt.freeMemory()));
//插入菜单精灵
Image menuimage = null;
Image menudetailimage=null;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -