Я пытаюсь сделать игру со змеями и использую мою реализацию ScheduledService для перемещения прямоугольников, чтобы имитировать движение.
Проблема в том, что ScheduledService, похоже, испытывает проблемы с добавлением новых узлов. Чтобы проверить, не ошибаюсь ли я, я попытался добавить огромный прямоугольник во время выполнения, и все окно не обновляется (когда я удаляю строку об этом прямоугольнике, змея все еще движется, но еда не видна). Как мне убедиться, что эта задача добавляет узел в мою сцену?
Я попробовал свои методы без параллелизма, и все работает нормально.
public class GameLoop extends ScheduledService {
GameScene scene;
Square first;
Direction direction;
GameLoop(GameScene scene){
this.scene=scene;
setPeriod(new Duration(150));
}
@Override
protected Task createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
if(!gameOver()){
if (scene.getSnake().move(direction, scene.getFood())) {
scene.placeFood();
return null;
}
}else{
System.out.println("game over");
cancel(false);
}
return null;
}
};
}
public void setDirection(Direction direction){
this.direction=direction;
}
}
public class GameScene extends Scene {
private Snake snake;
private Square food;
private Pane pane;
int i=0;
//======================================================================
GameScene(double x, double y, Pane pane){
super(pane, x, y);
this.pane=pane;
pane.setBackground(new Background(new BackgroundFill(Color.BLACK, null, null)));
snake=new Snake(x, y);
placeFood();
pane.getChildren().add(snake);
}
//=====================================================================
public void placeFood(){
//If i add this the whole window freezes
/*
if(i>0) {
pane.getChildren().add(new Rectangle(100, 100, Color.BLUE));
}
*/
food=new Square(10, 10, Color.RED);
System.out.println(food.hashCode());
System.out.println("Setting new Food");
do {
food.setX(DataViability.roundTen(Math.random() *this.getWidth() - 10));
food.setY(DataViability.roundTen(Math.random()*this.getHeight() - 10));
}while(snake.onSnake(food, true));
System.out.println("Broke out");
pane.getChildren().add(food);
// This sout doesnt appear on the console when adding food in a GameLoop
System.out.println("Set food at : " + food.getX() + " " + food.getY());
i++;
}