0

我正在尝试使用 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 基本相同,只是它生成两个随机数来获取游戏的第一个图块。

在此先感谢您的帮助。

4

0 回答 0