TaskScheduler не может добавлять узлы - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь сделать игру со змеями и использую мою реализацию 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++;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...