转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。
资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。
上一篇: Cocos3.4 横版游戏制作-《KillBear》-添加血条 攻击按键
上篇在状态层加入了血条,并添加了一个攻击按键
本篇将在前面的基础上添加敌人,并通过有限状态机(FSM)实现简单的AI
开发环境
win64 : vs2010
Cocos2d-x v3.4Final
TexturePackerGUI
MapEdit
代码A
角色Role
Enemy
创建一个继承基础Role类,作为敌人.
- .h
typedef enum {
AI_IDLE = 0,
AI_PATROL,
AI_ATTACK,
AI_PURSUIT
}AiState;
作为AI类型
其他的代码和Hero大同小异
public:
Enemy();
~Enemy();
bool init();
void updateSelf();
CREATE_FUNC(Enemy);
CC_SYNTHESIZE(cocos2d::Vec2, m_moveDirection, MoveDirection);
CC_SYNTHESIZE(float, m_eyeArea, EyeArea);
CC_SYNTHESIZE(float, m_attackArea, AttackArea)
CC_SYNTHESIZE(AiState, m_aiState, AiState);
private:
void decide(const cocos2d::Vec2& target, float targetBodyWidth);
void execute(const cocos2d::Vec2& target, float targetBodyWidth);
unsigned int m_nextDecisionTime;
由于敌人是AI,我们要给它设定一些区域,视野,最大攻击判定区,AI状态等.
- .cpp
init类似
Animation *idleAnim = this->createNomalAnimation("bear_idle_%02d.png", 3, 6);
this->setIdleAction(RepeatForever::create(Animate::create(idleAnim)));
...
然后是类似Hero的自更新函数updateSelf刷新自己状态
void Enemy::updateSelf()
{
//this->execute(global->hero->getPosition() + global->hero->getBodyBox().actual.origin , global->hero->getBodyBox().actual.size.width);
this->execute(global->hero->getPosition(), global->hero->getBodyBox().actual.size.width);//对象坐标及body宽度