51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3503|回复: 1
打印 上一主题 下一主题

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

[复制链接]
  • TA的每日心情
    慵懒
    2015-1-8 08:46
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2007-12-13 10:21:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    总说

    本系列文章用以描述如何构建游戏人工智能这一课题,它是我创建的开源项目《游戏人工智能演示》(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)某一目标是游戏中最常见的人工智能之一,下期将讲述一个追逐鼠标的怪物的实现,敬请关注。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    该用户从未签到

    2#
    发表于 2007-12-25 14:00:05 | 只看该作者
    好东西
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-21 20:23 , Processed in 0.070763 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表