【问题标题】:JavaFx 2.0 block game animation / code designJavaFx 2.0 方块游戏动画/代码设计
【发布时间】:2012-11-11 00:26:46
【问题描述】:

为了提高自己的编码技能,我最近使用 JavaFx 2.0 在 Java 中构建了 this game(Block blaster) 版本。因为这只是为了我的利益,没有真正考虑软件模式或设计,所以所有的游戏逻辑最终都在 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

【问题讨论】:

    标签: design-patterns javafx-2


    【解决方案1】:

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

    当您按下阻止时,您应该通知您的控制器。这应该决定这是否是 Group 的一部分,如果是,则让 Group 着火? (我不熟悉术语)。然后应该给这个组中的块一个新的状态,例如 ON_FIRE。模型将通知所有观察者这些块现在是 ON_FIRE。一旦 View 获得此信息,您将执行 ON_FIRE 动画、折叠或其他任何操作。一旦完成这应该对应于timeLine.onFinnish,您现在调用控制器中的下一个方法,例如completedBurning。这现在将负责清理并间接触发新事物。

    希望这是有道理的。

    【讨论】:

    • 在我链接的游戏中,用户从屏幕底部的启动器中触发块,而不是单击块来清除组。这意味着视图不能做任何初始动画,只是将这个“火块”命令传递给控制器​​。我目前这样做的方式是控制器在启动器下创建块,然后将其移动到下一个可用空间。然后我尝试让视图为该视图设置动画,这就是我遇到问题的地方,因为一旦移动块,我需要检查组,但我似乎无法等待动画完成。
    • 我来玩的游戏是熊猫果酱。当您单击一个块/正方形/单元格并且它至少与其他块相邻时,该组会折叠。在这些游戏中,新的块会以较短的固定间隔添加到底部,一旦水平线完成,一切都会向上移动。也许你可以给出游戏名称和截图以避免融合,似乎那里不止一个游戏。我将添加我认为您链接到的游戏的屏幕截图...无论哪种方式,我都理解正确,您应该等待动画完成,然后他们调用 Controller 上的方法来发出信号。
    • 我确实在原始帖子中包含了游戏的链接,但我现在在其旁边添加了游戏的名称和屏幕截图。很抱歉造成的混乱。我应该能够将你给我的 UML 和答案调整到我的游戏中,所以我会将这个答案标记为已接受,如果我提出另一个问题,我会再次在这里发表评论。感谢您的帮助。
    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2023-01-27
    • 2010-10-11
    相关资源
    最近更新 更多