我正在开发JavaME游戏,我正在使用LG500G和摩托罗拉EM326g作为测试设备。在这个很早的阶段,事情就出错了。我有一段时间(!stop){}游戏循环,并且在某个时刻,一个方法将stop设置为true,这将在while循环之后输入一段代码,这是一种最终游戏条件。这总是在模拟器中正常工作,以我表达的各种方式。但是,我从来没有能够让它在任何一部手机上工作。相反,游戏冻结,没有进一步的活动发生。令人困惑的是,当我编译其他游戏的代码时,我研究了哪些使用相同的循环机制,这些游戏按预期运行!我能做错什么?有没有一种方法可以重新编写代码以使其工作?我目前正在寻找一个“游戏状态管理器”作为一种可能的解决方案...但是这样简单的东西应该可行!(顺便说一下,我尝试了一个简单的while(!stop){}循环,但不得不尝试while(true)循环中的if(!stop){} else {}块。它在手机上也不起作用:
import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.*;
public class GardenGameCanvas extends GameCanvas implements Runnable{
private Image tomato;
private Sprite tomatoSprite;
private boolean stop;
private int tomX;
private int tomY;
private LayerManager manager;
public GardenGameCanvas(){
super(false);
}
public void start() {
try{
tomato = Image.createImage("/tomato.png");
tomatoSprite = new Sprite(tomato, 16, 16);
tomX= 0;
tomY = getHeight()/2;
manager = new LayerManager();
manager.append(tomatoSprite);
stop = false;
}catch(IOException ioex){System.err.println(ioex);}
Thread runner = new Thread(this);
runner.start();
}
public void run() {
while(true){
if(!stop){
verifyGame();
checkInput();
update(getGraphics());
try {
Thread.currentThread().sleep(30);
} catch(Exception e) {}
}else{
endGame(getGraphics());
}
}
}
private void update (Graphics g){
g.setColor(0xFFFFFF); //white
g.fillRect(0, 0, getWidth(), getHeight());
buildGame(g);
tomatoSprite.setPosition(tomX, tomY);
manager.paint(g, 0, 0);
flushGraphics();
}
private void buildGame(Graphics g){
g.setColor(0x000000);
g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2);
}
private void checkInput(){
int keyStates = getKeyStates();
if((keyStates & LEFT_PRESSED) != 0) {
tomX -= 1;
}
else if((keyStates & RIGHT_PRESSED) != 0) {
tomX += 1;
}
}
private void endGame(Graphics g){
g.setColor(0xFFFFFF);
g.fillRect(0,0,getWidth(), getHeight());
g.setColor(0x000000);
g.drawString("Game Over", getWidth()/2, getHeight()/2, Graphics.HCENTER);
flushGraphics();
}
private void verifyGame(){
if(tomX==getWidth()){
stop = true;
return;
}
}
}
答案 0 :(得分:0)
我认为以下是问题所在: 你永远不会结束while循环。
仿真器和设备以不同的方式处理线程。您的运行线程可能会占用设备上的所有时间。
尝试以下示例:
while (true){
if(!stop){
....
}
else {
endGame();
return;
}
}