1. 怪物AI执行
  2. //-----------------------------------------------主动攻击------------------------------------------------------
  3. 初始状态
  4. attack_style Enum攻击方式 Enum主动攻击
  5. MonsterStat EnumMonsterStat EnumMonster游荡
  6. Monter被动Stat EnumMonster被动Stat EnumMonster被动NULL
  7.  
  8. 玩家移动或者进入地图,都会通知附近玩家以及在怪物的map_nearby_player容器中加入此玩家
  9. 然后在action_updateAttachObjsAndStat()中扫描扫描附近玩家,如果怪物是主动攻击类型就将其加入m_attach_objs容器中,并置curStat当前状态为EnumMonster追击
  10. 然后根据相应的状态执行相应的动作
  11. 追击过程:
  12. .auto pl = get_attach_obj(m_attach_objs);//根据仇恨值获取攻击对象
  13. .加载路线
  14. 不在四周,加载路线,单步的,如果遇到障碍则会执行传奇的绕道算法,这种算法是单步比A*算法效率高,A*算法图相对是固定的,但游戏中怪物是移动的。
  15. .怪物发现人物在四周,开始攻击:
  16. if(pl->second.distance <= )//如何玩家在怪物的四周
  17. {
  18. if(!(rand() % ))
  19. {//攻击玩家
  20. AttackPt att;
  21. att.srcID = objId;
  22. att.tgtID = pl->second.obj->objId;
  23. att.skill_id = 普通攻击;//(nBodyID == 1003)? 9004 : 9005;
  24. att.way = ;//直接攻击
  25. m_map->attach(att, this, pl->second.obj);
  26. //找到目标,取消追踪路线
  27. m_trace_line.clear();
  28. is_move = false;
  29. }
  30. if(pl->second.obj->stat.cur_hp <= )
  31. {
  32. cancle_attached();//此时人被打死,
  33. }
  34. return false;
  35. }
  36.  
  37. void MonsterObj::cancle_attached()
  38. {
  39. m_is_attached = false;//玩家已死,取消攻击记录
  40. m_attach_objs.clear();//取消攻击记录
  41. m_trace_line.clear();
  42. is_move = false;
  43. MonsterStat = EnumMonsterStat::EnumMonster回家;
  44. }
  45. .当把人打死了就把状态置为回家,回到怪物的出生地
  46. void MonsterObj::回家()
  47. {
  48. if(rand() % > )//30%的概率移动
  49. return;
  50. pos2d obj_t_mpos = _getTgtMapPos();
  51. if(!is_move)
  52. {
  53. if(!m_finder->FindPath(obj_t_mpos.x, obj_t_mpos.y, base_mpos.x, base_mpos.y))
  54. return;
  55. m_finder->GetPath(m_trace_line);
  56. }
  57.  
  58. //路线走完 或者 在出生点周围
  59. if(m_trace_line.empty() /*|| isAround(当前位置,base_mpos)*/)
  60. {
  61. cancle_goback();
  62. return;
  63. }
  64. pos2d next_mpos = m_trace_line.front();
  65. //如果下一步不可以通过则(临时有怪物阻挡,所以要加判断)
  66. if(isFreeMap(next_mpos.x, next_mpos.y))
  67. {
  68. auto old_bpos = _getBlockPos();
  69. if(execute_trace_line())
  70. _notify(old_bpos, _getBlockPos());
  71. }
  72. }
  73.  
  74. .线路走完
  75. if(m_trace_line.empty() /*|| isAround(当前位置,base_mpos)*/)
  76. {
  77. cancle_goback();//取消回家
  78. return;
  79. }
  80.  
  81. .又开始游荡
  82. void MonsterObj::cancle_goback()//取消回家计划
  83. {
  84. //①取消回家路线
  85. m_trace_line.clear();
  86. is_move = false;
  87. MonsterStat = EnumMonsterStat::EnumMonster游荡;
  88. }
  89.  
  90. //---------------------------------------------胆小的--------------------------------------------------------
  91. 胆小的
  92. 刚开始时游荡和没有被动状态
  93. 当收到攻击时就把状态为逃跑
  94. 当逃跑线路走完时就取消攻击
  95. void MonsterObj::cancle_attached()
  96. {
  97. m_is_attached = false;//玩家已死,取消攻击记录
  98. m_attach_objs.clear();//取消攻击记录
  99. m_trace_line.clear();
  100. is_move = false;
  101. MonsterStat = EnumMonsterStat::EnumMonster回家;
  102. }
  103. 然后就回家
  104. 回家之后开始游荡
  105.  
  106. //----------------------------------------------被动的----------------------------------------------------------
  107. //被动的(类似的)
  108. 被动的
  109. 游荡->被打了(追击)->把人打死了->回家->游荡
  110.  
  111. //-----------------------------------------------关于怪物被玩家打-----------------------------------------------
  112. //关于被动的被玩家打
  113. playchannelattach,然后
  114. auto pl_old = m_attach_objs.find(attacher->objId);
  115. if(pl_old != m_attach_objs.end())
  116. pl_old->second.hurt += hurt;//伤害积累,仇恨
  117. else//新
  118. {
  119. AttObject attobj = {hurt, -, att_pl};
  120. m_attach_objs[att_pl->objId] = attobj;//加入了攻击对象
  121. }
  122. m_is_attached = true;
  123. is_move = false;//优先追踪被攻击的玩家。
  124.  
  125. if(Monster被动State != EnumMonster被冲撞) //因为被撞和被打回产生冲突
  126. Monster被动State = EnumMonster被攻击; //停顿下
  127.  
  128. 死亡之后经过60秒,这样根据运行AI的速度,如果运行速度是1000ms那就是,60s
  129.  
  130. 置为重生状态
  131.  
  132. 重生之后使其游荡

今天看到那个定时器是100ms,然后运行60次怎么回事1分钟,找了半天原来现在怪物有了速度的概念

  1. bool NPC::isRunAI()
  2. {
  3. unsigned int now = GetTickCount();
  4. if(now - cur_run_time < cur_run_speed//当时看这个正好是1000,所以本来是100ms的,强制成了1s,我找了半天才知道咋回事。
  5. {
  6. return false;
  7. }
  8. cur_run_time = now;
  9. return true;
  10. }

怪物AI(复习)的更多相关文章

  1. 怪物AI之发现玩家(视觉范围发现系列)

    在网上找到一些资料参考,然后写写自己的想法. 这里感谢MOMO等大神. 我们用玩家检测怪物的方法来测,这样比较试用与弱联网游戏,每次在同步玩家的时候来判断玩家与怪物的位置. 这里给出两个处理方式: 1 ...

  2. [Unity3D]Unity3D游戏开发之怪物AI

    大家好.欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei.        在上一篇文章中,我们基本上实现了一个 ...

  3. 简单3d RPG游戏 之 003 怪物AI

    游戏中,怪物会自动的往玩家所在地点走去,那需要创建一个C#脚本EnemyAI,包含两个功能: 1. 怪物旋转自己对准玩家 2. 怪物向前移动,追逐玩家 public class EnemyAI : M ...

  4. 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...

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

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

  6. 游戏AI系列内容 咋样才能做个有意思的AI呢

    游戏AI系列内容 咋样才能做个有意思的AI呢 写在前面的话 怪物AI怎么才能做的比较有意思.其实这个命题有点大,我作为一个仅仅进入游戏行业两年接触怪物AI还不到一年的程序员来说,来谈这个话题,我想我是 ...

  7. AI 状态机

    by AKara 2010-11-11 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras 一个简单横版游戏 ...

  8. MMORPG战斗系统随笔(三)、AI系统简介

    在设计一款游戏的时候,如果我们是玩家,是希望自己能够操作角色畅玩游戏的.在一款MMORPG游戏中,大部分的实际游戏角色,是需要玩家来操作的,通过在游戏大世界相互完成游戏中的任务等等来体验游戏.在大世界 ...

  9. 从服务器角度分析RPG游戏——NPC的AI

    最近主程有些忙,甩给我一些服务器的代码,零零散散总结了一些要素. java程序架构也是层层分析,先罗列出需要做的工作,然后从主干到细节依次实现.就这点而言,程序和绘画有很多类似的地方. 关于怪物AI类 ...

随机推荐

  1. 操作MySQL数据库

    向表中插入数据 insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下: insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, ...

  2. php简单缓存类

    <?phpclass Cache {    private $cache_path;//path for the cache    private $cache_expire;//seconds ...

  3. Mac 安装 Tomcat

    默认mac已经安装好java jdk-----/Library/Java/JavaVirtualMachines 1. http://tomcat.apache.org/download-70.cgi ...

  4. php 安装pdo_mysql 扩展

    如果pdo在linux下出现exception 'PDOException' with message 'could not find driver'则问题是php编译时少加--with-pdo-my ...

  5. Pure扩展站--个人博客

    作为自己css的练习站:http://1111.oyostar.com/.更新自己扩展pure写的css,外加一些jquery的插件.感谢朋友的空间和子域名!

  6. jqGrid(2)

    jqGrid使用方法: 原文地址:http://blog.csdn.net/y0ungroc/article/details/12008879 1. 下载文件 1.     下载jqGrid的软件包, ...

  7. 【C#】 装箱 (boxing) 和拆箱 (unboxing)

    目录: 1. 装箱和拆箱 2. 深入理解装箱和拆箱 3. int[] to object[],值类型数组到对象数组的转化 4. 使用泛型减少装箱和拆箱 1.  装箱和拆箱 装箱 就是把“值类型”转换成 ...

  8. .NET开源工作流RoadFlow-流程设计-流程步骤设置-基本设置

    流程属性设置完成后点击确定之后,即可进行流程步骤设置了. 点击工具栏上的步骤按钮,即可添加一个新步骤. 在新步骤图形上双击即可弹出该步骤相应属性设置框. 步骤ID:系统自动为该步骤生成的唯一ID. 步 ...

  9. uninstall 11.2.0.3.0 grid & database in linux 5.7

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...

  10. 数组链表下标指针map list

    1.时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间 ...