您的位置:首页 > 大数据 > 人工智能

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

2008-06-10 12:29 113 查看
 
游戏人工智能演示(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)某一目标是游戏中最常见的人工智能之一,下期将讲述一个追逐鼠标的怪物的实现,敬请关注。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: