时间延迟和模型视图控制器

3
我正在实现一个回合制游戏,有两个阵营,每个阵营有几个单位,在特定时刻只能有一个单位在棋盘上移动。
由于一次只能移动一个单位,当我确定它应该去哪里时,就可以立即将其传送到那里,但是在玩游戏时,您希望看到单位移动,以便您知道谁移动了以及他去了哪里。
问题是,您会将移动算法(例如在N秒内在2个点之间插值)放入模型中,然后使视图显示插值位置的单位,而不知道它正在移动,还是将单位传送并通知视图尽可能好地显示单位正在移动。
如果您采取第二种方法,如何防止模拟运行得太快而超过视图,您会让视图负责在移动结束后恢复模拟吗?
提前感谢,Xtapodi。
2个回答

2

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

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

与其存储当前位置和上一个位置,你也可以只存储每个单元格的最后一次移动,而移动本身包含了上一个位置。如果您需要存储有关移动的其他信息,这可能更加灵活。


谢谢Kylotan。是的,我想我会选择你的第二个建议。所以如果你要自己实现模型和视图,你会选择完全将移动放在视图上并保持模型简单,对吗? - Xtapodi
是的。根据游戏规则,逻辑移动仅仅是从一个地方到另一个地方,没有中间过程,所以这就是我会在模型中存储的内容。这些地方之间的物理移动只是一种呈现细节。如果不确定应该将什么放入模型,什么放入视图,请问自己如何将其转化为邮件对弈游戏或文本游戏。 - Kylotan
谢谢Kylotan帮助我引导思路 :) - Xtapodi

0

你可能想要的是让单位图像每帧移动。每帧移动图像的距离类似于你的插值。

每秒单位数 = 总单位数 / (每秒帧数 * 总秒数)

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


感谢Rob Elliott的快速回复。问题不在于如何插值或确保最终处于正确位置,而在于插值是在模型中还是在视图中,并且在后一种情况下会导致模型和视图之间的时间同步问题。 - Xtapodi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接