Game AI Best Practice (Part I)

前言:  最近读了Mat Buckland的Programming Game AI By Example, ⑤ 作为书中的配套例子,作者写了Simple Soccer和Raven两个教学游戏.  通过这两个游戏, 作者展示了

实际游戏开发中用到的大部分AI技术. Simple Soccer仅仅通过使用Steering Behaviors和State Machine就完成了一个非常精巧的足球游戏.

Raven掠夺者游戏则复杂得多,覆盖的AI技术主要有: Sensory Memory,  Messaging, Goal Driven Behavior, Time Slice Path Planning, Script, Trigger System, Steering Behavior,Target Selection, Fuzz Logic, Search等等, 就论AI技术复杂程度远远超过很多泡菜游戏和页游.(这2个项目的源码可以在此下载:http://www.jblearning.com/Catalog/9781556220784/student/   Just click in Sample Materials --> Source Code)

这篇文章主要是对Simple Soccer通过改进SteeringBehavior和增加和修改一些状态来改进AI作为一个Best Practice. 如果可能的话后续将写成一个系列文章, 对于上面提到的各个AI技术做相应的实现及总结。

一:   首先简单介绍一下Simple Soccer这款游戏, 顾名思义,就是一款简单的足球游戏: 一个足球场地, 二个球门,一个足球, 两支球队, 每队五名球员, 一名守门员, 四名场上球员.游戏规则: 没有越位, 没有出界(球碰到边界自动弹回), 足球越过球门线算得分. 

 

 

二:   程序架构(UML)  : Let's look into a big picture.

        由于Simple Soccer的程序架构有一定的复杂度,所以先画出UML图通过UML图来把握整体架构是明智的。(UML工具推荐StarUML)

                                                                                                                      图1 --SimpleSoccer程序架构

这里对照着图1,对游戏用到的各个类及基本功能做个简单的介绍:文章开头提到了Simple Soccer的实现主要用到了SteeringBehavior和StateMachine两部分,这里主要是指AI用到的实现技术。游戏光有AI当然不可能跑起来。所以还有实体系统, 画面渲染系统,游戏循环系统。

Simple的实体系统按照抽象到具象的递进层次为: BaseGameEntity->MovingEntity->PlayerBase->FieldPlayer/GoalKeeper

其中BaseGameEntity抽象层次最高,定义了实体类必须有的属性和接口。比如EntityID()-->获取实例ID, Update()-->GameLoop接口, Render()-->渲染, HandleMessage()-->消息的发送和接收。MovingEntity定义了运动类实体的共有属性如方向,速度,质量等,及对应属性的接口。一个游戏的实体系统的设计有组合式和继承式,这里用的是继承式实体架构.④

渲染系统Render(): Game Rendering System这又是游戏体系的另一大子模块了,画面渲染也是游戏开发中的一个非常复杂的技术环节,目前游戏的即时运算画面已经达到CG级别,你可以使用DirectX,如果要跨平台的话可以用OpenGL,或者直接使用一个渲染引擎,调用API。在SimpleSoccer这里用的是Windows GDI. ⑥ GDI作为技术验证使用完全足够了。如果完全不考虑渲染只输出游戏的逻辑运行结果, 也是可以的,可以用字符串的形式输出结果,也就是早期的MUD,不过这样有些不直观。

StateMachine: 有限状态机,负责游戏实体和游戏世界的状态转换,这个不用多做介绍,网上已经有很多文章。这里的状态机带消息处理机制。

SteeringBehaviors 行为操控:  提供运动实体自治操控行为即:定义行为目标-->产生操控力-->移动。常见的行为有靠近,抵达,离开,巡逻,跟随,躲避障碍,及不同的操控力的合并计算等等。②

三:  游戏主循环:

游戏主循环作为游戏世界所有对象更新的引擎, 驱动着游戏实体状态的更新. (In other words, like heartbeat to human.) ①

一般而言,分为游戏逻辑更新和画面渲染更新两部分。

下面整理Simple Soccer主循环调用: 先更新游戏逻辑再渲染输出画面:

GameUpdate():   //in this game, update() includes: entities physics update, game state update. 
WinMain()->SoccerPitch.Update()->Ball.Update(); SoccerTeam.Update();
SoccerTeam.Update()->CalculateClosestPlayerToBall();CalculateClosestPlayerToOpponentSupporter();
                                            StateMachine<SoccerTeam>*.Update();TeamMember.Update();

TeamMember.Update()->FieldPlayer.Update()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值