Я работаю над разработкой игр JavaME и использую LG500G и Motorola EM326g в качестве тестовых устройств. На этом очень раннем этапе все идет не так. У меня есть (! Stop) {} игровой цикл, и в определенный момент метод установит stop на true, который войдет в блок кода после цикла while, что-то вроде условия конечной игры. Это всегда отлично работает в эмуляторе, различными способами, которые я выразил. Тем не менее, я никогда не мог заставить его работать на любом из телефонов. Вместо этого игра замерзает, и никакой дальнейшей активности не происходит. Непонятная вещь заключается в том, что когда я компилирую код из других игр, которые я изучил, которые используют один и тот же механизм циклирования, эти игры работают так, как ожидалось! Что я могу делать неправильно? Есть ли способ перефразировать код, чтобы заставить его работать? В настоящее время я смотрю на «диспетчер игрового состояния» как возможное решение ... но что-то простое, как это должно сработать! (Кстати, я пробовал простой цикл (! Stop) {}, но мне пришлось попробовать . если (! остановка) {} еще {} блокировать в то время как (истинный) цикл Она не работает на телефонах либо:Выход из цикла игры в системе JavaME freezes
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;
}
}
}
Ошибка, вероятно, находится в строке 106. Но я не могу быть уверен, так как вы не вставляли какой-либо код. –