JavaFx 2.0块游戏动画/代码设计

Lig*_*ing 4 design-patterns javafx-2

为了保持自己的编码技能,我最近使用JavaFx 2.0在Java中构建了这个游戏版本(Block blaster).因为它只是为了我的利益而没有真正想到软件模式或设计所以所有的游戏逻辑最终都在GUI类中,随着我添加的功能变得越来越臃肿.我最终决定重构代码库,将游戏逻辑和模型与表示(GUI)分开.

经过一些研究后,我决定使用像MVC或MVP这样的东西.在这样做的过程中,我决定动画(阻止在游戏时向上滑动游戏网格,阻止从游戏中移除时闪烁等等)是视图层的一部分.

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

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

有没有办法等待JavaFx动画完成(没有睡眠应用程序线程)或者我应该使用哪种设计模式有助于避免这些问题?

控制器代码

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();
}
Run Code Online (Sandbox Code Playgroud)

示例游戏的屏幕截图

示例游戏图片http://m2.myhappygames.com/files/pics/2/Block-Blaster-6-2787.jpg

Skj*_*alg 6

好的,所以这是匆忙完成的,但是假设一个Block是你按的方块,而Group是一个3个或更多相邻块的集合,颜色与我的绘图相同,那么你遇到的麻烦就是你用同样的方法做得太多了.

在此输入图像描述

在此输入图像描述

当你按下一个块时,你应该通知你的控制器.这应该决定这是否属于集团的一部分,如果是这样,该集团是否会被解雇?(我不熟悉终结).然后应该为该组中的块赋予新状态,例如ON_FIRE.模型将通知所有观察者这些块现在是ON_FIRE.一旦View获取此信息,您将执行ON_FIRE动画,崩溃或其他任何操作.一旦完成这应该对应于timeLine.onFinnish,您现在调用Controller中的下一个方法,例如completedBurning.现在,这将负责清理和间接触发新事物.

希望这是有道理的.

类图