生活随笔
收集整理的這篇文章主要介紹了
cocos2d-x 2x 菜鸟编塔防 02 添加敌人
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面我們呢來編寫一個敵人類,這個類目前主要有如下幾個功能:
實現各個方向的幀動畫切換從起點走到終點可改變行走速度到達終點后消失是不是覺得功能有點少啊,還是那句話,以后慢慢添加。
寫在最前面:
首先說說怎么實現上面說的這幾個功能,流程如下:
第一步.首先我是定義了幾個可能用到的私有變量
?????????CCSprite??*?_creep; ??int?_creepHP; ??float?_CreepMoveSpeed; ??int?_wayPointNow; ??int?_nowDirection; ??bool?_moving;? 這幾個變量的用途很簡單,大部分都能看懂,說說幾個用途很亂的吧(新手沒辦法)
int _wayPointNow;? 上面這個就是保存了敵人行走的路點序號,就是敵人剛剛走過的路點,比如:敵人走過了a路點,正向著b路點前進,_waypoint就是路點A 。這樣說明白了吧。(路點我是為了測試自己瞎寫的)
這個路點的序號作用是什么呢?
塔防嗎,就要有敵人按照路徑走到一個終點,在這走的過程中會有許多轉彎的地方,敵人有一個行走的幀動畫,在變化方向的時候,我們也要讓動畫做相應的改變,這樣看著才有意思。我是這樣讓敵人切換轉向的:通過比對當前路點和下一個路點得出相對的方向,也就是一個坐標系中a,b兩點,b點在a點的上面還是下面,左還是右。得到這個方向之后我們就可以寫個函數改變敵人的動畫了。
?第二步. 初始化一些參數
?
????_CreepMoveSpeed?=?100; ????_creepHP?=?100; ????_wayPointNow?=?0; ????_nowDirection=?getDirection(); ????????_moving?=?false; ?_creep??=?CCSprite::create(); ??_creep->setTag(kSprite); ??_creep->setPosition(sHWorld->_wayPoint->getControlPointAtIndex(_wayPointNow)); ??setDirectionAnimation(getDirection()); ??this->addChild(_creep);? 第17行的setDirectionAnimation就是一個改變動畫方向的函數,其參數就是一個關于放心的枚舉,getDirection就是計算方向.
第三步:永遠運行的游戲邏輯
在初始化init函數最后加上
schedule(schedule_selector(mC_Creep::gamelogic));? 讓每幀都調用gamelogic函數
?
void?mC_Creep::gamelogic(?float?dt?) ??{ ?????????????????if(!_moving)?creepMove(); ????? ??????if?(_creepHP?==?0?) ??????{ ??????????this->stopAllActions(); ??????????this->unscheduleAllSelectors(); ??????????sHWorld->_creepGroup->removeObject(this,true); ??????????this->removeChildByTag(kSprite,true); ??????} ???}? 首先判斷,如果不是在移動就會判斷一下,當HP為0?的時候(被敵人殺死,或者走到了終點我就設置HP 為0),我就做了一些釋放,SHworld是用來保存所有的敵人的一個CCArray,作用以后再說。
看看CreepMove函數有什么東西:
?
void?mC_Creep::creepMove() ??{?? ??????????????????????????CCActionInterval?*?t_Action?=?CCMoveTo::create( ??????????????????computeFinishTime(),??????????????????sHWorld->_wayPoint->getControlPointAtIndex(_wayPointNow+1)??????????????????); ????????????????????????????t_Action->setTag(kSpeedAction); ????????????????????????????CCCallFunc?*?callfun?=?CCCallFunc::create(this,callfunc_selector(mC_Creep::movebyActionCallBack)); ????????????????????????????CCFiniteTimeAction?*?seq?=?CCSequence::create(t_Action,callfun,NULL); ????????????????????????????CCSpeed?*?speedaction?=?CCSpeed::create((CCActionInterval?*)seq,1.0f); ??????????????speedaction->setTag(kSpeedAction); ????????????????????????????_moving?=?true; ????????????????????????????_creep->runAction(speedaction); ????????? ??}? 首先是一個moveto動畫,computeFinishTime是用路程除以速度得到的時間,當然這路程是一小段一小段的直線距離。
最后看看
?
void?mC_Creep::movebyActionCallBack() ?{ ????_moving?=?false; ??do? ??{ ?????????????????_wayPointNow++; ????????????if(_wayPointNow>(sHWorld->_wayPoint->count()))? ??????{ ????????????????????_creep->stopAllActions(); ????????????????????_creepHP?=?0; ????????????????????_moving?=?true; ??????????break; ??????} ?????????????setDirectionAnimation(getDirection()); ????? ??}?while?(0); ??}? 基本上也就這個意思了,我是個新手水平肯定是不高的,如果有錯誤請指出,歡迎。
?
轉載于:https://blog.51cto.com/farsa/1137360
總結
以上是生活随笔為你收集整理的cocos2d-x 2x 菜鸟编塔防 02 添加敌人的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。