JavaFX 2.0块状游戏动画/代码设计

4
为了保持我的编程技能,最近我用Java和JavaFx 2.0构建了一个版本的这个游戏(Block blaster)。由于只是为了自己的利益,所以没有考虑软件模式或设计,因此所有的游戏逻辑都在GUI类中,随着功能的增加,GUI类变得越来越臃肿。最后,我决定重构代码库,将游戏逻辑和模型与表示(GUI)分离。
经过一些研究,我决定使用类似MVC或MVP的东西。在这样做时,我决定动画(块在发射时向上滑动,块在从游戏中移除时闪烁等)应该成为视图层的一部分。
这会导致的问题是,当用户启动一个块时,控制器告诉视图移动块,它会为动画创建JavaFx timeline并调用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();
}

示例游戏截图

示例游戏图片
(来源: myhappygames.com)

1个回答

6

好的,虽然这是匆忙完成的,但假设块是您按下的正方形,而组是具有与我的绘图相同颜色的3个或更多相邻块的集合,则您遇到的问题在于您在同一个方法中执行了太多操作。

enter image description here

enter image description here

当您按下块时,应通知您的控制器。这应该决定是否属于组,如果是,则将该组放入on fire状态?(我不熟悉术语)。然后,应为此组中的块提供新状态,例如ON_FIRE。模型将通知所有观察者,这些块现在处于ON_FIRE状态。一旦视图获取此信息,您将执行ON_FIRE动画,折叠或其他操作。完成此操作后,应对应timeLine.onFinnish,现在调用控制器中的下一个方法,例如completedBurning。这将负责清理和间接触发新事物。

希望这有意义。

Class diagram


在我链接的游戏中,用户不是通过点击方块来清除组,而是从屏幕底部的发射器发射方块。这意味着视图不能进行任何初始动画,只需将此“发射方块”命令传递给控制器。我目前的做法是控制器在发射器下创建方块,然后将其移动到下一个空闲空间。然后我尝试让视图对此视图进行动画处理,这就是我遇到问题的地方,因为一旦方块移动,我需要检查组,但似乎无法等待动画完成。 - Lightning
我玩的游戏是熊猫果酱。当你点击一个方块/正方形/单元格并且它与至少两个相邻的方块相连时,这一组方块就会消失。在这个游戏中,新的方块会以短而规律的时间间隔从底部添加,一旦水平线条完成,所有方块都会向上移动。也许你可以给出游戏的名称和截图以避免混淆,因为似乎有不止一个游戏。我会添加我认为你链接的游戏的截图...无论如何,如果我理解正确,你应该等待动画完成,然后调用控制器上的方法来发出信号。 - Skjalg
我在原帖中包含了游戏链接,但现在我已经添加了游戏名称和截图。对造成的混淆感到抱歉。我应该能够将您给我的UML和答案适应到我的游戏中,因此我将标记此答案为已接受,如果我有另一个问题,我会再次在这里评论。谢谢您的帮助。 - Lightning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接