📄 boxgame.java
字号:
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import java.io.*;
/**
* 该类描述了游戏,提供了对方向键的处理功能。
*/
public class BoxGame extends GameCanvas implements Runnable {
private LayerManager manager; //游戏界面管理器
private Plat plat; //游戏地图
private Storage storage; //仓库
private Worker worker; //搬运工
private int level; //游戏关
private Graphics g; //绘图对象
private int screenWidth; //屏幕宽度
private int screenHeight; //屏幕高度
private int viewX; //仓库可视区域的位置
private int viewY;
private boolean stop = true; //
private Thread workerThread; //搬运工移动线程
private boolean workerMove = false;
private int stepNumber = 0; //搬运工每次移动的步数
//构造方法,创建游戏对象
public BoxGame() {
super(false);
g = getGraphics();
screenWidth = getWidth();
screenHeight = getHeight();
manager = new LayerManager();
plat = new Plat();
try { //加载图片,创建搬运工
Image workerImage = Image.createImage("/img/worker16.png");
worker = new Worker(workerImage, Storage.CELL_WIDTH, Storage.CELL_HEIGHT,
new int[][]{{3, 4, 5},{6, 7, 8},{9, 10, 11},{0, 1, 2}});
}
catch(IOException ioe) {
System.out.println("error: " + ioe.toString());
}
manager.append(worker);
//创建仓库
storage = new Storage(screenWidth/Storage.CELL_WIDTH, screenHeight/Storage.CELL_HEIGHT-2, manager);
worker.comeInto(storage);
level = 0;
stepNumber = Storage.CELL_WIDTH/Worker.DISTANCE;
}
//进入游戏下一关,如果i>0,进入后面的i关游戏;如果i<0,进入前面的i关游戏
public void nextLevel(int i) {
level += i;
level = plat.readLevel(level); //读取level关的数据
storage.update(plat); //使用plat更新仓库
//设置搬运工的初始状态
worker.setPosition(storage.getWorkerInitX(), storage.getWorkerInitY());
worker.updateBoxes();
//设置仓库居中显示
viewX = (screenWidth - storage.getViewWidth())/2;
viewY = (screenHeight - storage.getViewHeight())/2;
//清除以前屏幕显示内容
g.setColor(0x0000FFFF);
g.fillRect(0, 0, screenWidth, screenHeight);
//更新屏幕
updateGUI();
}
//游戏显示前,系统将调用该方法:初始化游戏
protected void showNotify() {
nextLevel(0);
stop = false;
workerThread = new Thread(this);
workerThread.start();
}
//游戏被从屏幕上移走后,系统马上调用该方法。
protected void hideNotify() {
stop = true;
}
//重新开始当前的游戏
public void restart() {
//设置箱子为初始状态
storage.setBoxesInit();
//设置搬运工到初始位置
worker.setPosition(storage.getWorkerInitX(), storage.getWorkerInitY());
updateGUI();
}
//键盘事件处理方法
protected void keyReleased(int keyCode) {
synchronized(worker) {
workerMove = true;
worker.notifyAll(); //通知搬运工移动
}
}
//更新游戏界面
public void updateGUI() {
manager.paint(g, viewX, viewY);
flushGraphics();
}
//搬运工移动线程的执行体
public void run() {
int direction = -2000;
int keyState = 0;
while(!stop) {
synchronized(worker) {
if(!workerMove) { //如果搬运工不能移动,线程等待
try {
worker.wait();
}
catch(InterruptedException ie) {
System.out.println("等待错误!");
}
}
direction = -2000;
keyState = getKeyStates(); //获取按键状态
if ((keyState & LEFT_PRESSED) != 0) {
direction = Worker.WEST;
}
else if ((keyState & RIGHT_PRESSED) != 0) {
direction = Worker.EAST;
}
else if ((keyState & UP_PRESSED) != 0) {
direction = Worker.NORTH;
}
else if ((keyState & DOWN_PRESSED) != 0) {
direction = Worker.SOUTH;
}
if(direction != -2000) {
for(int i=0; i<stepNumber; i++) { //搬运工移动
worker.move(direction);
updateGUI();
try {
Thread.sleep(60);
}
catch(InterruptedException ie) {
System.out.println("intrruptedException " + ie.toString());
}
}
}
workerMove = false;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -