標籤:style blog color os io ar div cti
怪物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;}