【问题标题】:Time delays and Model View Controller时间延迟和模型视图控制器
【发布时间】:2011-03-14 11:15:46
【问题描述】:

我正在实现一个回合制游戏,有两个方面,每个方面都有几个单位,在每个特定时刻只有一个单位可以在棋盘上移动。

由于一次只能移动一个单位,所以在我弄清楚它应该去哪里之后,就模拟而言,它可以立即传送到那里,但是在玩游戏时,您会希望看到该单位移动,以便你知道谁搬家了,他去了哪里。

问题是,您是否会将移动算法(例如,在 N 秒内在 2 个点之间插值)放入模型中,然后让视图在插值位置显示单元而不知道它正在移动,还是传送单元并通知视图它应该尽可能地显示单元移动。

如果您采用第二种方法,您将如何防止模拟运行在视图之前太远,您是否会在移动结束后让视图负责恢复模拟?

在此先感谢您,Xtapodi。

【问题讨论】:

    标签: model-view-controller architectural-patterns


    【解决方案1】:

    您可能想要的是让单位图像移动每一帧。每帧图像移动多远与您的插值相似。

    unitsPerSecond = totalUnits / (framesPerSecond * totalSeconds)

    所以如果我想在 2 秒内将图像从位置 0 移动到位置 60,并且我的帧率为 30,我需要在 60 帧中移动 60 个单位,因此我的速度为 1。所以每一帧,我移动图像1 个单元,如果移动该单元会使我超出目的地,只需将我的位置设置为我的目的地。

    【讨论】:

    • 感谢 Rob Elliott 的快速回复。问题不在于如何插入或确保它最终位于正确的位置。问题是插值是在模型中还是在视图中,以及在后一种情况下导致模型和视图之间的时间同步问题。
    【解决方案2】:

    啊,又一个例子提醒我们,MVC 最初并不是为实时图形设计的。 ;)

    我会将当前位置和之前的位置存储在模型中。当对象移动时,当前位置被复制到前一个位置,新位置被复制到当前位置,并且模型已经改变的通知被发送到视图。然后视图可以相应地在旧位置和新位置之间进行插值。它可以完全根据特定的视图设置加速、减慢甚至删除插值,而无需在模型中存储任何额外的数据。

    您可以只存储每个单元的最后一次移动,而不是存储当前位置和前一个位置,而移动本身包含前一个位置。如果您需要存储有关移动的额外信息,这可能更加通用。

    【讨论】:

    • 谢谢凯洛坦。是的,我想我会接受你的第二个建议。所以我认为如果你自己实现模型和视图,你会选择将运动完全放在视图上并保持模型简单?
    • 是的。就游戏规则而言,逻辑运动只是从一个地方到另一个地方,没有中间运动,所以这就是我要存储在模型上的内容。这些地方之间的物理运动只是一个演示细节。如果对在模型中放置什么以及在视图中放置什么有疑问,请问问自己如何将其变成一个邮件游戏或基于文本的游戏。
    • 感谢 Kylotan 帮助我指导我的思路 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    相关资源
    最近更新 更多