假设您正在构建一款俄罗斯方块游戏。作为任何适当的程序员,您的视图逻辑位于一侧,业务逻辑位于另一侧;可能正在进行完整的 MVC。

当模型发送它的 update(), ,视图会按照预期自行重绘。

但是之后...如果您想添加一个动画来消失一条线,您将如何在视图中实现它?

做出任何你想要的假设——除了“一切都被正确封装”之外。

有帮助吗?

解决方案

个人而言,我会分离尽可能多地绘制在屏幕上,即使没有该块位置的更新。所以我有一个循环的某处有 “更新” “渲染”部分。更新播放球载有或不位置和/或块除去任何更新的逻辑。渲染戏剧球到图形部,吸引所述块,其中他们应该是

现在,如果有行擦除,逻辑知道并且可以标记要删除的那些行。我假定这里,每一块由4个单块,并且任何这些块的是一个单独的对象。现在,当这个块有“死” -flag集,你可能需要一些渲染部分消失块(比方说,500ms的爆炸)。此时间之后,对象可以是设置与块上方的线落下。为什么500ms的?好吧,你一定要使用基于时间的运动因为它可以使游戏的速度在不同计算机上的相同。

顺便说一下,目前已经有所谓的游戏引擎,其提供这样的更新渲染回路。例如XNA,如果你去了.NET线。您也可以编写自己的引擎,但要注意,这不是一件容易的事,这是非常费时。我这样做一次,不要指望它像Source引擎的引擎; - )

其他提示

大多数游戏执行一个循环,不断重绘游戏的视图尽可能快,而不是等待在模型状态的变化,然后刷新视图。

如果你喜欢的模型视图模式,那么它可能工作得很好的观点,继续画一些类型的对象,他们是从模型中取出后,褪色出来在几毫秒。

另一种方法是上课MVC的东西,如差分执行相结合 - “查看”是呈现什么模式,但绘图代码事件流“查看”创建具有流从以前的渲染比较。因此,如果在一个流中有一条线,而接下来没有,绘图代码可以用动画的差别。这使得图纸被抽象远离视图。经常在MVC中的“查看”是窗口小部件,而不是一些东西,直接绘制显示的集合,所以你最终嵌套MVC层次结构无论如何:所述应用程序是MVC(数据模型,视图的对象,应用程序控制器),其中视图对象具有窗口小部件的集合的每一个是MVC(插件状态(例如按钮按下),外观和感觉/工具箱结合,工具包事件的映射 - >插件状态)。

我自己也经常想知道这个问题。

我自己的想法一直是这样的:

1) 视图被赋予块的状态(形状、yada-yada),但带有额外的“过渡”数据:

2) 必须删除一行的事实是在状态中编码的,而不是在视图中计算的。

3)视图现在知道如何绘制过渡:

  • 不用找了:该特定块的状态相同
  • 从“落下”变为“锁定”:状态被“锁定”(通过下降块)
  • 从“锁定”更改为“删除”:状态被“删除”(通过行完成)
  • 从“掉落”改为“移除”:状态被“删除”,但旧状态“下降”

东西能吸引觉得一个游戏作为一个MVC的。那是我从来没有考虑(一些奇怪的原因)的透视,但肯定一个有趣的一个,使一个很大的意义。假设你实现与MVC的俄罗斯方块游戏,我觉得有你可能要考虑到你的控制器和视图之间关于通信两件事情:有状态,有要事。

您控制器显然是相互作用的用户的中心点。当他们发出键盘命令,您的控制器将对其进行解释,并做出相应的调整状态。然而,有时该游戏将输入与特定事件一致的状态......诸如填充线与现在应该去除块。

Scoregraphic给你一个很好的基础。您认为应该在一个固定的周期运行,以维持整个计算机的速度一致。但是除了更新屏幕来呈现新的状态,它也应该有事件的队列,它可以响应执行的动画。在填补方块线的情况下,控制器可以发出从某种碱事件类型的到视图事件队列,这可能随后由视图用于执行适当的动画响应派生强类型的事件对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top