三.游戏循环框架




如果你看过坝坝电影,或许有幸见识过老式的电影播放机吧,厚厚的一卷胶片被电动机带动着不断地旋转,然后灯光又把胶片上的一张张画面投射到白屏幕上。
游戏也是如此,游戏里的一张张画面是连续播放的,只要每秒能放映24张以上,于是见证奇迹的时刻就到了,游戏里的世界活了。
如果我们把游戏里连续播放的画面看作是电影的胶片,那么带动胶片旋转的电动机又是什么呢?是什么让画面不断的产生,又不断的播放呢?
这就是游戏循环,可以这样的说,不论是移动,桌面,还是专有的游戏平台,游戏的实现都离不开游戏循环。
我们可以用下面的伪代码来表示游戏循环
while(isGameRunning)
{
   render();
}
如此的简单,一个while循环,只要isGameRunning为真,这将是一个死循环,每循环一次都将会调用方法 render(),这个方法用于展示每一帧的游戏画面。
正如你所见,游戏中的电动机就是这个while循环,游戏中的胶片就是这个render()方法。while每循环一次,render()方法就被调用一次,要保证我们的游戏不卡顿,就需要我们的代码必须在1秒内循环24次以上。
等等,前面我提到了死循环,当然游戏不应该是死循环,否则游戏永远不会结束,isGameRunning就好比是播放机的电源开关,当我们关闭播放机的电源时isGameRunning就应该是false, 打开电源则是true,只有这样游戏才能启动和结束。
对了,仔细看伪代码,我们好像忘了点什么?
控制或者又称之为输入,比如:按住键盘上的前进按钮或者切水果游戏里的划屏操作等等。
既然有游戏是可控动画,我们应该遗漏掉了操作。
继续修改代码
while(isGameRunning)
{
  input();
  render();
}


在游戏循环中我们加入了一个方法input(), 这个方法用于获取输入信息,从而根据这些信息来指导render()方法生成相应的画面,比如按下“前进”,render()方法画出的画面会把游戏中的精灵位置向前移动一点。
明白了吗?


现在有一个新问题,render()怎么知道前进按钮一定是让游戏中的精灵向前移动呢,而不是向后移动,或许又不是跳动呢?


如果游戏中有很多精灵需要控制呢?


比如:实况足球,随着足球的移动,控制的球员角色也在不断的变动,游戏是如何合理的处理这一切呢?


这个新问题就是游戏中的逻辑了,每个游戏都有自己的逻辑,每一个游戏都是一个世界,控制这个世界的就是游戏逻辑,当然这是我自己的理解了。


在.net开发中我们有三层架构的思想,在java中又强调mvc,其实这些都是所谓的分层设计思想,能把复杂的逻辑简化,从而分而治之,这也是一个架构师应该具备的素质。


游戏中其实也是这样分层设计的,首先我们获取用户的输入信息(input),接着我们处理这些输入信息,处理的过程其实就是处理前面提到的游戏逻辑(logic),最后我们再将处理后的结果渲染出来(render).
因此当我们按住前进按钮时,游戏输入(input)通知游戏逻辑(logic),游戏逻辑再把精灵的坐标位置向前移动一点,最后游戏渲染(render)直接根据精灵新的坐标位置把精灵重新绘制出来。
继续更新代码
while(isGameRunning)
{
  input();
  logic();
  render();
}
注意logic()方法即是我们提到的游戏逻辑它位于input()输入之后,渲染方法render()之前。
其实游戏的基本的框架就是这样的,这里也能体会到分层设计的思想,好处嘛,你会慢慢体会到的。










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值