当前位置: 首页 > 知识库问答 >
问题:

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

松增
2023-03-14

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

经过一些研究,我决定使用类似MVC或MVP的东西。在这样做的时候,我决定动画(当被激发时块在游戏网格上滑动,块在从游戏中移除时闪烁,等等)是视图层的一部分。

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

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

是否有一种方法可以等待JavaFx动画完成(而不让应用程序线程处于Hibernate状态),或者我应该使用一种不同的设计模式来帮助避免这些问题?

来自控制器的代码

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();
}

样例游戏截图

共有1个答案

洪博艺
2023-03-14

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

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

希望这有道理。

 类似资料:
  • 本文向大家介绍iOS 动画实战之钓鱼小游戏实例代码,包括了iOS 动画实战之钓鱼小游戏实例代码的使用技巧和注意事项,需要的朋友参考一下 前言 最近写了一款钓鱼小游戏,自己平时也没做过游戏,本来以为这种游戏要用cocos2d什么的实现,后来发现其实动画就可以实现很棒的效果,先看看效果图。 思维导图 首先我们看下思维导图,本游戏主要分为4大块,其中鱼的实现最为复杂 思维导图 项目结构 准备工作 首先将

  • 本文向大家介绍java编写的简单移动方块小游戏代码,包括了java编写的简单移动方块小游戏代码的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java编写的简单移动方块小游戏代码。分享给大家供大家参考,具体如下: 运行效果截图如下: 第一次用java编写图形化的界面,还是有些青涩。。以后继续努力!!具体代码如下: 希望本文所述对大家Java程序设计有所帮助。

  • 我有一个动画块来执行一个简单的基于变换的动画,在完成时从它的超级视图中删除有问题的视图。 然后我使用Tech Q详述的代码 但是,此代码不会阻止完成代码的执行。因此,为了防止代码执行,我将完成代码更改为: 当检查finished==TRUE时,动画块暂停时,将阻止执行完成代码。如果在“取消暂停”动画之前超过持续时间,则不会执行完成代码。即在本例中,msgView仍保留在superview中。 是否

  • "层"的概念 一个游戏里面包含了许多个元素,包括图片、声音、对象模型、相关数据(比如"游戏得分")、方向行为控制等等。游戏编程的实质就是把这些元素按照剧本有序的组合在一起,把这些元素“可控“化。 跟影视制作一样,游戏的每一个场景里面都有"背景"、"主角"、"配角"、"路人甲乙丙丁"、"道具"等。在影视拍摄中,导演指挥剧务布置场景,指挥演员按剧本表演动作和对话,后期制作中加入各种道具使用时产生的特效

  • 本文向大家介绍python贪吃蛇游戏代码,包括了python贪吃蛇游戏代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python贪吃蛇游戏的具体代码,供大家参考,具体内容如下 贪吃蛇游戏截图: 首先安装pygame,可以使用pip安装pygame: pip install pygame 运行以下代码即可: 操作方法: 上下左右键或wsad键控制 ESC键退出游戏 下载代码:贪吃

  • 问题内容: 我正在用Java创建我的第一个游戏。游戏是大富翁。我在如何设计游戏以模拟其基于回合的结构(管理玩家回合)方面感到困惑。我想允许一个人控制和一个或多个AI控制的玩家玩游戏。 我的具体问题是,我不知道是否实施游戏循环,即可以管理玩家和与大富翁游戏直接相关的变量的循环(例如,提示每个玩家轮到他们,增加回合到下一个玩家的回合,或依次让每个玩家掷骰子)。我指的不是“游戏循环”这个词的更底层含义,