我正在尝试使用 JavaFX 编写 2048 游戏,但遇到了问题。
@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 个随机填充其中两个),显示它并开始监听按键。这个想法是为每个箭头键(UP DOWN LEFT RIGHT)设置一个行为,这将相应地移动图块。这是通过以下 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;
}
现在的问题是:当应用程序运行时,如果我按下向下箭头,我会在我的终端上得到“received DOWN”文本,就像我按预期那样多次按下键。但是如果我按下向上箭头,应用程序只会收到一次,并且应用程序似乎被冻结(这意味着如果我再次按下,什么也不会发生)。正如您可能猜到的那样,我希望能够为每次按键调用我的方法,以便能够移动我的图块并最终将它们组合在一起以获得可播放的 2048 版本......有人知道我的应用程序为什么会冻结吗?
如果需要,我可以提供其他代码,但我认为我提供了必要的。只需知道 firstContent() 现在的工作原理与 createContent 基本相同,只是它生成两个随机数来获取游戏的第一个图块。
在此先感谢您的帮助。