怪物AI(复习)

怪物AI执行
//-----------------------------------------------主动攻击------------------------------------------------------
初始状态
attack_style      Enum攻击方式              Enum主动攻击
MonsterStat          EnumMonsterStat          EnumMonster游荡
Monter被动Stat    EnumMonster被动Stat     EnumMonster被动NULL

玩家移动或者进入地图,都会通知附近玩家以及在怪物的map_nearby_player容器中加入此玩家
然后在action中_updateAttachObjsAndStat()中扫描扫描附近玩家,如果怪物是主动攻击类型就将其加入m_attach_objs容器中,并置curStat当前状态为EnumMonster追击
然后根据相应的状态执行相应的动作
追击过程:
1.auto pl = get_attach_obj(m_attach_objs);//根据仇恨值获取攻击对象
2.加载路线
不在四周,加载路线,单步的,如果遇到障碍则会执行传奇的绕道算法,这种算法是单步比A*算法效率高,A*算法图相对是固定的,但游戏中怪物是移动的。
3.怪物发现人物在四周,开始攻击:
if(pl->second.distance <= 1)//如何玩家在怪物的四周
{
    if(!(rand() % 2))
    {//攻击玩家
        AttackPt att;
        att.srcID = objId;
        att.tgtID = pl->second.obj->objId;
        att.skill_id =  普通攻击;//(nBodyID == 1003)? 9004 : 9005;
        att.way = 1;//直接攻击
        m_map->attach(att, this, pl->second.obj);
        //找到目标,取消追踪路线
        m_trace_line.clear();
        is_move = false;
    }
    if(pl->second.obj->stat.cur_hp <= 0)
    {
        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回家;
}
4.当把人打死了就把状态置为回家,回到怪物的出生地
void MonsterObj::回家()
{
    if(rand() % 100 > 30)//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());
    }
}

5.线路走完
if(m_trace_line.empty() /*|| isAround(当前位置,base_mpos)*/)
{
    cancle_goback();//取消回家
    return;
}

6.又开始游荡
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, -1, 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(复习),布布扣,bubuko.com

时间: 2024-10-29 19:05:43

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

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

在网上找到一些资料参考,然后写写自己的想法. 这里感谢MOMO等大神. 我们用玩家检测怪物的方法来测,这样比较试用与弱联网游戏,每次在同步玩家的时候来判断玩家与怪物的位置. 这里给出两个处理方式: 1.碰撞器R范围检测. 2.地图分块范围检测. 这两种处理方式适用于不同的游戏. 再讲解这两种方式之前,我们先了解一下一个核心问题,怪物在玩家R半径内时怎么判断怪物是否在玩家视觉范围内. 如下图 在图中, 玩家的位置与怪物的位置会成一个向量.设为V1 怪物的朝向也是一个向量.设为V2 如果怪物能看到6

Unity 怪物AI

using UnityEngine; using System.Collections; public class moster_AI : MonoBehaviour { public const int AI_Null = 10;     public const int AI_Idle = 0;     public const int AI_Patrol =1;     public const int AI_Pursuit =2;     public const int AI_Atta

Cocos2d-x 怪物智能AI怪物也有智商----之游戏开发《赵云要格斗》(6)

       这里是Evankaka的博客,欢迎大家前面讨论与交流------       转载请注明出处http://write.blog.csdn.net/postedit/42611031 这几天一直在研究怪物的AI,博客都没怎么更新.本文将主要来讲讲游戏开发中的怪物智能,一个好的游戏一般怪物都要分等级,这样我们游戏玩起来才有意思,怪物如果智商太高,游戏难度大.怪物如果智商太低,游戏玩起来又没有意思.一般好的游戏低级怪物和中级怪物占大部分,高级怪物一般是BOSS级怪物.下面我来讲讲自己对怪

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

最近主程有些忙,甩给我一些服务器的代码,零零散散总结了一些要素. java程序架构也是层层分析,先罗列出需要做的工作,然后从主干到细节依次实现.就这点而言,程序和绘画有很多类似的地方. 关于怪物AI类型,一般可以分为下列几类: // NPCai性格 public static final int MONSTER_CHARACTER_PASSIVITY = 1; // 被动怪,不打我我不打你,打我我打你 public static final int MONSTER_CHARACTER_ACTIV

node.js适合游戏后台开发吗?

网站服务器和游戏服务器是怎么样联系到一起的? 百牛信息技术bainiu.ltd整理发布于博客园 1. 游戏分很多种,咱们先来看看MMORPG. 再怎么简单的RPG服务器都免不了处理多人交互的情形,上百人在同一个场景里面,每个客户端都需要收到其他所有人的操作信息. 其次,用户的操作是非常频繁的,一般的服务器倾向于持有长连接.而且这些链接的是频繁交互的,没有明显的持久的分区策略,所以限制了服务器的横向扩展,同一个场景往往只能放在一个物理机上面运行. 再次,端游通常是不敢把逻辑运算放客户端的,用户分分

Unity 3D实现帧同步技术

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 现在竞技类网络游戏比较火,市面上也出现了很多这种类型的游戏竞赛,提到网络游戏就回避不了一个问题:同步技术,多个人在一个游戏场景围攻一个怪物或者说多人组队战斗等等.现在在移动端的游戏由

2D丛林逃生

游戏介绍: 游戏地图采用二维数组:     每一个小块(Piece)类         上面有一个类型(StuffType)用于判断该小块上面站着的是什么 怪物,玩家,血瓶等等     怪物AI:         并不是采用A星算法     游戏两个版本:         Windows和Android直接发布成APK包, 代码会自动判断转换成android控制模式   下载地址: http://yunpan.cn/cQTN7eTg6Z98h  访问密码 b7d3

map线程

来看看map线程到底是如何运行的 很早就知道一个map是一个线程,以后有可能改成一个map一个进程,那就先来看看一个map一个线程是如何运作的 其实刚开始整个服务器就是两个线程,但发现这样服务器支持的人数不多,其实我是刚来具体不太清楚到底咋回事,也没有网络进程,最开始就是将GameMap从GameServer中分离出去,单独一个模块 经理说将GameServer相当于一个总闸的作用,相关的map相关的动作放到GameMap里面去做 NEW(Map); class Map : public Map

手游开发攻防——二、基础篇(持续更新)

不好意思,最近公司成员扩招,然后技术培训,项目事宜原因,因此这篇文章等到现在才出. 好了,不多说其它. 文章适合人群:对Unity基础组件有一些了解的,想知道怎么在项目中具体应用各种组件. 这篇文章以一个Asset Store上面的例子"Unity Projects Stealth"来讲解Unity的一些知识.所以可能你要对Unity一些概念有个了解.另外,这个例子"Unity Projects Stealth.unitypackage"我已经分享到http://p