4

为了提高我自己的编码技能,我最近一直在使用 JavaFx 2.0 用 Ja​​va构建这个游戏(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();
}

示例游戏截图

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

4

1 回答 1

6

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

在此处输入图像描述

在此处输入图像描述

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

希望这是有道理的。

类图

于 2012-11-11T14:34:36.233 回答