当模型是离散的时,如何处理中间状态的动画

Zar*_*nen 8 model-view-controller graphics animation data-structures

我的程序中的数据模型有许多离散状态,但我想为这些状态之间的转换设置动画.当动画正在进行时,用户在屏幕上看到的内容与基础数据的内容断开连接.动画完成后,它们会再次匹配.

例如,假设我们有一个简单的游戏,其中Snuffles兔子在2D网格上跳跃.Snuffles的模型包含整数x/y坐标.当玩家告诉Snuffles向北跳时,他的y坐标立即减1.然而,在屏幕上,Snuffles应该仍然在他的旧位置.然后,逐帧,Snuffles继续跳到他的新位置,直到他显示在他的模型所指的位置.

通常,当我们绘制Snuffles时,我们可以在他的模型中查找他的坐标.但是当他跳来跳去时,这种坐标是错误的.

如果只有一件事在屏幕上移动,我可以躲开冻结整个游戏状态而不允许用户做任何事情,直到Snuffles完成跳跃.但如果屏幕上有多个兔子怎么办?

如果元素交互,合并或拆分,情况会变得更糟.如果Snuffles神奇地与帽子合并成为一个土豆,那么数据模型会删除兔子和帽子,并添加土豆?如果它立即这样做,视图立即失去了关于Snuffles和马铃薯的信息,它仍然需要绘制魔法合并的动画.

在实现动画GUI,特别是游戏时,我多次遇到过这个问题,并且没有找到令人满意的解决方案.

不满意的包括:

  • 立即执行更改,但随后暂停模型中的任何进一步更改,直到动画解决.如果不止一件东西可以移动或者事物以复杂的方式相互作用,那么事情就会没有反应并且不起作用.

  • 合并模型和视图 - Snuffles获得浮点坐标,可能还有z坐标来指示他的距离.因此,模型的规则变得越来越复杂,因为模型不能再做出简单的陈述,例如"如果在(x,y - 1)处存在墙,则不能向北跳跃".对规则的任何更改都需要更长的时间,并且开发速度会慢下来.

  • 保留视图中数据的重复数量.SnufflesModel具有整数坐标,但SnufflesSprite具有浮点坐标.最终复制视图中的某些模型规则并且必须使它们保持同步.花费大量时间进行调试,以确保SnufflesModel和SnufflesSprite在某些罕见情况下不会同步.

目前我最好的选择是选项3,但它并不像我那样优雅.思考?

Ore*_*ner 7

您需要一个更强大的模型来考虑更改的时间组件:

  1. 每个sprite都需要维护一个它应该执行的动画操作队列.将动画添加到队列应该是零时间动作(游戏时间).排队的动画在从动画时钟得到一个勾号时逐帧进行.排队允许您将模型与图形子系统和动画分开.

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

  3. 精灵可以携带高分辨率坐标(例如浮点),而模型则保持整数坐标.Sprites不需要知道任何关于游戏规则的事情 - 排队的动画完成模型 - 动作处理它.

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

要实现Snuffle的任务,您可以:

  • 用户要求将Snuffle移到北方?- (1)检查规则是否允许移动,(2)在Snuffle的精灵上排队移动动画,再加上着陆模型动作.将兔子的模型置于过渡移动状态.

  • Snuffle的着陆模型动作将兔子的模型带回正常状态,并检查着陆点和规则.找到一顶帽子,它将马铃薯外观动画("合并")和兔子和帽子的两个消失动画排队.

  • 消失动画的模型动作在完成时删除兔子和帽子.