2014-02-04 2 views
0

Я работаю над разработкой игр 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; 
    } 
} 
} 
+3

Ошибка, вероятно, находится в строке 106. Но я не могу быть уверен, так как вы не вставляли какой-либо код. –

ответ

0

я думаю следующую проблема: Вы никогда не закончив .. в то время как петля

эмулятор и устройство обработки потоков, то процессы по-разному Возможно ваша вводная нить занимает все время на устройстве

Попробуйте, например, следующие.:

while (true){ 
    if(!stop){ 
     .... 
    } 
    else { 
     endGame(); 
     return; 
    } 
}