游戏人工智能演示(0)框架
总说本系列文章用以描述如何构建游戏人工智能这一课题,它是我创建的开源项目《游戏人工智能演示》(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 类,并实现基类定义的模板方法。至此,框架的模型就呼之欲出了:
http://p.blog.csdn.net/images/p_blog_csdn_net/lanphaday/98546824462a42ddb6f735311276ec04.gif
咳,很简单,正是这样,源码也只有几行,没啥好说了。
开发平台
aidemo 主要在一台安装了 MS Window200 Pro 操作系统的 PC 机上进行开发。这台机器有一枚 3.0 GHz 的 奔4 处理器和1 G 的内存,显卡芯片是 Nvideo 的 5700 。在测试时,也运行于一台安装有 ubuntu 操作系统的 IBM Thinkpad X32 笔记本电脑,和一台安装有 MS Windows XP home操作系统的 Samsung X05 笔记本电脑。
运行截屏
http://aidemo.googlecode.com/files/demo_0.PNG
下期预告
让智能体能够追逐(Chase)某一目标是游戏中最常见的人工智能之一,下期将讲述一个追逐鼠标的怪物的实现,敬请关注。 好东西
页:
[1]