Я пытаюсь кодировать игру 2048 с использованием JavaFX, и у меня возникла проблема.
@Override
public void start(Stage primaryStage){
primaryStage.setResizable(false);
Scene scene = new Scene(firstContent());
primaryStage.setScene(scene);
primaryStage.show();
scene.setOnKeyPressed(new EventHandler<KeyEvent>(){
@Override
public void handle(KeyEvent e){
KeyCode key = e.getCode();
if((key.equals(KeyCode.UP))){
System.out.println("recieved UP");
Scene scene = new Scene(createContent());
primaryStage.setScene(scene);
primaryStage.show();
} else if(key.equals(KeyCode.DOWN)){
System.out.println("recieved DOWN");
}
}
});
}
Итак, я открываю свое окно, инициализированное firstContent (в основном оно создает массив пустых плиток и заполняет два из них 2 или 4 случайным образом), отображаю его и начинаю прослушивать нажатия клавиш. Идея состоит в том, чтобы иметь поведение для каждой клавиши со стрелкой (ВВЕРХ ВНИЗ ВЛЕВО ВПРАВО), которая будет соответственно перемещать плитки. Это делается с помощью следующего метода createContent ():
public Parent createContent(){
String c = "";
List<Integer> known = new ArrayList<Integer>();
Pane root = new Pane();
root.setPrefSize(740, 700);
Random rand = new Random();
int pos1 = rand.nextInt(15);
if(tiles.get(pos1) != new Tile("")){
known.add(pos1);
pos1 = rand.nextInt(15);
if(known.contains(pos1)){
known.add(pos1);
pos1 = rand.nextInt(15);
}
}
for(int i = 0; i < NB_TILES; i++){
tiles.add(new Tile(c));
}
tiles.set(pos1, new Tile("2048"));
for(int i = 0; i < tiles.size(); i++){
// boring stuff to set the tile display to the right size
}
return root;
}
Теперь о проблеме: при запуске приложения, если я нажимаю стрелку вниз, я получаю на своем терминале текст «получен ВНИЗ» столько раз, сколько нажимаю клавишу, как и ожидалось. Но если я нажму стрелку вверх, приложение получит его только один раз, и приложение будет заморожено (то есть, если я нажму снова, ничего не произойдет).
Как вы могли догадаться, я хочу иметь возможность вызывать свой метод для каждого нажатия клавиши, чтобы иметь возможность перемещать свои плитки и полностью комбинировать их, чтобы получить играбельную версию 2048 ... Кто-нибудь знает, почему мое приложение зависает?
При необходимости я могу предоставить другие фрагменты кода, но я думаю, что предоставил основные. Просто знайте, что firstContent () сейчас работает в основном так же, как createContent, за исключением того, что он генерирует два случайных числа, чтобы получить первые плитки игры.
Заранее спасибо за помощь.