Я пытаюсь сделать игру со змеями, и я довольно новичок в использовании JavaFX. Проблема, с которой я сталкиваюсь, заключается в том, что когда я использую оператор switch для изменения направления на основе клавиш со стрелками, прямоугольник будет перемещаться только при нажатии клавиши. Я хочу, чтобы прямоугольник продолжал двигаться в направлении, пока не нажата другая клавиша. Я уверен, что это легко исправить, извините, я все еще новичок в кодировании и javaFX.
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Mess extends Application {
private Stage window;
private final int WIDTH = 500;
private final int HEIGHT = 500;
private Direction snakeDir = Direction.RIGHT;
private int snake_W = 20;
private int snake_H = 20;
private Rectangle snake = new Rectangle(snake_W, snake_H);
private boolean running;
private boolean snakeUp = false;
private boolean snakeRight = true;
private Timeline timeLine = new Timeline();
enum Direction {
LEFT,RIGHT,UP,DOWN,NONE;
}
private Parent createContent() {
Pane root = new Pane();
root.setPrefSize(WIDTH,HEIGHT);
snake.setTranslateX((WIDTH / 4) - (snake.getWidth() / 2));
snake.setTranslateY(HEIGHT / 6);
KeyFrame keyFrame = new KeyFrame(Duration.millis(16), e -> {
if(!running) {return;}
switch(snakeDir) {
case UP:
snake.setTranslateX(snake.getTranslateX());
snake.setTranslateY(snake.getTranslateY() - 4);
break;
case DOWN:
snake.setTranslateX(snake.getTranslateX());
snake.setTranslateY(snake.getTranslateY() + 4);
break;
case LEFT:
snake.setTranslateX(snake.getTranslateX() - 4);
snake.setTranslateY(snake.getTranslateY());
break;
case RIGHT:
snake.setTranslateX(snake.getTranslateX() + 4);
snake.setTranslateY(snake.getTranslateY());
break;
}
});
timeLine.getKeyFrames().add(keyFrame);
timeLine.setCycleCount(Animation.INDEFINITE);
root.getChildren().addAll(snake);
return root;
}
private void startGame() {
running = true;
timeLine.play();
}
private void stopGame() {
timeLine.stop();
running = false;
}
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
window = primaryStage;
Scene mainScene = new Scene(createContent(),WIDTH,HEIGHT);
mainScene.setOnKeyPressed(e -> {
switch(e.getCode()) {
case UP:
snakeDir = Direction.UP;
break;
case DOWN:
snakeDir = Direction.DOWN;
break;
case LEFT:
snakeDir = Direction.LEFT;
break;
case RIGHT:
snakeDir = Direction.RIGHT;
break;
}
});
mainScene.setOnKeyReleased(e -> {
switch(e.getCode()) {
case UP:
case DOWN:
case LEFT:
case RIGHT:
snakeDir = Direction.NONE;
break;
}
});
window.setTitle("Snake");
window.setScene(mainScene);
window.show();
startGame();
}
}
Я ожидаю, что прямоугольник будет непрерывно двигаться в направлении нажатой клавиши со стрелкой. Фактический результат - при нажатии клавиши она перемещается один раз и останавливается.