⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gobanghallcanvas.java

📁 游戏说明
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
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 + -