cocos2dx 生成怪物及AI

2022-04-12 14:34:43 字數 3828 閱讀 8504

接上一節內容:cocos2dx - tmx地圖分層移動處理

本節怪物及簡單ai實現

一、怪物

同cocos2dx - v2.3.3編輯器骨骼動畫 裡建立的cplalyer一樣,新建乙個cmonster類,也可以提出乙個公共基類ientity,為了以後擴充套件其他型別的實體做準備。

這裡怪物還要有乙個ai的實體類caimodule類。

相對玩家主要新增以下:

//

init方法中新增如下

m_paimodule =caimodule::create();

this->addchild(m_paimodule);

同時對移動和攻擊進行修改

void cmonster::move(float

delta)

}else

setpositionx(getpositionx() +dx);

m_deltax = delta -dx;

playaction(act_run);

//設定當前的方向

setscalex(delta >0? -1 : 1

); }

}//攻擊結束動作處理

m_paction->play("attack", false);

std::function func = [this]()

};m_paction->setlastframecallfunc(func);  

以上主要在移動和攻擊結束的時候呼叫了ai模組的動作**。

二、ai模組

本節只是實現最簡單的ai機制,直接將策略寫在了update中,在間隔乙個thinktime時間後判斷當前最優行動,並執行動作。

如下:

void caimodule::update(float

dt) m_ptarget =pplayer;

m_ptarget->retain();

m_nstep = 0

; m_nthinktime = 0

;

float dis = pmonster->getposition().distance(pplayer->getposition());

if (dis <200

)

else}}

}}

以上直接設定ai執行物件為玩家,在距離小於200執行攻擊,否則向玩家節點靠近移動。同時清楚當前 m_nthinktime時間,在下乙個決策時間到來之前怪物會根據動作步驟持續執行當前動作。

所以這裡也需要設定一下動作的當前m_nstep為0,同時設定一下執行的函式m_stepfunc。

為了能夠在怪物攻擊或者移動結束後m_nstep執行到下一步,實現了乙個onactioncallback函式。如下:

void

caimodule::onactioncallback()

}

這樣即可實現簡單的ai移動效果,讓擁有該ai物件的怪物,不斷靠近玩家並且攻擊玩家。

caimodule全**如下:

#ifndef __caimodule_h__

#define __caimodule_h__#include

"igamedef.h

"#include

"cocos2d.h

"using_ns_cc;

class caimodule : public

node

;#endif __caimodule_h__#include

"aimodule.h

"#include

"monster.h

"#include

"battlemgr.h

"#define thinktime (1000) //

決策時間

caimodule::caimodule() :m_nthinktime(thinktime), m_ptarget(nullptr), m_stepfunc(nullptr), m_nstep(0)

caimodule::~caimodule()

}bool

caimodule::init()

void caimodule::update(float

dt) m_ptarget =pplayer;

m_ptarget->retain();

m_nstep = 0

; m_nthinktime = 0

;

float dis = pmonster->getposition().distance(pplayer->getposition());

if (dis <200

)

else}}

}}void caimodule::attack(node* penemy, int

step)

switch

(step)

//立即攻擊

if (isfartherthan(pmonster->getpositionx() < penemy->getpositionx(), 30

))

else

}break

;

case1:

//調整方向準備攻擊

pmonster->setscalex(pmonster->getpositionx() < penemy->getpositionx() ? -1 : 1

); ++m_nstep;

std::function

func = [this

]() ;

this->runaction(sequence::create(delaytime::create(0.3

), callfunc::create(func), null));

}break

;

case2:

break

;

default

:

//m_nthinktime = thinktime;

break

; }

}void caimodule::move2node(node* pnode, int

step)

cmonster* pmonster = dynamic_cast(getparent());

if (!pmonster)

switch

(step)

else

}break

;

default

:

//m_nthinktime = thinktime;

break

; }

}void

caimodule::onactioncallback()

}

view code

附上實現後的效果圖:

1、這是自動朝著玩家走

2、這是在靠近玩家後進行攻擊

cocos2d x離線文件生成

cocos2d x的原始碼下已經有doxygen的工程,可以直接生成原始碼的文件。1.安裝doxygen svn co doxygen svncd doxygen svn.configuremakesudo make install2.生成文件 進入cocos2d x原始碼目錄下的doxygen目錄...

cocos2d x生成隨機數

獲取系統時間 time t是long型別,精確到秒,通過time 函式可以獲得當前時間和1970年1月1日零點時間的差 time ttt time tt structtm now 獲得本地時間 now localtime tt cclog d d d d d d now tm year 1900,n...

cocos2d x 資源集合

官網 主席子龍山人 archive 2011 08 08 2131019.html kmyhy的專欄 老g的小屋 cocos2d xtouch事件cocos2d 事件冒泡規律 和 ccmenu一直響應事件的解決辦法 swallow touches how to setmultipletouchena...