大佬教程收集整理的这篇文章主要介绍了[cocos2dx学习笔记]用cocos2dx3.X完成塔防游戏王国保卫战--防御塔(七)之士兵,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
上一章讨论到兵营塔,兵营塔的关键在于士兵,士兵的一切动作,包括升级都在士兵类中完成,代码部分在Soilder文件夹中。
士兵的类型多种多样,不光兵营塔有士兵,法师塔与炮塔在升级到4级后均可以产生出一种士兵
typedef enum{ SoldierStateNone = 0,//无状态 SoldierStateRun,//行走 SoldierStateHit,//攻击 SoldierStateDeath,//死亡 SoldierStateWait,//寻找敌人 SoldierStateSkill1,SoldierStateSkill2 }SoldierState; class BaseSoldier : public Sprite { public: CC_SYNTHESIZE(float,maxHp,MaxHp); CC_SYNTHESIZE(float,currHp,CurrHp); CC_SYNTHESIZE(float,force,ForcE); CC_SYNTHESIZE(float,armor,Armor); CC_SYNTHESIZE(float,hpPercentage,HpPercentagE); CC_SYNTHESIZE(SoldierState,state,StatE); CC_SYNTHESIZE_READONLY(ProgressTimer*,hpBar,HpBar); CC_SYNTHESIZE(Point,LOCATIOn,LOCATIOn); Sprite* baseSprite; virtual void runToLOCATIOn(Point point); virtual bool init(); BaseMonster* nearestMonster; virtual void updateSoldier(int level){}; protected: virtual void createAndSetHpBar(); Sprite* hpBgSprite; virtual void lookingForMonsters(float dt); virtual void checkNearestMonster(); virtual void attack(); virtual void update(float dt){}; virtual void runToDesTination(Point desTination,bool isAttacking){}; SoldierState lastState; virtual void stopSoldierAnimation(); void checkDirection(Point point); //false右边true左边 virtual bool checkDirectionForMonster(); float caculateTime(Point point); virtual void runToMonster(); virtual void attackMonster(float dt){}; int attackCount;//用于判断是否该释放技能了 };
根据nearestMonster判断是否有敌人可以攻击,原理与防御塔相同,不同之处在于有一个走到敌人面前,并且与敌人搏斗的过程
当防御塔调用设置集结点方法后,调用每个士兵的runToLOCATIOn方法,使得士兵走到目的地,并且将状态设置成SoldierStateWait
最后添加一个定时器,相隔1秒调用lookingForMonsters检测附近敌人。
void BaseSoldier::runToLOCATIOn(Point point) { if(getState()!=stateDeath){ unscheduleAllCallBACks(); scheduleupdate(); stopAllActions(); if((point.x - this->getPositionX())>0){ baseSprite->setFlippedX(false);//翻转,面向右边 }else{ baseSprite->setFlippedX(true); } setState(SoldierStateRun); runAction(Sequence::create(MoveTo::create(caculateTime(point),point),CallFuncN::create(CC_CALLBACK_0(BaseSoldier::setState,this,SoldierStateWait)),NULL)); schedule(schedule_SELEctor(BaseSoldier::lookingForMonsters),1.0f,-1,caculateTime(point)); } }
if (monster->getAttackBySoldier() && distance < 50 && (!monster->getIsAttacking())) { nearestMonster = monster; nearestMonster->stopWalking(); nearestMonster->setIsAttacking(true); break; }士兵的动画与敌人相同,都写在update(float dt)中,根据enum中的状态更新动画
若NearestMonster不为空,会执行attack,士兵会走到敌人面前,转身面向敌人,攻击(attackMonster(float dt)方法,dt可以看做是攻击速度,每隔dt敌人血量减少1次)
不同的士兵复写attackMonster方法,实行不同的攻击判断或者技能
如下
if(monsterCurrHp == 0){//若敌人死亡 unschedule(schedule_SELEctor(Assassin::attackMonster)); nearestMonster->death();//更新敌人状态,执行四万动画 if(this->getCurrHp()>0) runToLOCATIOn(LOCATIOn);//若士兵没死,走回地点 } if(SoldierHp == 0){//若士兵死亡 lastState = SoldierStateDeath; setState(SoldierStateDeath);//更新状态 unscheduleAllCallBACks();//取消所有定时器 stopAllActions(); baseSprite->stopAllActions();//去下所有动画 if(nearestMonster != NULL && nearestMonster->getCurrHp()>0){ nearestMonster->restartWalking();//敌人胜利,敌人继续向前大步走 nearestMonster->setIsAttacking(false); } baseSprite->runAction(Sequence::create//士兵死亡动画序列 (CallFuncN::create(CC_CALLBACK_0(Assassin::setState,SoldierStateDeath)),Animate::create(AnimationCache::geTinstance()->getAnimation("Assassin_dead")),FadeOut::create(1.0f),NULL)); }
baseSprite->setSpriteFrame(SpriteFrameCache::geTinstance()->getSpriteFrameByName(String::createWithFormat("soldier_lvl%d_0001.png",level)->getCString()));
根据这个思路实现可以实现不同的士兵,仅仅是动画贴图不同,稍复杂的就是图中的坦克车,比普通士兵多一个导弹,相比士兵而言更像是防御塔而已
以上是大佬教程为你收集整理的[cocos2dx学习笔记]用cocos2dx3.X完成塔防游戏王国保卫战--防御塔(七)之士兵全部内容,希望文章能够帮你解决[cocos2dx学习笔记]用cocos2dx3.X完成塔防游戏王国保卫战--防御塔(七)之士兵所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。