我的程序中的数据模型有许多离散状态,但我想动画在这些状态之间的转换。当动画正在进行时,用户在屏幕上看到的内容与底层数据的外观断开连接。一旦动画完成,它们就会重新匹配。
例如,假设我们有一个简单的游戏,在这个游戏中,小兔子在二维网格上跳来跳去。snuffles模型包含整数x/y坐标。当玩家告诉鼻烟往北跳时,他的Y坐标立即递减一个。然而,在屏幕上,那个时候的鼻烟应该还在他原来的位置。然后,一帧一帧地,鼻烟继续跳到他的新位置,直到他显示在他的模型状态的位置。
所以通常,当我们画鼻烟时,我们可以在他的模型中查找他的坐标。但当他跳的时候,这个坐标是错误的。
如果屏幕上只有一个东西在移动,我就可以把整个游戏状态冻结起来,直到snuffles完成跳跃后才允许用户做任何事情。但是如果屏幕上有多只兔子呢?
如果元素交互、合并或拆分,情况会更糟。如果鼻烟神奇地与帽子合并成土豆,那么数据模型在哪一点上删除兔子和帽子,并添加土豆?如果它立即这样做,视图会立即失去对有关鼻烟和土豆的信息的访问,而这些信息仍然需要绘制魔法合并的动画。
我在实现动画图形用户界面(尤其是游戏)时多次遇到这个问题,但没有找到令人满意的解决方案。
不满意的包括:
-
立即进行更改,然后暂停模型中的任何进一步更改,直到动画解决为止。使事物无反应,如果有多个事物可以移动或以复杂的方式交互,则不起作用。
-
合并模型和视图-snuffles获得浮点坐标,可能是一个z坐标来指示他在上多远。因此,模型的规则变得非常复杂,因为模型不能再做出像“如果(x,y-1)处有墙,就不能向北跳”这样简洁的陈述。对规则的任何更改都需要更长的时间,并且开发速度会变慢。
-
保留视图中数据的副本。snufflesModel有整数坐标,但snufflesPrite有浮点坐标。最后会复制视图中的一些模型规则,并使它们保持同步。花大量的时间调试,以确保在一些罕见的情况下,鼻烟和鼻烟的价格不同步。
目前我的最佳选择是选项3,但它几乎没有给我留下优雅的印象。思想?