首页 > 其他 > 详细

大富翁开发日记

时间:2014-06-15 21:22:54      阅读:424      评论:0      收藏:0      [点我收藏+]

一个大胆的尝试:使用巨型lua协程来表示整个“一局”流程。

lua协程是一个很另类的功能,有并发的影子但又不是真的并发,所以真正拿它来做大功能框架的范例不多,通常用于一些小型trick式设计。但这次我在大富翁里把它用到了“极致”:整个一局游戏,就是全部跑在一个协程里的!

简单的说:在开始按钮的点击响应函数里(自然是在“主协程”中),创建出用于新一局游戏的“run协程”,然后在这里面启动这一局的while大循环,共3层:第1层为每个回合,第2层为每个玩家,第3层为每个指令。每当要等待一个指令时,run协程挂起,控制返回主协程,也就使主线程处于应用程序自身的“while(1){ getMessage }"状态!在得到相应的ui消息或是网络消息时(分别对应于己方操作或对方操作),将其“喂”给run协程使之往前跑一段,直至遇到下一个指令等待而挂起。如此周而复始,直到一局结束。

通常,类似的系统都会用状态机来实现:依游戏逻辑设定数十个状态,再设定每种状态下每一种输入的响应函数。虽然同样可以达到“等待—前进”的效果,但相比于协程方案,弱点有:一、流程的推进在形式上不再有一个完整直观的线索,而是散布在数十处各异的函数里,对流程的说明只能通过额外的文档补充;二、每一次挂起都对应当次响应函数返回,而下一次的响应函数如要与之共享信息,只能通过状态机级别的全局变量,这会导致大量繁琐的管理消耗。在协程方案里,整个流程处于一个函数内的三层while循环表示下,非常集中直观,看起来简直就是一个特事特办、不怕阻塞的专用线程;而所谓等待并不真的阻塞只是将自身挂起,一旦恢复,仅仅是完成了一个函数调用,之前的状态——局部变量全部都在,毫无额外负载!

大富翁开发日记,布布扣,bubuko.com

大富翁开发日记

原文:http://www.cnblogs.com/wellbye/p/3785581.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!