怪物AI执行
//-----------------------------------------------主动攻击------------------------------------------------------
初始状态
attack_style Enum攻击方式 Enum主动攻击
MonsterStat EnumMonsterStat EnumMonster游荡
Monter被动Stat EnumMonster被动Stat EnumMonster被动NULL 玩家移动或者进入地图,都会通知附近玩家以及在怪物的map_nearby_player容器中加入此玩家
然后在action中_updateAttachObjsAndStat()中扫描扫描附近玩家,如果怪物是主动攻击类型就将其加入m_attach_objs容器中,并置curStat当前状态为EnumMonster追击
然后根据相应的状态执行相应的动作
追击过程:
.auto pl = get_attach_obj(m_attach_objs);//根据仇恨值获取攻击对象
.加载路线
不在四周,加载路线,单步的,如果遇到障碍则会执行传奇的绕道算法,这种算法是单步比A*算法效率高,A*算法图相对是固定的,但游戏中怪物是移动的。
.怪物发现人物在四周,开始攻击:
if(pl->second.distance <= )//如何玩家在怪物的四周
{
if(!(rand() % ))
{//攻击玩家
AttackPt att;
att.srcID = objId;
att.tgtID = pl->second.obj->objId;
att.skill_id = 普通攻击;//(nBodyID == 1003)? 9004 : 9005;
att.way = ;//直接攻击
m_map->attach(att, this, pl->second.obj);
//找到目标,取消追踪路线
m_trace_line.clear();
is_move = false;
}
if(pl->second.obj->stat.cur_hp <= )
{
cancle_attached();//此时人被打死,
}
return false;
} void MonsterObj::cancle_attached()
{
m_is_attached = false;//玩家已死,取消攻击记录
m_attach_objs.clear();//取消攻击记录
m_trace_line.clear();
is_move = false;
MonsterStat = EnumMonsterStat::EnumMonster回家;
}
.当把人打死了就把状态置为回家,回到怪物的出生地
void MonsterObj::回家()
{
if(rand() % > )//30%的概率移动
return;
pos2d obj_t_mpos = _getTgtMapPos();
if(!is_move)
{
if(!m_finder->FindPath(obj_t_mpos.x, obj_t_mpos.y, base_mpos.x, base_mpos.y))
return;
m_finder->GetPath(m_trace_line);
} //路线走完 或者 在出生点周围
if(m_trace_line.empty() /*|| isAround(当前位置,base_mpos)*/)
{
cancle_goback();
return;
}
pos2d next_mpos = m_trace_line.front();
//如果下一步不可以通过则(临时有怪物阻挡,所以要加判断)
if(isFreeMap(next_mpos.x, next_mpos.y))
{
auto old_bpos = _getBlockPos();
if(execute_trace_line())
_notify(old_bpos, _getBlockPos());
}
} .线路走完
if(m_trace_line.empty() /*|| isAround(当前位置,base_mpos)*/)
{
cancle_goback();//取消回家
return;
} .又开始游荡
void MonsterObj::cancle_goback()//取消回家计划
{
//①取消回家路线
m_trace_line.clear();
is_move = false;
MonsterStat = EnumMonsterStat::EnumMonster游荡;
} //---------------------------------------------胆小的--------------------------------------------------------
胆小的
刚开始时游荡和没有被动状态
当收到攻击时就把状态为逃跑
当逃跑线路走完时就取消攻击
void MonsterObj::cancle_attached()
{
m_is_attached = false;//玩家已死,取消攻击记录
m_attach_objs.clear();//取消攻击记录
m_trace_line.clear();
is_move = false;
MonsterStat = EnumMonsterStat::EnumMonster回家;
}
然后就回家
回家之后开始游荡 //----------------------------------------------被动的----------------------------------------------------------
//被动的(类似的)
被动的
游荡->被打了(追击)->把人打死了->回家->游荡 //-----------------------------------------------关于怪物被玩家打-----------------------------------------------
//关于被动的被玩家打
playchannel中attach,然后
auto pl_old = m_attach_objs.find(attacher->objId);
if(pl_old != m_attach_objs.end())
pl_old->second.hurt += hurt;//伤害积累,仇恨
else//新
{
AttObject attobj = {hurt, -, att_pl};
m_attach_objs[att_pl->objId] = attobj;//加入了攻击对象
}
m_is_attached = true;
is_move = false;//优先追踪被攻击的玩家。 if(Monster被动State != EnumMonster被冲撞) //因为被撞和被打回产生冲突
Monster被动State = EnumMonster被攻击; //停顿下 死亡之后经过60秒,这样根据运行AI的速度,如果运行速度是1000ms那就是,60s 置为重生状态 重生之后使其游荡

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

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

怪物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. win php nginx 配置小细节

    win下配置php Nginx 首先 下载 php-Windows版本.下载Nginx Windows 版本 1> php.ini-production 修改为 php.ini 让其成为php的 ...

  2. shell字符串操作详解

    shell字符串操作详解的相关资料. 1.shell变量声明的判断  表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DE ...

  3. WordPress 主题开发 - (八) Head模板 待翻译

    THE WORDPRESS THEME HEADER TEMPLATE Now we get into the nitty-gritty: building up your header.php an ...

  4. 使用PyInstaller将Python程序打包成一个单独的exe文件

    1. 安装步骤略过 网上教程多 2. 用cmd进入PyInstaller的目录 然后执行以下命令: python pyinstaller.py -F C:\test.py 以上命令需要把Python目 ...

  5. 13)Java static

    1.static变量      按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是:    ...

  6. Android开发环境下关于如何导出手机通讯录数据库【Written By KillerLegend】

    首先度Linux中的权限(Permissions)进行一些说明: permissions一共有10个符号位,[- --- --- ---],在这里我们从左至右由0开始编号,各个符号位的编号分别为0,1 ...

  7. selenium+python cooking用法 (转)

    selenium-webdriver(python)--cookie处理 driver.get_cookies() 获得cookie信息 add_cookie(cookie_dict)  向cooki ...

  8. java软件包的访问权限和继承

    public:公共权限,可以修饰类.成员变量和成员函数,不论是否在同一个包中均可自由访问 package wang; //当一个类的权限为public时,类名必须和文件名相同 public class ...

  9. EMVTag系列8《IC卡公钥证书》

    Ø  9F46    IC卡公钥证书 L: NI -C(有条件):如果支持DDA 发卡行认证过的IC 卡公钥 Ø  9F47    IC卡公钥指数 F: b T: 9F47 L: 1 or 3 C:如 ...

  10. poj 1985 Cow Marathon

    题目连接 http://poj.org/problem?id=1985 Cow Marathon Description After hearing about the epidemic of obe ...