cocos2d-x开发之动作游戏实战--3
现在只有hero一个在走来走去没什么意思,现在添加几个npc,给hero点压力,好的那就开始吧!
添加enemy.h文件和enemy.h文件
#ifndef_ENEMY_H_//66#define_ENEMY_H_#include"cocos2d.h"#include"DBgame.h"#defineMaxBuf20usingnamespacecocos2d;classEnemy:publicCCNode{public:Enemy(void);~Enemy(void);//静态方法用于创建hero实例staticEnemy*monster(char*monsterName);voidsetAnimation(Directiondir,Behaviourbe,char*monsterName);DirectiongetDirection();BehaviourgetBehaviour();voidgetCurrentAnimationIndex();voidboxAttacked(Directiondir,Behaviourbe,inti);voidboxAttackedDone(CCNode*pSender,void*i);voidportal(Directiondir,Behaviourbe,inti);voidportalDone(CCNode*pSender,void*i);voidcube(Directiondir,Behaviourbe,inti);voidcubeDone(CCNode*pSender,void*i);voidexecuteAnimation(Directiondir,Behaviourbe,intnextAni,char*monsterName);voidexecuteDone(CCNode*pSender,void*i);voiddeadAnimation(intid,char*monsterName);voidenemyDeadAnimation(intid,char*monsterName);voidenemyDeadAnimationDone();voidenemypDingDeadAnimation(intid,char*monsterName);voidenemypDingDeadAnimationDone();voidenemyWingDeadAnimation(intid,char*monsterName);voidenemyWingDeadAnimationDone();voiddingDead(intid,char*monsterName);voiddingDeadDone();intgetDeadID();intid;voidpDingDead(intid,char*monsterName);voidpDingDeadDone();intgetpDingDeadID();intpId;intwID;intgetWingDeadID();//voidwingDead(intid,char*monsterName);//voidwingDeadDone();CCRectgetRect();CCRectgetCollisionRect(intwidth,intheight);Behaviourbehaviour;Directiondirection;voidjump();CCSprite*getMonsterSprite();CCAnimate*getAnimate(char*monsterName);protected:CCAnimation*getAnimation();CCSprite*sprite;floatxVel;floatyVel;CCPointtouchPoint;boolinit(char*monsterName);};#defineMAXLIFE100classEnemyData{public://yDing42EnemyData(void);floatgetMonsterHeight(inti);//voidinitMonsterHeightArray(inti);voidsetMonsterHeight(floatheight,inti);intgetEnemyLife(inti);voidsetEnemyLife(intlife,inti);floatgetActionTime(inti);voidsetActionTime(floatval,inti);CCPointgetPositionMonster(inti);voidsetPositionMonster(CCPointpos,inti);private://CCMutableArray<float*>*monsterHeight;CCPointmonPosition[MaxBuf];floatactionTime[MaxBuf];intenemyLife[MaxBuf];floatmonsterHeightArray[MaxBuf];};#endif//
enemy.h文件
#include"enemy.h"//497#include"cocos2d.h"#include"core\boy.h"#include"DBgame.h"#include"core\Animation.h"usingnamespacecocos2d;Enemy::Enemy(){xVel=0;yVel=0;}Enemy::~Enemy(){}Enemy*Enemy::monster(char*monsterName){Enemy*monster=newEnemy();if(monster&&monster->init(monsterName)){monster->autorelease();returnmonster;}CC_SAFE_DELETE(monster);returnNULL;}boolEnemy::init(char*monsterName){boolbRet=false;do{//printf("hello-------------\n");this->setAnchorPoint(CCPointZero);//创建动画//sprite=CCSprite::spriteWithSpriteFrameName("yDing_0.png");charcharBuffer[128]="\0";sprintf(charBuffer,"%s_0.png",monsterName);//CCLOG("hello-------------%s",charBuffer);sprite=CCSprite::spriteWithSpriteFrameName(charBuffer);//yDing,pDingsprite->setAnchorPoint(CCPointZero);this->addChild(sprite);//设置状态constchar*str=charBuffer;if(strcmp("box_0.png",str)==0){//CCLOG("BOX------------------");behaviour=MOVE;direction=BOVERLOOK;}elseif(strcmp("pDing_0.png",str)==0){//CCLOG("BOX------------------");behaviour=MOVE;direction=MOVERLOOK;}elseif(strcmp("wing_0.png",str)==0){behaviour=MOVE;direction=WLEFT;}elseif(strcmp("yDing_0.png",str)==0){behaviour=MOVE;//behaviour=DEAD;direction=MOVERLOOK;//direction=REMOVE;}elseif(strcmp("portal_0.png",str)==0){behaviour=MOVE;//behaviour=DEAD;direction=PORTALONE;sprite->setIsVisible(false);//direction=REMOVE;}elseif(strcmp("cube_0.png",str)==0){behaviour=MOVE;direction=CUBEONE;}//behaviour=MOVE;//direction=MOVERLOOK;//direction=MATTACK;CCAction*action=CCRepeatForever::actionWithAction(getAnimate(monsterName));//monsterName---"yDingpDing"//sprite->runAction(CCRepeatForever::actionWithAction(getAnimate()));sprite->runAction(action);//bRet=true;}while(0);returnbRet;}voidEnemy::getCurrentAnimationIndex(){/*假设有一个CCAnimation*anim,由5张图组成。将这个anim包装成CCAnimate*animate。使用的时侯sprite->runAction(animate),播放动画。*///这里我们来获取第几帧:intcurrentAnimIndex=0;//精灵当前播放的是第几帧CCAnimation*anim=getAnimation();for(inti=1;i<4;i++){//CCLOG("animIndex");//5张图5帧if(sprite->displayedFrame()==anim->getFrames()->getObjectAtIndex(i)){//这个i返回的只是一个索引,如果帧数是从1开始计算就要+1currentAnimIndex=i+1;CCLOG("animaIndex:%d",currentAnimIndex);}}}CCSprite*Enemy::getMonsterSprite(){returnthis->sprite;}voidEnemy::boxAttacked(Directiondir,Behaviourbe,inti){behaviour=be;direction=dir;this->cleanup();sprite->cleanup();CCAction*sequneceAction=CCSequence::actions(getAnimate("box"),CCCallFuncND::actionWithTarget(this,callfuncND_selector(Enemy::boxAttackedDone),(void*)i),NULL);sprite->runAction(sequneceAction);}//--------------------2013.3.3----------------------------------//下一关的通道有关函数voidEnemy::portal(Directiondir,Behaviourbe,inti){behaviour=be;direction=dir;sprite->setIsVisible(true);this->cleanup();sprite->cleanup();CCAction*sequneceAction=CCSequence::actions(getAnimate("portal"),CCCallFuncND::actionWithTarget(this,callfuncND_selector(Enemy::portalDone),(void*)i),NULL);sprite->runAction(sequneceAction);}voidEnemy::portalDone(CCNode*pSender,void*i){intj=(int)i;if(j==1){behaviour=MOVE;direction=PORTALTWO;}sprite->stopAllActions();sprite->runAction(CCRepeatForever::actionWithAction(getAnimate("portal")));}//---------------------2013.3.3--------------------------//道具获得箱子的有关函数voidEnemy::cube(Directiondir,Behaviourbe,inti){behaviour=be;direction=dir;sprite->setIsVisible(true);this->cleanup();sprite->cleanup();CCAction*sequneceAction=CCSequence::actions(getAnimate("cube"),CCCallFuncND::actionWithTarget(this,callfuncND_selector(Enemy::cubeDone),(void*)i),NULL);sprite->runAction(sequneceAction);}voidEnemy::cubeDone(CCNode*pSender,void*i){intj=(int)i;if(j==1){behaviour=MOVE;direction=CUBEONE;}elseif(j==2){behaviour=MOVE;direction=CUBETWO;}sprite->stopAllActions();sprite->runAction(CCRepeatForever::actionWithAction(getAnimate("cube")));sprite->setIsVisible(false);}voidEnemy::enemyDeadAnimation(intid,char*monsterName){behaviour=DEAD;direction=REMOVE;this->id=id;this->cleanup();sprite->cleanup();CCAction*sequneceAction=CCSequence::actions(getAnimate(monsterName),CCCallFunc::actionWithTarget(this,callfunc_selector(Enemy::enemyDeadAnimationDone)),NULL);sprite->runAction(sequneceAction);}voidEnemy::enemyDeadAnimationDone(){sGlobal->enemyDeadAnimationDone(1,true);}voidEnemy::enemypDingDeadAnimation(intid,char*monsterName){behaviour=DEAD;direction=REMOVE;this->pId=id;this->cleanup();sprite->cleanup();CCAction*sequneceAction=CCSequence::actions(getAnimate(monsterName),CCCallFunc::actionWithTarget(this,callfunc_selector(Enemy::enemypDingDeadAnimationDone)),NULL);sprite->runAction(sequneceAction);}voidEnemy::enemypDingDeadAnimationDone(){sGlobal->enemyDeadAnimationDone(2,true);}voidEnemy::enemyWingDeadAnimation(intid,char*monsterName){behaviour=DEAD;direction=WREMOVE;this->wID=id;this->cleanup();sprite->cleanup();CCAction*sequneceAction=CCSequence::actions(getAnimate(monsterName),CCCallFunc::actionWithTarget(this,callfunc_selector(Enemy::enemyWingDeadAnimationDone)),NULL);sprite->runAction(sequneceAction);}voidEnemy::enemyWingDeadAnimationDone(){sGlobal->enemyDeadAnimationDone(3,true);}intEnemy::getWingDeadID(){returnthis->wID;}voidEnemy::deadAnimation(intid,char*monsterName){behaviour=DEAD;direction=REMOVE;this->id=id;sprite->stopAllActions();sprite->runAction(CCRepeatForever::actionWithAction(getAnimate(monsterName)));}voidEnemy::dingDead(intid,char*monsterName){behaviour=DEAD;direction=REMOVE;this->id=id;this->cleanup();sprite->cleanup();CCAction*sequneceAction=CCSequence::actions(getAnimate(monsterName),CCCallFunc::actionWithTarget(this,callfunc_selector(Enemy::dingDeadDone)),NULL);sprite->runAction(sequneceAction);}voidEnemy::pDingDead(intid,char*monsterName){behaviour=DEAD;direction=REMOVE;this->pId=id;this->cleanup();sprite->cleanup();CCAction*sequneceAction=CCSequence::actions(getAnimate(monsterName),CCCallFunc::actionWithTarget(this,callfunc_selector(Enemy::pDingDeadDone)),NULL);sprite->runAction(sequneceAction);}intEnemy::getpDingDeadID(){returnthis->pId;}intEnemy::getDeadID(){returnthis->id;}voidEnemy::dingDeadDone(){//behaviour=DEAD;//direction=REMOVE;//sprite->stopAllActions();//运动的算法CCPointpos=this->getMonsterSprite()->getPosition();//sprite->stopAllActions();//sprite->runAction(CCRepeatForever::actionWithAction(getAnimate("yDing")));sprite->runAction(CCMoveTo::actionWithDuration(1,CCPointMake(pos.x+40,pos.y)));//sprite->setIsVisible(false);}voidEnemy::pDingDeadDone(){//}voidEnemy::boxAttackedDone(CCNode*pSender,void*i){intj=(int)i;if(j==1){behaviour=MOVE;direction=BONE;}elseif(j==2){behaviour=MOVE;direction=BTWO;}elseif(j==3){behaviour=MOVE;direction=BTHREE;}sprite->stopAllActions();sprite->runAction(CCRepeatForever::actionWithAction(getAnimate("box")));}voidEnemy::setAnimation(Directiondir,Behaviourbe,char*monsterName){direction=dir;behaviour=be;sprite->stopAllActions();sprite->runAction(CCRepeatForever::actionWithAction(getAnimate(monsterName)));}//123yDing111213pDingvoidEnemy::executeAnimation(Directiondir,Behaviourbe,intnextAni,char*monsterName){behaviour=be;direction=dir;this->cleanup();sprite->cleanup();CCAction*sequneceAction=CCSequence::actions(getAnimate(monsterName),CCCallFuncND::actionWithTarget(this,callfuncND_selector(Enemy::executeDone),(void*)nextAni),NULL);sprite->runAction(sequneceAction);}voidEnemy::executeDone(CCNode*pSender,void*i){intnext=(int)i;if(next==1){behaviour=MOVE;direction=MOVERLOOK;}elseif(next==2){behaviour=MOVE;direction=MATTACK;}elseif(next==3){behaviour=DEAD;direction=REMOVE;}elseif(next==11){behaviour=MOVE;direction=MOVERLOOK;}elseif(next==12){behaviour=MOVE;direction=MATTACK;}elseif(next==13){behaviour=DEAD;direction=REMOVE;}elseif(next==21){behaviour=MOVE;direction=WRIGHT;}elseif(next=22){behaviour=MOVE;direction=WLEFT;}elseif(next==23){behaviour=MOVE;direction=WATTACK;}elseif(next=24){behaviour=DEAD;direction=WREMOVE;}sprite->stopAllActions();if(next<20&&next>10){sprite->runAction(CCRepeatForever::actionWithAction(getAnimate("pDing")));}elseif(next<10){sprite->runAction(CCRepeatForever::actionWithAction(getAnimate("yDing")));}elseif(next>20){sprite->runAction(CCRepeatForever::actionWithAction(getAnimate("wing")));}}//注意,不同精灵,这个函数写法不同,主要区别都是OVERLOOK上,有些精灵是没有四方向的CCAnimate*Enemy::getAnimate(char*monsterName){if(behaviour==DEAD){//direction=MOVERLOOK;}returnAnimationManager::getInstance()->getAnimate(monsterName,behaviour,direction);}CCAnimation*Enemy::getAnimation(){if(behaviour==DEAD){//direction=MOVERLOOK;}returnAnimationManager::getInstance()->getAnimation("yDing",behaviour,direction);}DirectionEnemy::getDirection(){returnthis->direction;}BehaviourEnemy::getBehaviour(){returnthis->behaviour;}CCRectEnemy::getRect(){floatx=sprite->getPosition().x;floaty=sprite->getPosition().y;//printf("x:%fy:%f\n",x,y);returnCCRectMake(x,y,70,62);}CCRectEnemy::getCollisionRect(intwidth,intheight){floatx=sprite->getPosition().x;floaty=sprite->getPosition().y;//CCLOG("Enemy--x:%fy:%fwidth:%dheight:%d\n",x,y,width,height);returnCCRectMake(x,y,width,height);}voidEnemy::jump(){this->sprite->runAction(CCJumpTo::actionWithDuration(0.05f,ccp(this->sprite->getPosition().x,this->sprite->getPosition().y),20,100));}EnemyData::EnemyData(void){for(inti=0;i<MaxBuf;i++){enemyLife[i]=MAXLIFE;monsterHeightArray[i]=2.5;actionTime[i]=0.0;monPosition[i]=CCPointZero;}//monsterHeight=newCCMutableArray<float*>();}intEnemyData::getEnemyLife(inti){returnthis->enemyLife[i];}voidEnemyData::setEnemyLife(intlife,inti){this->enemyLife[i]=life;}floatEnemyData::getMonsterHeight(inti){returnthis->monsterHeightArray[i];}voidEnemyData::setMonsterHeight(floatheight,inti){this->monsterHeightArray[i]=height;}voidEnemyData::setActionTime(floatval,inti){this->actionTime[i]=val;}floatEnemyData::getActionTime(inti){returnthis->actionTime[i];}voidEnemyData::setPositionMonster(CCPointpos,inti){this->monPosition[i]=pos;}CCPointEnemyData::getPositionMonster(inti){returnthis->monPosition[i];}
现在可以在scene中添加npc了,说到就开始。
Global.h中添加如下定义:
CCMutableArray<Enemy*>*enemyArray;voidaddMonster();
Global.cpp中实现:
CCMutableArray<CCStringToStringDictionary*>*all=data->getObjects();do{for(inti=0;i<all->count();i++){CCStringToStringDictionary*temp=all->getObjectAtIndex(i);if(temp->objectForKey("name")->toStdString()==std::string("y")){floatx=temp->objectForKey("x")->toFloat();floaty=temp->objectForKey("y")->toFloat();CCVector2d*vector=newCCVector2d();vector->x=x;vector->y=5;monsterPositionArray->addObject(vector);Enemy*monster=Enemy::monster("yDing");monster->getMonsterSprite()->setPosition(ccp(x,5));map->addChild(monster,map->getChildren()->count());enemyArray->addObject(monster);//yDing}}
HelloworldScene.cpp中的init()中添加如下
sGlobal->addMonster();
下一篇将会讲解enemy的群集运动以及配合动画,以及hero的碰撞检测准备。
待续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
long原创
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。