引述Evankaka博客关于怪物AI的描述,如下:

低级怪物---一般是不能动的怪物,固定在原处,不断的发动攻击,然后根据英雄的方位,不断改变子弹的朝左还是朝向,如游戏中的炮台等。

        中级怪物----初步有一些智商了,主要表现在当英雄在它的攻击范围内,能够知道英雄的位置,就以一定的比例判断是否进行攻击。如若不然,平时都是自己按照一定的路线进行行走,又或者是随机走动。然后攻击随机出动,只有当英雄在它的攻击范围内,它才会不再走动,原地以概率判断是否要进行攻击

       高级怪物-----BOSS级怪物,它有自己的可视范围区,当英雄陷入它的可视范围区时,它就追着英雄跑。可视范围区内,还有个攻击范围区,当英雄陷入攻击范围区内时,怪物就按一定的概率出动攻击,这个概率一般比较大。然后,如果英雄不在怪物的可视范围区内时,怪物它有自己的巡逻路线,它按照这个路线不断的走,总会发现到英雄,英雄你再怎么跑,它都会跟着你。

主要是通过怪物与玩家的位置关系才去不同的策略,主要功能通过以下的方法实现:

//在可视范围内,怪物跟随英雄运动void FollowRun(Node* m_hero,Node* m_map);//判断是否攻击void JudegeAttack();//怪物巡逻路线void MonsterSeeRun();//怪物启动监听英雄void StartListen(Node* m_hero,Node* m_map);//监听函数,每隔3秒检测下,计算英雄与怪物的距离void updateMonster(float delta);//更新函数,如果英雄在可视范围内,不断触发void update(float delta);
Node* my_hero;//当前英雄Node* my_map;//当前地图float   dis;//当前怪物和英雄的距离

函数实现部分:

void Monster::FollowRun(Node* m_hero,Node* m_map)
{//得到两点x的距离,记得怪物的坐标要加上地图的float x = m_hero->getPositionX()-(this->getPositionX()+m_map->getPositionX());//得到两点y的距离,记得怪物的坐标要加上地图的float y = m_hero->getPositionY()-(this->getPositionY()+m_map->getPositionY());//先计算怪物和英雄的距离dis = sqrt(pow(x,2) + pow(y,2));if(dis>=300)//当怪物与英雄距离超过300return;if(dis<=100)//在怪物攻击范围内,怪物停止移动{this->StopAnimation();//停止跑动JudegeAttack();//以一定的概率判断是是否出动攻击return;}if(x<-100)//判断怪物横坐标和英雄的距离{MonsterDirecton=true;m_MonsterSprite->setFlippedX(MonsterDirecton);//设置方向if(IsAttack)return;this->setPosition(this->getPositionX()-1,this->getPositionY());//怪物向英雄移动this->SetAnimation("monster_run",6,MonsterDirecton);//播放动画}else if(x>100){MonsterDirecton=false;m_MonsterSprite->setFlippedX(MonsterDirecton);//设置方向if(IsAttack)return;this->setPosition(this->getPositionX()+1,this->getPositionY());this->SetAnimation("monster_run",6,MonsterDirecton);//播放动画}else if(x<=100 || x >-100)//怪物橫坐標和英雄相差在100以内时,开始移动怪物纵坐标{if(m_hero->getPositionY()>this->getPositionY()){m_MonsterSprite->setFlippedX(MonsterDirecton);//设置方向if(IsAttack)return;this->setPosition(this->getPositionX(),this->getPositionY()+1);this->SetAnimation("monster_run",6,MonsterDirecton);//播放动画}else if(m_hero->getPositionY()<this->getPositionY()){m_MonsterSprite->setFlippedX(MonsterDirecton);//设置方向if(IsAttack)return;this->setPosition(this->getPositionX(),this->getPositionY()-1);this->SetAnimation("monster_run",6,MonsterDirecton);//播放动画}}}
void Monster::JudegeAttack()
{//srand(time(NULL));int x = random(0, 100);log("-------%d", x);if(x>50){this->AttackAnimation("monster_attack",5,MonsterDirecton);}}
void  Monster::MonsterSeeRun()
{if(dis<300)return;this->SetAnimation("monster_run",6,MonsterDirecton);//播放动画MoveBy *moveby1;if(MonsterDirecton==true)moveby1=MoveBy::create(1,Vec2(-70,0));elsemoveby1=MoveBy::create(1,Vec2(70,0));//创建回调动作,巡逻路线完后
//  auto callFunc=CallFunc::create(this,callfunc_selector(Monster::StopAnimation));auto callFunc = CallFunc::create( CC_CALLBACK_0(Monster::StopAnimation,this));//创建连续动作auto xunluo=Sequence::create(moveby1,callFunc,NULL);this->runAction(xunluo);
}
//启动监听
void Monster::StartListen(Node* m_hero,Node* m_map)
{my_hero=m_hero;my_map=m_map;this->schedule(schedule_selector(Monster::updateMonster),3.0f);//每隔3秒计算距离this->scheduleUpdate();//英雄一旦进入可视范围,怪物追着英雄打
}
//监听函数,每隔3秒检测下
void Monster::updateMonster(float delta)
{//得到两点x的距离,记得怪物的坐标要加上地图的float x = my_hero->getPositionX()-(this->getPositionX()+my_map->getPositionX());//得到两点y的距离,记得怪物的坐标要加上地图的float y = my_hero->getPositionY()-(this->getPositionY()+my_map->getPositionY());//先计算怪物和英雄的距离dis = sqrt(pow(x,2) + pow(y,2));if(dis>=300){if(!IsRunning)MonsterSeeRun();}
}
void Monster::update(float delta)
{if(dis<300)///当英雄在它的可视范围内,不断追着英雄FollowRun(my_hero,my_map);
}

对于这一块的讲解Evakaka已经讲的非常明白的了,只不过我第一次看见这句的时候也有点小小的疑惑

//得到两点x的距离,记得怪物的坐标要加上地图的float x = m_hero->getPositionX()-(this->getPositionX()+m_map->getPositionX());//得到两点y的距离,记得怪物的坐标要加上地图的float y = m_hero->getPositionY()-(this->getPositionY()+m_map->getPositionY());//先计算怪物和英雄的距离dis = sqrt(pow(x,2) + pow(y,2));

为什么要加上地图的坐标呢,我想表达式要是写成这样会更清晰一些:

//得到两点x的距离,记得怪物的坐标要加上地图的float x = (m_hero->getPositionX()+m_map->getPositionX())-this->getPositionX();//得到两点y的距离,记得怪物的坐标要加上地图的float y = (m_hero->getPositionY()+m_map->getPositionY())-(this->getPositionY());//先计算怪物和英雄的距离dis = sqrt(pow(x,2) + pow(y,2));

当hero移动的屏幕一般的时候,hero就只是做移动的动作,而真正移动的是map,所以如果仅仅比较hero和monster的

距离,肯定是要出错的。

工程下载...

PS:多写博客,帮助自己,方便他人!

Cocos2d-X 3.4版-怪物的AI《赵云要格斗》相关推荐

  1. Cocos2d-X 3.4版-血条跟随怪物运动《赵云要格斗》

    血条跟随怪物运动,当然非常容易想到的就是通过组合的方式将一个怪物精灵和 以前我们制作的ProgressView放在一起,然后通过就像他头像放在血量条旁边一样, 通过位置的一些计算让怪物们在头顶,顶上一 ...

  2. Cocos2d-x怪物智能AI怪物也有智商--之游戏开发《赵云要格斗》(6) cocos2dx 3.3移植版

    源码:git@github.com:baidang201/ARPG_Zhaoyun.git 本文将主要来讲讲游戏开发中的怪物智能,一个好的游戏一般怪物都要分等级,这样我们游戏玩起来才有意思,怪物如果智 ...

  3. 用Python制作五子棋人机对弈(人工智障版和升级AI版)

    智障版截图: 智能版截图: 可能遇到的问题: No module named 'pyqt5'解决办法 智障版源码: 背景: muzm.jpg window.py from PyQt5.QtWidget ...

  4. 阿里云【达摩院特别版·趣味视觉AI训练营】笔记2

    阿里云[趣味视觉AI训练营]笔记2 一.笔记说明 二.正文 2.1 人体分割实验 2.2 图像人脸融合实验 三.转载说明 一.笔记说明 本博客专栏<阿里云[达摩院特别版·趣味视觉AI训练营]&g ...

  5. 【cocos2d-x 手游研发----怪物智能AI】

    原创文章,转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2d-xARPG4.html 谈到怪物AI,我觉得就比较话多了,首先理解一下(Artificial I ...

  6. 【LOSOL】怪物及AI设计

    LOSOL怪物及AI设计 引子 怪物设计理念 怪物类型列举 怪物AI简述 怪物AI包括范围 怪物AI设计 结语 引子 怪物在游戏中始终占据着一个极其重要的位置,一个游戏的趣味性很大一部分跟怪物的设计挂 ...

  7. MFC学习笔记之三(粒子系统+怪物简单AI+碰撞检测)

    到上海找到住的地方之后,干的第一件事,就是抓紧时间学习,为了找到工作努力ing... 备注:以下请参考http://blog.csdn.net/hust_xy/article/details/9374 ...

  8. 阿里云【达摩院特别版·趣味视觉AI训练营】笔记4

    阿里云[趣味视觉AI训练营]笔记4 一.笔记说明 二.正文 2.1 调用前准备 2.1.1 激活AccessKey 2.1.2 开通服务 2.1.3 安装SDK 2.1.4 准备OSS图像链接 2.2 ...

  9. Cocos2d-x血条跟随怪物运动--之游戏开发《赵云要格斗》(5)cocos2dx 3.3移植版

    源码:git@github.com:baidang201/ARPG_Zhaoyun.git   本章在前面的基础上<Cocos2d-x自定义血条及其美化--之游戏开发<赵云要格斗>( ...

最新文章

  1. redhat7企业版linuxlinux基本操作
  2. SQL Server 2008用'sa'登录失败,启用'sa'登录的办法
  3. 两个比较好的java在线手册网站
  4. 塔式服务器、机架式服务器、刀片服务器区别小结
  5. 程序员必读的涨薪指南
  6. 金钱能让人更快乐吗?手把手教你用机器学习找到答案
  7. java sublist_java中的subList
  8. chromium 47 Chrome浏览器启动命令行参数
  9. 【C++】分数加减法
  10. three.js学习笔记(十四)——Shaders着色器
  11. php interface类,类相关的关键字 - interface
  12. 小程序swiper制作分门别类的轮播
  13. MATLAB画图---设置坐标轴为固定值(以4厘米为例)
  14. Remove or reset file passwords in Office 2013
  15. Java入门(四):进阶
  16. [图像] 金字塔模型
  17. javascript实用例子
  18. AM335x(TQ335x)学习笔记——Nandamp;amp;网卡驱动移植
  19. STM32 12864串行驱动
  20. 为什么HashTable的初始化因子是11,HashMap却是16

热门文章

  1. 【opencv450 Image Processing】Histogram Calculation直方图计算
  2. 思维导图PPT有温度的学习工具
  3. a标签的属性问题!:link不起作用!怎么回事!
  4. java中的关键字英汉
  5. 基于大规模结构相似和文本相似的知识图挖掘方法预测药物相互作用
  6. 第五届双态IT乌镇用户大会-智能运维算法研讨会圆满落幕
  7. vb怎么做根号计算机,vb中根号下如何表示?
  8. [FAQ12836]如何用CMD 去开关AAL 各个子feature
  9. 剖析抖音爆火的美食探店大佬,揭秘他们的运营秘诀
  10. 价值6380元的梦想贩卖机v2版本号1.0.88【包含所有插件】