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

📄 boxesworker.java

📁 手机小游戏仓库世家通过移动左右键来推箱子
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package com.my;							//导入自己的包
import javax.microedition.midlet.*;		//导入javax.microedition.midlet包
import javax.microedition.lcdui.*;		//导入javax.microedition.lcdui包
import javax.microedition.lcdui.game.*;//导入javax.microedition.lcdui.game包
import java.util.*;						//导入java.util包
public class BoxesWorker extends MIDlet  {//自定义BoxesWorker类继承MIDlet
	private Display display;			//引用MIDlet的display对象
	private MyGameCanvas gameCanvas;	//定义画布
	public BoxesWorker() {				//BoxesWorker的构造函数
		// TODO Auto-generated constructor stub
		display = Display.getDisplay(this);//获取唯一的Display实例
		gameCanvas = new MyGameCanvas();	//
		gameCanvas.setMidlet(this);			//
		display.setCurrent(gameCanvas);		//把画布设置为当前Displayable对象
	}
	protected void destroyApp(boolean arg0)  {
		// TODO Auto-generated method stub
	}
	protected void pauseApp() {
		// TODO Auto-generated method stub
		//gameCanvas.pause();
	}
	protected void startApp()  {
		// TODO Auto-generated method stub
		gameCanvas.start();
	}
}
class  MyGameCanvas extends GameCanvas implements Runnable//建立自己的GameCanvas派生类
{
	private BoxesWorker instance;		//定义BoxesWorker实例	
	private int screenWidth;			//屏幕宽度
	private int screenHeight;			//屏幕高度
	private boolean running = true;		//定义线程体
	private boolean pauseFlag = false; 	//暂停线程体
	public MyGameCanvas() {
		// TODO Auto-generated constructor stub
		super(true);					//屏蔽keyPressed等键盘事件
		screenWidth = getWidth();		//获取屏幕宽度
		screenHeight = getHeight();		//获取屏幕高度
		System.out.println("Screen Size:"+screenWidth+"*"+screenHeight);
		initData();
	}	
	public void setMidlet(BoxesWorker m)
	{
		this.instance = m;
	}
	protected void start(){//开始执行线程
		// TODO Auto-generated method stub
		Thread t = new Thread(this);
		t.start();
	}
	public void stop()//结束线程的执行
	{
		running = false;//当线程的执行被停止时running为假
	}
	public void pause()//暂停线程的执行
	{
		pauseFlag = true;//当线程的执行被暂停时running为假
	}
	public void exit()//退出线程的执行
	{
		running = false;//当线程的执行被退出时running为假
		instance.destroyApp(false);
		instance.notifyDestroyed();
	}
	public void run()					//线程体
	{
		Graphics g = getGraphics();		//获取脱机屏幕缓冲区中的图形对象
		while( running == true )		//当线程体开始执行时
		{
			if (pauseFlag == false)		//如果线程体的执行没有被暂停的话			
			{
				processKey();
				drawScreen(g);
				flushGraphics();
			}
		}
		exit();
	}
	int leftLastFlag=0;		//按住左键不放时不产生动作	
	int rightLastFlag=0;	//按住右键不放时不产生动作	
	int upLastFlag=0;		//按住上键不放时不产生动作	
	int downLastFlag=0;		//按住下键不放时不产生动作	
	int fireLastFlag=0;		//按住开始键不放时不产生动作	
	private void processKey()				//处理按键
	{
		int keyStates = getKeyStates();		//查询按键状态
		int leftFlag = 0;					//当左键没被按下时
		if ((keyStates & LEFT_PRESSED)!=0)	//如果按了左键
		{
			leftFlag = 1;					//产生按下左键的事件
		}
		if (leftLastFlag!=leftFlag)			//当没有持续按下左键时
		{
			if (leftLastFlag==1)			//按下了左键
			{
				onKeyDown(LEFT_PRESSED);	//产生了按下左键的事件
			}
			leftLastFlag = leftFlag;		//持续按下左键的效果等同于按下左键
		}	
		int rightFlag = 0;					//当右键没被按下时
		if ((keyStates & RIGHT_PRESSED)!=0)	//如果按了右键
		{
			rightFlag = 1;					//产生按下右键的事件
		}
		if (rightLastFlag!=rightFlag)		//当没有持续按下右键时
		{
			if (rightLastFlag==1)			//按下了右键
			{
				onKeyDown(RIGHT_PRESSED);	//产生了按下右键的事件
			}
			rightLastFlag = rightFlag;		//持续按下右键的效果等同于按下右键
		}
		int upFlag = 0;						//当上键没被按下时
		if ((keyStates & UP_PRESSED)!=0)	//如果按了上键
		{
			upFlag = 1;						//产生按下上键的事件
		}
		if (upLastFlag!=upFlag)				//当没有持续按下上键时
		{
			if (upLastFlag==1)				//按下了上键
			{
				onKeyDown(UP_PRESSED);		//产生了按下上键的事件
			}
			upLastFlag = upFlag;			//持续按下上键的效果等同于按上上键
		}	
		int downFlag = 0;					//当下键没被按下时
		if ((keyStates & DOWN_PRESSED)!=0)	//如果按了下键
		{
			downFlag = 1;					//产生按下下键的事件
		}
		if (downLastFlag!=downFlag)			//当没有持续按下下键时
		{
			if (downLastFlag==1)			//按下了下键
			{
				onKeyDown(DOWN_PRESSED);	//产生了按下下键的事件
			}
			downLastFlag = downFlag;		//持续按下下键的效果等同于按下下键
		}		
		int fireFlag = 0;					//当确定键没被按下时
		if ((keyStates & FIRE_PRESSED)!=0)	//如果按了确定键
		{
			fireFlag = 1;					//产生按下确定键的事件
		}
		if (fireLastFlag!=fireFlag)			//当没有持续按下确定键时
		{
			if (fireLastFlag==1)			//按下了确定键
			{
				onKeyDown(FIRE_PRESSED);	//产生了按下确定键的事件
			}
			fireLastFlag = fireFlag;		//持续按下确定键的效果等同于按下确定键
		}			
	}
	private Image loadImage(String imageString)							//游戏图象
	{
		Image t;														
		try{															//当游戏图象载入出错时进行提示
			t = Image.createImage("/"+imageString);
		}catch(Exception e)
		{
			System.out.println("Load "+imageString+" Image error!!");
			return null;
		}
		return  t;
	}
	/**
	 * 地图数据
	 */
	private int map[][]={{0,0,1,1,1,1,0,0,0},//地图结构
						 {0,0,1,5,5,1,0,0,0},
						 {0,0,1,5,5,1,1,1,0},
						 {1,1,1,5,2,2,5,1,0},
						 {1,5,5,3,1,5,5,1,0},
						 {1,5,5,2,3,3,5,1,0},
						 {1,1,1,1,5,4,5,1,0},
						 {0,0,0,1,1,1,1,1,0},
						 {0,0,0,0,0,0,0,0,0}
						};
	//人的位置
	private int man_row;
	private int man_col;
	/**
	 * 人的方向
	 * left 1 right 2 top 3 down 4
	 */
	private int man_way=1;
	//地图行数,列数
	private int map_row;
	private int map_col;
	//地图位置
	private int map_x;
	private int map_y;
	//地图中网格的宽高
	private final int cell_width=20;
	private final int cell_height=20;
	//地图中的图像
	private Sprite mapImage;
	private void findMan()			//遍历地图查找人的位置
	{
		for(int i=0;i<9;i++)		//定义一个参数i
		{
			for(int j=0;j<9;j++)	//定义一个参数j
			{
				if (map[i][j]==4)	//当找到人的位置的时候
				{
					man_row = i;	//把i赋给man_row
					man_col = j;	//把j赋给man_col
					return;			//返回人的位置
				}
			}
		}
	}
	/**
	 * 游戏数据初始化
	 * @return
	 */
	private boolean initData()
	{
		//处理地图
		//找到人的行列
		findMan();
		map_row = 9;
		map_col = 9;
		map_x = (screenWidth - map_col*cell_width)/2;
		map_y = (screenHeight - map_row*cell_height)/2;
		//载入游戏图像
		mapImage = new Sprite(loadImage("newmap.png"),20,20);
		return true;
	}	
	/**
	 *判断当前关,是否结束 
	 */
	private boolean levelOver()			//结束本关函数
	{
		for(int i=0;i<9;i++)			//定义一个参数i
		{
			for(int j=0;j<9;j++)		//定义一个参数j
			{
				if (map[i][j]==3)		//担所有箱子被推到指定地点时
				{
					return false;
				}
			}
		}
		return true;
	}
	/**
	 * 判断是否能够向某个方向移动
	 * @param key 方向
	 * @return 是否
	 */	
	private boolean canMove(int key)
	{
		int r = man_row;	//定义一个参数r来存储man_row
		int c = man_col;	//定义一个参数c来存储man_col
		int r1 = man_row;	//定义一个参数r1来存储特殊man_row
		int c1 = man_col;	//定义一个参数c1来存储特殊man_col
		switch(key)			//判断按键
		{
		case LEFT_PRESSED:c--;c1--;c1--;break;	//当按下左键时
		case UP_PRESSED:r--;r1--;r1--;break;	//当按下上键时
		case RIGHT_PRESSED:c++;c1++;c1++;break;	//当按下右键时
		case DOWN_PRESSED:r++;r1++;r1++;break;	//当按下下键时
		}
		//人的前进方向是地板  或  目标位置
		if (map[r][c]==5||map[r][c]==2)
		{
		    return true;
		}
		//人的前进方向是箱子或特殊箱子
		if (map[r][c]==3 ||map[r][c]==10)
		{
			//箱子前进方向是地板
			if(map[r1][c1]==5)
			{
				return true;
			}
			//箱子前进方向是目标位置
			if(map[r1][c1]==2)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -