gameUpdate
выполняется в потоке приложения JavaFX. Это означает, что любая задержка возврата этого метода просто останавливает графический интерфейс, пока метод не вернется. По этой причине те
for(int i=0;i<150000;i++) {
gc.drawImage(k, current.getXlocation(), current.getYlocation());
timer.stop();
}
петли не работают.
Самый простой способ «приостановить» здесь - сэкономить время, в течение которого AnimationTimer
разрешено продолжать.
timer = new AnimationTimer() {
@Override
public void handle(long arg0) {
gameUpdate(arg0);
}
};
private long pauseEnd = 0L;
/**
* Continue updates after a certain number of milliseconds after the current time
*/
private void pauseFor(long currentTime, long durationMillis) {
pauseEnd = currentTime + 1_000_000L * durationMillis;
}
public void gameUpdate(long timestamp) {
if (timestamp >= pauseEnd) { // only redraw, if not paused
...
//for(int i=0;i<150000;i++) {
// gc.drawImage(k, current.getXlocation(), current.getYlocation());
// timer.stop();
//}
//timer.start();
//itr.remove();
//score++;
gc.drawImage(k, current.getXlocation(), current.getYlocation());
itr.remove();
score++;
pauseFor(timestamp, 3000); // start updates again in 3000 ms
...
}
}
Кроме того, вы заменяете EventHandler
для каждого игрового объекта на каждой итерации игрового цикла. Таким образом, только один игровой объект проверяется на пересечение с мышью. Вам нужно проверить их все с помощью одного обработчика событий. Помимо удаления регистрации обработчика событий из метода gameLoop
, добавьте следующий код в метод start
, чтобы проверить все объекты на предмет пересечений:
canvas.setOnMousePressed(event -> {
for (IGameObject current : drop) {
if(current.insideBounds(event.getX(), event.getY())) {
current.slice();
}
}
});
Кроме того, я настоятельно рекомендую не конвертировать BufferedImage
s в каждой итерации игрового цикла снова и снова. Предпочтительно заменить BufferedImage
s непосредственно на JavaFX Image
s или оставить Map<BufferedImage, Image>
, содержащий каждый результат преобразования ...