Design patterns JavaFX2.0方块游戏动画/代码设计

Design patterns JavaFX2.0方块游戏动画/代码设计,design-patterns,javafx-2,Design Patterns,Javafx 2,为了提高自己的编码技能,我最近一直在使用JavaFX2.0在Java中构建(Block blaster)版本。因为这只是为了我的利益,没有真正考虑软件模式或设计,所以所有的游戏逻辑最终都在GUI类中,随着我添加功能,GUI类变得越来越臃肿。我最终决定重构代码库,将游戏逻辑和模型与表示(GUI)分离 经过一些研究,我决定使用MVC或MVP之类的东西。在这样做的过程中,我决定将动画(射击时向上滑动游戏网格的块、从游戏中移除时闪烁的块等)作为视图层的一部分 这导致的问题是,当用户启动一个块并且控制器告

为了提高自己的编码技能,我最近一直在使用JavaFX2.0在Java中构建(Block blaster)版本。因为这只是为了我的利益,没有真正考虑软件模式或设计,所以所有的游戏逻辑最终都在GUI类中,随着我添加功能,GUI类变得越来越臃肿。我最终决定重构代码库,将游戏逻辑和模型与表示(GUI)分离

经过一些研究,我决定使用MVC或MVP之类的东西。在这样做的过程中,我决定将动画(射击时向上滑动游戏网格的块、从游戏中移除时闪烁的块等)作为视图层的一部分

这导致的问题是,当用户启动一个块并且控制器告诉视图移动该块时,它会为动画创建JavaFx
timeline
,并调用
timeline.play()
。这样做不会导致程序流在动画发生时暂停在视图中,因此view方法在刚开始动画时返回,这意味着控制器将继续检查块是否已生成一组块,如果是,则在移动动画到达任何位置之前将其移除

在旧的(讨厌的)实现中,我使用
timeline.onFinish
调用块组检查,动画完成后,但是由于
timeline
现在在视图中,并且控制器中的检查功能,我不知道如何在我的新设计中使用它

是否有一种方法可以等待JavaFx动画完成(而不休眠应用程序线程),或者是否有一种不同的设计模式可以帮助我避免这些问题

来自控制器的代码

示例游戏的屏幕截图



(来源:)

好的,这是匆忙完成的,但是假设一个块是您按下的正方形,并且组是3个或更多相邻块的集合,这些块的颜色与我的图形中的颜色相同,那么您遇到的麻烦是,您用相同的方法做的太多了

当您按下块时,应通知控制器。这应该决定这是否是一个团体的一部分,如果是的话,是不是让这个团体着火?(我不熟悉术语)。然后,该组中的块应被赋予新状态,例如ON_FIRE。该模型将通知所有观察者,这些区块现在着火。一旦视图获得此信息,您将执行ON_FIRE动画、折叠或其他操作。完成此操作后,应与
时间线相对应。onfinish
,现在调用控制器中的下一个方法,例如
completedBurning
。这将负责清理并间接触发新事物

希望这是有意义的


在我链接到的游戏中,用户没有单击块来清除组,而是从屏幕底部的发射器中发射块。显然,这意味着视图不能进行任何初始动画,只需将此“fire block”命令传递给控制器。我目前的做法是,控制器在启动器下创建块,然后将其移动到下一个可用空间。然后,我尝试获取视图来设置此视图的动画,这就是我遇到问题的地方,因为一旦块移动,我需要检查组,但我似乎迫不及待地等待动画完成。我参加的游戏是熊猫果酱。当您单击一个块/正方形/单元并且该块/正方形/单元至少与其他块相邻时,该组将折叠。在thos游戏中,新的方块以很短的规则间隔添加在底部,一旦水平线完成,所有东西都会向上移动。也许你可以给出游戏的名称和一个截图来避免onfusion,看起来这里有不止一个游戏。我将添加一个我以为你链接到的游戏的屏幕截图。。。不管怎样,我理解正确,你应该等待动画完成,然后他们在控制器上调用一个方法来发出信号。我确实在原始帖子中包含了一个游戏链接,但现在我在旁边添加了游戏名称和屏幕截图。很抱歉造成混乱。我应该能够将你给我的UML和答案应用到我的游戏中,所以我会将这个答案标记为接受,如果我提出另一个问题,我会在这里再次评论。谢谢你的帮助。
public void fire()
{   
    //Get the current column the launcher is in.
    int x = launcher.getX(), startY = launcher.getY();
    //Find the next available block in the column.
    int endY;
    for(endY = h; endY > 0 && blockMap[endY - 1][x] == null; endY--){}

    //Create a new block of the same colour and location as that on the launcher.
    addBlock(x, launcher.getY(), getCurrentColourAndRotate());
    //Move the block in the GUI and model (this will trigger the animation in the GUI)
    moveBlock(x, startY, x, endY);

    //Remove any block groups that have been made.
    checkBlock(blockMap[endY][x]);
    //Remove any blocks now not connected to the top of the game grid
    removeUnconnectedBlocks();
}