При написании своей первой игры на J2ME (2D платфомера), столкнулся вот с такой вот проблемой:
При нажатии кнопки Вверх на клавиатуре персонаж должен прыгать... Ну он прыгает... Но при втором нажатии кнопки - прыгать он уже отказывется и игра зависает..
Код прыжка у меня осуществляется при запуске треда в отдельном классе.. Получается тогда так что при первом прыжке был запущен тред, но при нажатии на кнопку прыжка второй раз метод снова пытается запустить тред (который уже ясно что он не был остановлен по какой то причине)..
Приведу полный листинг класса, где осуществляется прыжок:
import javax.microedition.lcdui.game.Sprite;
public class JumpThread implements Runnable {
public static final int DELAY = 10; // задержка
private boolean isJumpB = false;
private Thread thread = new Thread(this);
private GCanvas gCanvas; // холст для отрисовки
private Sprite sprite; // спрайт, который должен прыгать
private int isJumping;
private int noJump = GCanvas.JUMP_VALUE;
public JumpThread(GCanvas gCanvas, Sprite sprite) {
this.gCanvas = gCanvas;
isJumping = noJump;
this.sprite = sprite;
}
/**
* Прыгнуть...
*/
public void jumping() {
if (isJumping == noJump) {
isJumpB = true;
thread.start();
isJumping++;
System.out.println("Вызван jumping...");
}
}
private void stop() {
isJumpB = false;
//thread.interrupt();
}
public void run() {
System.out.println("Нить прыжка запущена...");
while (isJumpB) {
// если не равно, то прыгаем
if (isJumping != noJump) {
isJumping++;
if (isJumping < 0) {
// Персонаж движется вверх..
sprite.setRefPixelPosition(sprite.getRefPixelX(), sprite.getRefPixelY()-(2<<(-isJumping)));
} else {
// персонаж падает вниз
if (isJumping != -noJump - 1) {
sprite.setRefPixelPosition(sprite.getRefPixelX(), sprite.getRefPixelY() + (2<<isJumping));
} else {
// Прыжок завершен переводим персонажа в пешеходное состояние
isJumping = GCanvas.JUMP_VALUE;
sprite.setRefPixelPosition(sprite.getRefPixelX(), 179);
}
}
} else {
// остановить выполнение треда
stop();
}
try {
Thread.sleep(DELAY);
} catch (InterruptedException e) {
System.out.println(getClass().getName()+" - "+e.getMessage());
}
}
}
}
Метод
jumping вызывается при нажатии клавиши Вверх:
if ((keyStates & UP_PRESSED) != 0) {
if (lastDirection != UP) {
lastDirection = UP;
//gnomeSprite.setFrameSequence(sGnomeSequence);
gnomeSprite.setTransform(Sprite.TRANS_NONE);
// jump...
jt.jumping(); // прыгаем...
continue;
}
}
jt - класс прыжка...
Как мне заставить остановить выполнение треда прыжка?