状态驱动智能体的设计
,本篇中,大部分内容来自笔者阅读<游戏人工智能编程精粹>一书,以及自己的一些感想
本着"如果不能把自己所学的知识教给自己的祖母,那么证明自己还没有学到最好"
基于有限状态机(FSM)架构的智能体设计被广泛的应用于游戏编程中,这种设计的好处是显而易见的,
1.易于调试,
2.很少的计算开销
3.灵活性
4.易于理解
在后面会对上面的特点分别阐述
在设计一个对象的状态机前,我们先来看看一个状态机的基本定义是什么
1.首先 他具有2种以上的状态
2.并且同一时刻jin
其次,这篇文章将通过改进一个程序的状态机设计,来讲述
程序是基于cocos2d-x 的,所以可能会需要您学习一些引擎知识
源代码 在这里
改进前:
改进后:
先看看当前的对象+状态 抽象类
为了减少平台与引擎相关,故我将一些宏定义,以及框架代码 尽量的在这里改写成最基本的形式
class ActionSprite : public CCSprite{
public:
CC_SYNTHESIZE_RETAIN(CCAction*, _idleAction, IdleAction);
CC_SYNTHESIZE_RETAIN(CCAction*, _attackAction, AttackAction);
CC_SYNTHESIZE_RETAIN(CCAction*, _walkAction, WalkAction);
CC_SYNTHESIZE_RETAIN(CCAction*, _hurtAction, HurtAction);
CC_SYNTHESIZE_RETAIN(CCAction*, _knockedOutAction, KnockedOutAction);
CC_SYNTHESIZE_RETAIN(CCAction*, _jumpAction, JumpAction);
//角色当前状态
CC_SYNTHESIZE(ActionState, _actionState, ActionState);
VEC2_H_INCLUDED
//attributes角色属性
CC_SYNTHESIZE(float, _walkSpeed, WalkSpeed);
CC_SYNTHESIZE(float, _hitPoints, HitPoints);
CC_SYNTHESIZE(float, _damage, Damage);
//movement用于计算精灵如何沿着地图运动
CC_SYNTHESIZE(CCPoint, _velocity, Velocity);
CC_SYNTHESIZE(CCPoint, _desiredPosition, DesiredPosition);
//measurements用于计算精灵框体
CC_SYNTHESIZE(float, _centerToSides, CenterToSides);
CC_SYNTHESIZE(float, _centerToBottom, CenterToBottom);
//更新循环
void update(float dt);
//状态触发函数
void idle();
void attack();
void hurtWithDirection(float damage);
void knockout();
void walkWithDirection(CCPoint direction);
void jump();
};