代码之家  ›  专栏  ›  技术社区  ›  Zarkonnen

模型离散时如何处理状态间动画

  •  8
  • Zarkonnen  · 技术社区  · 16 年前

    我的程序中的数据模型有许多离散状态,但我想动画在这些状态之间的转换。当动画正在进行时,用户在屏幕上看到的内容与底层数据的外观断开连接。一旦动画完成,它们就会重新匹配。

    例如,假设我们有一个简单的游戏,在这个游戏中,小兔子在二维网格上跳来跳去。snuffles模型包含整数x/y坐标。当玩家告诉鼻烟往北跳时,他的Y坐标立即递减一个。然而,在屏幕上,那个时候的鼻烟应该还在他原来的位置。然后,一帧一帧地,鼻烟继续跳到他的新位置,直到他显示在他的模型状态的位置。

    所以通常,当我们画鼻烟时,我们可以在他的模型中查找他的坐标。但当他跳的时候,这个坐标是错误的。

    如果屏幕上只有一个东西在移动,我就可以把整个游戏状态冻结起来,直到snuffles完成跳跃后才允许用户做任何事情。但是如果屏幕上有多只兔子呢?

    如果元素交互、合并或拆分,情况会更糟。如果鼻烟神奇地与帽子合并成土豆,那么数据模型在哪一点上删除兔子和帽子,并添加土豆?如果它立即这样做,视图会立即失去对有关鼻烟和土豆的信息的访问,而这些信息仍然需要绘制魔法合并的动画。

    我在实现动画图形用户界面(尤其是游戏)时多次遇到这个问题,但没有找到令人满意的解决方案。

    不满意的包括:

    • 立即进行更改,然后暂停模型中的任何进一步更改,直到动画解决为止。使事物无反应,如果有多个事物可以移动或以复杂的方式交互,则不起作用。

    • 合并模型和视图-snuffles获得浮点坐标,可能是一个z坐标来指示他在上多远。因此,模型的规则变得非常复杂,因为模型不能再做出像“如果(x,y-1)处有墙,就不能向北跳”这样简洁的陈述。对规则的任何更改都需要更长的时间,并且开发速度会变慢。

    • 保留视图中数据的副本。snufflesModel有整数坐标,但snufflesPrite有浮点坐标。最后会复制视图中的一些模型规则,并使它们保持同步。花大量的时间调试,以确保在一些罕见的情况下,鼻烟和鼻烟的价格不同步。

    目前我的最佳选择是选项3,但它几乎没有给我留下优雅的印象。思想?

    1 回复  |  直到 16 年前
        1
  •  7
  •   Oren Trutner    16 年前

    您需要一个更强大的模型来解释变化的时间组成部分:

    1. 每个精灵需要维护一个它应该执行的动画动作队列。向队列中添加动画应该是零时间操作(游戏时间)。当排队的动画从动画时钟中得到一个勾号时,它们将逐帧进行。通过排队,可以将模型与图形子系统和动画分开。

    2. 队列中的每个动画都带有一个模型操作,在动画完成时执行。有些语言使这变得更容易,例如使用C或JavaScript中的匿名函数。在其他语言中,您可以使用回调。“模型”操作允许您指定当动画完成时模型将如何更改。

    3. 精灵可以携带高分辨率坐标(例如浮点),而模型保持为整数。但是精灵不需要知道任何关于游戏规则的信息——排队的动画完成模型操作可以处理这个问题。

    4. 模型实体应该能够解释过渡状态:出现、消失和移动。这样可以避免检查转换中对象的规则。

    要执行snuffle的任务,您可以:

    • 用户要求将鼻烟往北移动?-(1)检查规则是否允许移动,(2)队列A 移动动画 在松露的雪碧上,再加上 着陆 模型动作。使兔子的模型进入过渡运动状态。

    • Snuffle 着陆 模型操作将兔子的模型恢复到正常状态,并检查着陆点和规则。找到一顶帽子,它将土豆外观动画(“合并”)和兔子和帽子的两个消失动画排成一列。

    • 消失动画的模型操作完成后会删除兔子和帽子。