原创文章,转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2d-xARPG4.html

谈到怪物AI,我觉得就比较话多了,首先理解一下(Artificial Intelligence人工智能),人工智能是计算机科学的一个分支,人工智能是计算机科学技术的前沿科技领域。人工智能与计算机软件有密切的关系。各种人工智能应用系统都要用计算机软件去实现,许多聪明的计算机软件也应用了人工智能的理论方法和技术。

总而言之,言而总之,我理解的AI就是:用人类自己的思考模式去赋予游戏中角色判断的能力,来进行某些特定的行为!

下面具体图文介绍一下,我在游戏中一些实用的AI制作思路;

这是这个思路就可以让怪物捕获玩家,并且追踪玩家攻击的一个图示!这个思路是基本,最终决策怪物是否去执行这个行为的操作算法又是一个AI智能,所以咱们又可以分为:

决策AI:可以根据怪物等级,怪物的类型(BOSS),怪物技能类型等很多决策和根本属性相连所起作用的操作,都可以做成决策AI;

行为AI:追踪玩家,攻击玩家,给玩家加血(如同伴),逃跑等这些行为动作操作;

OK,下面大家应该了解AI的基本思路了,那我们直接贴代码了;

我直接把AI写在了地图层里面了,因为之前我框架的设计,是有一个地图base,而所有的怪物,主角色,NPC都属于地图层,因为要做很多遍历操作,所以在地图base中写上智能AI算法,然后再继承拓展下来。

首先先制造一群怪物!并且让怪物在设置的Rect内随机移动!

  1. /********************************************
  2. 注释:
  3. makenum 最大怪物数量
  4. monsteridtags 怪物起始标签
  5. randomrange 配置怪圈大小(只能填正整数)
  6. monster_model 怪物数据
  7. yinzihigth 影子的距离
  8. fristpoint 怪物初始设定的怪圈点
  9. *********************************************/
  10. void Maps_Diyu::makemonster(int makenum,int monsteridtags,CCPoint randomrange,MainRoledata monster_model,int yinzihigth,CCPoint fristpoint)
  11. {
  12. for (int i = ; i < makenum; i++)
  13. {
  14. int add_x = (int)(CCRANDOM_MINUS1_1()*randomrange.x);
  15. int add_y =(int)(CCRANDOM_MINUS1_1()*randomrange.y);
  16. monster_model.tags=monsteridtags+i;
  17. monster_model.nowpoint= CCPointMake(nowmap->getContentSize().width/+fristpoint.x+add_x,nowmap->getContentSize().height/+fristpoint.y+add_y);
  18. SpiritsMonster* newmonster = new SpiritsMonster(monster_model,,yinzihigth);
  19. nowmap->addChild(newmonster->monster, ,monsteridtags+i);
  20. }
  21. }

然后处理怪物的行为AI:

  1. /********************************************
  2. 注释:
  3. monsternum 最大怪物数量
  4. monsteridtags 怪物起始标签
  5. monster_model 怪物数据
  6. reatR 怪物仇恨视角的范围值(通常200左右)
  7. attck_reatR 怪物可攻击范围值(远程怪和物理怪物)
  8. playerpoint 主角坐标
  9. randomrange 怪物默认随机移动范围
  10. fristpoint 怪物初始设定的怪圈点
  11. *********************************************/
  12. void Maps_Diyu::attact_todo(int monsternum,int monsteridtags ,MainRoledata monster_model,int reatR,int attck_reatR,CCPoint playerpoint,CCPoint randomrange,CCPoint fristpoint)
  13. {
  14. for (int i = ; i < monsternum; i++)
  15. {
  16. CCRect* attck_rect = new CCRectMake(this->getChildByTag(monsteridtags+i)->getPosition().x-attck_reatR/,this->getChildByTag(monsteridtags+i)->getPosition().y-attck_reatR/,attck_reatR,attck_reatR);
  17. if(attck_rect->containsPoint(playerpoint)==true)
  18. {
  19. //执行怪物攻击主角
  20. CCLog(FontChina::G2U("进入怪物可攻击范围"));
  21. //攻击时改变方向
  22. SpiritsMonster::attackTomainRole_dir(ccp((int)playerpoint.x,(int)playerpoint.y),(CCSprite*)(this->getChildByTag(monsteridtags+i)),monster_model);
  23. //释放技能动画
  24. int add_x = (int)(CCRANDOM_MINUS1_1()*);
  25. int add_y =(int)(CCRANDOM_MINUS1_1()*);
  26. SkillEffects* skill = new SkillEffects(ccp((int)playerpoint.x+add_x,(int)playerpoint.y+add_y),monster_model,(0.2f+CCRANDOM_0_1()),,,);
  27. this->addChild(skill->effects_main,,);
  28. }
  29. else
  30. {
  31. CCRect* track_rect = new CCRectMake(this->getChildByTag(monsteridtags+i)->getPosition().x-reatR/,this->getChildByTag(monsteridtags+i)->getPosition().y-reatR/,reatR,reatR);
  32. if(track_rect->containsPoint(playerpoint)==true)
  33. {
  34. //执行移动,不停追杀主角
  35. CCLog(FontChina::G2U("进入怪物仇恨视野区域"));
  36. //防止靠近主角,保持一定距离!主要为了好看和处理被攻击效果。
  37. int add_x = (int)(CCRANDOM_MINUS1_1()*);
  38. int add_y =(int)(CCRANDOM_MINUS1_1()*);
  39. //移动时改变方向
  40. SpiritsMonster::moveTomap_dir(ccp((int)playerpoint.x,(int)playerpoint.y),(CCSprite*)(this->getChildByTag(monsteridtags+i)),monster_model);
  41. CCArray* callbackArray = CCArray::create();
  42. int nowtags = monsteridtags+i;
  43. char strs[];
  44. sprintf(strs,"%d",nowtags);
  45. CCString* ccnowtags = CCString::create(strs);
  46. callbackArray->addObject(ccnowtags);
  47. callbackArray->addObject(monster_model.spiritname);
  48. char dir_x[];
  49. sprintf(dir_x,"%d",(int)this->getChildByTag(nowtags)->getPositionX());
  50. char dir_y[];
  51. sprintf(dir_y,"%d",(int)this->getChildByTag(nowtags)->getPositionY());
  52. CCString* d_x = CCString::create(dir_x);
  53. CCString* d_y = CCString::create(dir_y);
  54. callbackArray->addObject(d_x);
  55. callbackArray->addObject(d_y);
  56. CCFiniteTimeAction *actbackfun = CCCallFuncO::create(this, callfuncO_selector(Maps_Diyu::moveoverCallBack),callbackArray);
  57. CCActionInterval* act_movexixue = CCMoveTo::create(+CCRANDOM_MINUS1_1(),ccp((int)playerpoint.x+add_x,(int)playerpoint.y+add_y));
  58. this->getChildByTag(nowtags)->runAction(CCSequence::create(act_movexixue,actbackfun,NULL));
  59. }
  60. else
  61. {
  62. //脱离仇恨时,随机定点周围移动
  63. int stopandrun = (int)(CCRANDOM_MINUS1_1()*);
  64. if(stopandrun>=)
  65. {
  66. //脱离仇恨
  67. int add_x = (int)(CCRANDOM_MINUS1_1()*randomrange.x);
  68. int add_y =(int)(CCRANDOM_MINUS1_1()*randomrange.y);
  69. CCPoint move_dir = ccp(this->getContentSize().width/+fristpoint.x+add_x,this->getContentSize().height/+fristpoint.y+add_y);
  70.  
  71. SpiritsMonster::moveTomap_dir(ccp((int)move_dir.x,(int)move_dir.y),(CCSprite*)(this->getChildByTag(monsteridtags+i)),monster_model);
  72. CCArray* callbackArray = CCArray::create();
  73. int nowtags = monsteridtags+i;
  74. char strs[];
  75. sprintf(strs,"%d",nowtags);
  76. CCString* ccnowtags = CCString::create(strs);
  77. callbackArray->addObject(ccnowtags);
  78. callbackArray->addObject(monster_model.spiritname);
  79. char dir_x[];
  80. sprintf(dir_x,"%d",(int)this->getChildByTag(nowtags)->getPositionX());
  81. char dir_y[];
  82. sprintf(dir_y,"%d",(int)this->getChildByTag(nowtags)->getPositionY());
  83. CCString* d_x = CCString::create(dir_x);
  84. CCString* d_y = CCString::create(dir_y);
  85. callbackArray->addObject(d_x);
  86. callbackArray->addObject(d_y);
  87. CCFiniteTimeAction *actbackfun = CCCallFuncO::create(this, callfuncO_selector(Maps_Diyu::moveoverCallBack),callbackArray);
  88. CCActionInterval* act_movexixue = CCMoveTo::create(+CCRANDOM_MINUS1_1(),ccp(move_dir.x,move_dir.y));
  89. this->getChildByTag(nowtags)->runAction(CCSequence::create(act_movexixue,actbackfun,NULL));
  90.  
  91. }
  92. }
  93. }
  94. }
  95. }

这段逻辑包括了,如果玩家进入怪物的仇恨区域,那么怪物会先移动到玩家附近的点(此时玩家移动开,怪物会根据定时器去判断下一步如何操作:如1,玩家移动后还在仇恨区域,那么继续追踪玩家;2,如果玩家脱离仇恨,那么怪物执行回到初始坐标点的操作,然后继续原地巡逻!),如果此时玩家已经在怪物的攻击范围内了,那么怪物会直接选择攻击!这样怪物就会变得貌似有了思想一样,他会去考虑判断各种行为,那个区域我该做什么?不该做什么?

有了这个逻辑,我们还要赋予怪物循环思考的能力!

  1. //启动所有怪物智能AI监听器
  2. nowmap->schedule(schedule_selector(Maps_Diyu::makemonsterAttack), (3.0f));

我们根据定时器去每隔3秒内去监控行为AI!

整个行为AI已经完毕!就可以实现比较智能的怪物追杀主角了!这也就牵扯到了游戏难度怪物难度的问题了,往往好玩的游戏智能AI都占用了程序一半以上时间去处理;怪物并不是血多,防御高他就是一个BOSS,如果BOSS他会满地图追着玩家打,会自己加血,逃跑,那这样的BOSS我们作为玩家来说,打起来也比较刺激有意思,有挑战!

这篇就写这么多了,下回分解一下游戏界面UI交互的一些东西,充分运用定时器去管理一些玩家对屏幕基本操作的逻辑;

PS:COCOS2DQQ群 ,和大家一起分享cocos2dx开发经验【41131516】

【cocos2d-x 手游研发----怪物智能AI】的更多相关文章

  1. 【cocos2d-x 手游研发----目录】

    感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...

  2. 【cocos2d-x 手游研发----地图活起来了】

    谈到地图不少人都说要做地图编辑器了,但是我暂时绕过这一步,如果不用寻路地图就不能移动?寻路就是会绕过障碍物的算法. 我做了一个简单的地图的思想,就是地图分层3层:背景层.可行区域层.遮罩层,但是地图就 ...

  3. 手游研发CJ抱大腿指南

    文摘要:CJ来了,又是一年一度的游戏圈盛事,随着手游行业的迅速崛起,今年CJ上,手游研发商以及发行商必定成为焦点.由于门槛低.市场热.前景好等因素的影响,国内一下子蹦出一大堆手游研发团队.很幸运(或者 ...

  4. 【cocos2d-x 手游研发----研发思路及感想】

          我半年前进入了目前的这家做教育行业的公司(在此之前一直从事原生态开发手游的迷茫之路),学习是一件很快乐的事情,来到这家公司我有了很多时间去学习,不管是公司业务,还是其他技术相关的.于是开始 ...

  5. 【cocos2d-x 手游研发----界面UI设计】

    简单探讨一下如何在cocos2d-x的游戏引擎里面去制作各做交互UI界面,常见的UI如下: 人物头像,血条值,经验条,技能按钮,以及各种玩家交互的界面按钮:背包,人物属性,门派,等: 类似上面的图示交 ...

  6. 【cocos2d-x 手游研发小技巧(1)自定义制作怪物伤害数值】

    直插主题了,今天写了一下午,早就想要写这类似东西的,首先我不会选用CCLabelAtlas了,我直接用帧图片做. 首先我们要准备素材,我先把素材帖出来给大家: 这个是一张比较全的素材图,它包含了扣血的 ...

  7. 【cocos2d-x 手游研发小技巧(6)聊天系统+字体高亮】

    转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2dxJQ-6.html 聊天系统在手机网游中是最常见的交互工具,大家在一起边玩游戏边聊天岂不乐哉: 废话不多了 ...

  8. 【cocos2d-x 手游研发----精灵的八面玲珑】

    继续上一篇文章继续聊吧,这章内容会比较多,也会附上代码,很多朋友加了群,大家在群里面探讨了很多东西,这让大家都觉得受益匪浅,这便是极好的,废话不多了,精灵是游戏的重要组成部分,那ARPG里面的精灵必然 ...

  9. 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

    游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...

随机推荐

  1. DB2锁机制

    相比较Oracle来说,DB2的锁机制麻烦了很多,而且这个麻烦带来的不是性能的上升而是下降,不过如果细致了解的话,只能感慨不愧是数据库理论诞生的公司,在实现数据库理论上比Oracle全面得多.    ...

  2. 16款值得一用的iPhone线框图模板 (PSD & Sketch)

    在任何网站或移动应用设计的过程中,线框图作为设计元素和功能的图示,它有助于帮助定义和更好地传达信息层次结构,让参与设计和开发的人员更好的理解设计师的思路和设计的功能点. 即使线框图设计是一个比较耗时的 ...

  3. 什么是adb命令?以及如果高效使用他们?

    接下来 我会为大家讲解 最通俗易懂的adb命令 希望大家能够喜欢...

  4. JAVA对字符串的压缩与解压缩

    import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException; ...

  5. Python 函数式编程和OOP编程 0001测试

    # encoding: utf- stu1 = { ' } stu2 = { ' } def stu_score(stu_score): print ('%s , %s ' % ( stu_score ...

  6. 情感分析snownlp包部分核心代码理解

    snownlps是用Python写的个中文情感分析的包,自带了中文正负情感的训练集,主要是评论的语料库.使用的是朴素贝叶斯原理来训练和预测数据.主要看了一下这个包的几个主要的核心代码,看的过程作了一些 ...

  7. 如何配置JDK?

    有很多人,java都下载好,却因不会配置JDK,而无法编程.今天巩固就来教大家配置JDK.​ 第一步:将下载好的java放在D盘(最好不要占用C盘).​​​ 第二步:右击我的电脑,选择"属性 ...

  8. Java知识系列 -- 反射

    原理 要想理解 Java 反射,首先要弄清类的加载过程. 比如这行代码 Person p = new Person();. 我们想要创建一个 Person 对象,并用 p 作为对象的引用. 在 Jav ...

  9. 2018.10.22 bzoj4380: [POI2015]Myjnie(区间dp)

    传送门 区间dp好题. f[i][j][k]f[i][j][k]f[i][j][k]表示区间[i,j][i,j][i,j]最小值为kkk时的最大贡献. 然后可以枚举端点转移. 当时口胡到这儿就不会了. ...

  10. [VC++入门]指针一

    俗话说没有搞清楚指针就没有学会C/C++,所以指针是一个相当重要的东东,相当年在用 C#调用C++写的动态链接库时,以为C++中的指针就是C#中的引用类型(ref),但是看了一下却不是这样.指针当然和 ...