📄 boxesworker.java
字号:
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 + -