gpt4 book ai didi

model-view-controller - 当模型是离散的时如何处理中间状态的动画

转载 作者:行者123 更新时间:2023-12-04 08:01:11 24 4
gpt4 key购买 nike

我的程序中的数据模型有许多离散状态,但我想对这些状态之间的转换进行动画处理。在动画进行的过程中,用户在屏幕上看到的内容与底层数据的内容是脱节的。动画完成后,它们会再次匹配。

例如,假设我们有一个简单的游戏,其中 Snuffles 兔子在 2D 网格上跳来跳去。 Snuffles 模型包含整数 x/y 坐标。当玩家告诉 Snuffles 向北跳跃时,他的 y 坐标立即减一。但是,在屏幕上,Snuffles 那时应该还在他的旧位置。然后,一帧一帧,Snuffles 继续跳到他的新位置,直到他出现在他的模型声明的位置。

所以通常,当我们绘制 Snuffles 时,我们可以在他的模型中查找他的坐标。但是当他跳跃时,那个坐标是错误的。

如果屏幕上只有一件事在移动,我几乎可以通过卡住整个游戏状态,并且在 Snuffles 完成跳跃之前不允许用户做任何事情。但是如果屏幕上有不止一只兔子怎么办?

如果元素交互、合并或拆分,情况会变得更糟。如果 Snuffles 神奇地与帽子融合成为土 bean ,那么数据模型在哪一点删除兔子和帽子,并添加土 bean ?如果它立即这样做,则 View 立即无法访问有关 Snuffles 和马铃薯的信息,它仍然需要绘制神奇的合并动画。

我在实现动画 GUI 时多次遇到这个问题,尤其是游戏,但没有找到令人满意的解决方案。

不满意的包括:

  • 立即进行更改,然后暂停模型中的任何进一步更改,直到动画解决。如果不止一件事可以移动或事物以复杂的方式交互,则使事物无响应并且不起作用。
  • 合并模型和 View - Snuffles 获得浮点坐标,可能还有一个 z 坐标来表示他有多远。结果,模型的规则变得更加复杂,因为模型不再能够做出简洁的陈述,例如“如果 (x, y - 1) 处有一堵墙,你就不能向北跳跃”。对规则的任何更改都需要更长的时间,并且开发速度会缓慢到爬行。
  • 在 View 中保留相当于数据副本的内容。 SnufflesModel 有整数坐标,但 SnufflesSprite 有浮点坐标。最终会在 View 中复制一些模型规则并且必须使它们保持同步。花大量时间调试以确保 SnufflesModel 和 SnufflesSprite 在某些罕见情况下不会不同步。

  • 我目前最好的选择是选项 3,但它几乎没有让我觉得优雅。想法?

    最佳答案

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

  • 每个 Sprite 都需要维护一个它应该执行的动画 Action 队列。向队列添加动画应该是零时间 Action (游戏时间)。当队列动画从动画时钟中得到一个滴答声时,它们将逐帧进行。排队使您可以将模型与图形子系统和动画分开。
  • 队列中的每个动画都带有一个模型 Action ,要在动画完成时执行。有些语言使这更容易,例如使用 C# 或 JavaScript 中的匿名函数。在其他语言中,您可以改用回调。模型操作可让您指定模型在动画完成时将如何更改。
  • Sprite 可以携带高分辨率坐标(例如浮点),而模型保持整数坐标。不过, Sprite 不需要了解任何关于游戏规则的信息——排队的动画完成模型 Action 会处理这些。
  • 模型实体应该能够解释过渡状态:出现、消失和移动。这使您可以避免检查转换对象的规则。

  • 要实现 Snuffle 的任务,您可以:
  • 用户要求将 Snuffle 向北移动? -(1) 检查规则是否允许移动,(2) 在 Snuffle 的 Sprite 上排队一个移动动画,加上一个着陆模型 Action 。将兔子的模型置于过渡移动状态。
  • Snuffle的着陆模型 Action 让兔子的模型恢复到正常状态,并检查着陆点和规则。找到一顶帽子,它将一个土 bean 出现动画(“合并”)和两个兔子和帽子的消失动画排队。
  • 消失动画的模型 Action 在完成后删除兔子和帽子。
  • 关于model-view-controller - 当模型是离散的时如何处理中间状态的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1078899/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com