游戏人工智能演示(0)框架

 

游戏人工智能演示(0)框架
网易广州 赖勇浩( http://blog.csdn.net/lanphaday
总说
       本系列文章用以描述如何构建游戏人工智能这一课题,它是我创建的开源项目《游戏人工智能演示》( http://code.google.com/p/aidemo)的配套文档,随着项目的推进而逐步完善。
       《游戏人工智能演示》(以下简称aidemo)是正在进行中的项目,它展示了游戏人工智能的开发过程,伴随着它的发展,重构不断地进行。比如前一二个项目会使用最直观的、最简单的实现;接下来会重构到策略模式;再接下来会应用有限状态机;再接下来会实现群体的智能……它将一直提供足够吸引眼球的变化,敬请关注。
预备知识
1) Python 语言基础。起码要懂得 Python 语法和常用标准库用法。
2) wxPython 方面的知识不是必须的,实际上,项目中关于 wxPython 的内容极少,并且一定会讲得比较仔细。不过,你必须理解消息机制。
3) 关于向量和矩阵运算的基础,如果有些不懂,现在就补上也来得及。推荐使用Twinsen编写的《向量几何在游戏编程中的使用》系列文章,地址: http://blog.csdn.net/popy007/category/208696.aspx
4) 如果你懂一些设计模式,对阅读代码会非常有帮助。
5) 本文档假设你了解如果编写一个运行在图形用户界面(GUI)的游戏框架,至少应了解什么叫帧率。
主循环与双缓冲
       基于消息机制的 GUI 程序肯定有一个主循环,在这个循环中不断地处理输入,并通过合适的途径输出处理结果。一个典型的 wxPyhon 程序并不需要程序员关心主循环,但因为我们编写的是一个无时无刻不在刷新界面的游戏框架,所以有必要了解游戏的主循环:
       def MainLoop(self):
              evtloop = wx.EventLoop()
              old = wx.EventLoop.GetActive()
              wx.EventLoop.SetActive(evtloop)
              while self.keepGoing:
                     # 逻辑处理
                     self.Logic()
                     # 处理消息
                     while evtloop.Pending():
                            evtloop.Dispatch()
                     # 重画窗口
                     self.GetTopWindow().Refresh()
                     # 做一些杂项操作
                     self.Misc()
              wx.EventLoop.SetActive(old)
函数MainLoop()定义了wxPython 新的事件循环:先运行游戏逻辑,然后分发消息,再重画窗口,最后做一些未定义的杂项操作。self.GetTopWindow().Refresh(),这行代码要求 GUI 立刻刷新。Logic()和Misc()都是没有定义的模板方法,每一个实例都应该继承GameApp,并实现这些模板方法。
       另外需要说一下的是双缓冲,双缓冲是为了解决刷新界面时的闪烁而采用的一种绘图机制。得益于 wxWidgets 的良好封装,我们在使用 wxPython 实现双缓冲是如此简单:只需要把在EVT_PAINT(相当于 MFC 里的 WM_PAINT)响应函数里构造 wx.PaintDC 实例的代码改为构造wx.BufferedPaintDC即可,比用 MFC 可是简单得多了。完成后的 OnPaint()函数大约是这样的:
       def OnPaint(self, evt):
              dc = wx.BufferedPaintDC(self, self.buffer)
              self.PrepareDC(dc)
              dc.BeginDrawing()
              self.DoPaint(dc)
              self.DrawFps(dc)
              self.DrawAbout(dc)
              dc.EndDrawing()
简单吧,这就是双缓冲了,很好地解决了界面闪烁问题。其中DoPaint()函数是一个未实现的模板方法,咳,是的,你要是懂点设计模式,会好一点。
程序框架
       好了,是时候该看看总体的架构了。因为在 GameApp 和 GameFrame 两个基类里定义了几个模板方法,所以每一个 demo 实现都必须有继承自它们的自己的 App 类和 Frame 类,并实现基类定义的模板方法。至此,框架的模型就呼之欲出了:
咳,很简单,正是这样,源码也只有几行,没啥好说了。
开发平台
       aidemo 主要在一台安装了 MS Window200 Pro 操作系统的 PC 机上进行开发。这台机器有一枚 3.0 GHz 的 奔4 处理器和1 G 的内存,显卡芯片是 Nvideo 的 5700 。在测试时,也运行于一台安装有 ubuntu 操作系统的 IBM Thinkpad X32 笔记本电脑,和一台安装有 MS Windows XP home操作系统的 Samsung X05 笔记本电脑。
运行截屏
下期预告
让智能体能够追逐(Chase)某一目标是游戏中最常见的人工智能之一,下期将讲述一个追逐鼠标的怪物的实现,敬请关注。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值