评论

收藏

cocos2d-x开发之动作游戏实战--3

游戏开发 游戏开发 发布于:2021-06-27 15:10 | 阅读数:405 | 评论:0

现在只有hero一个在走来走去没什么意思,现在添加几个npc,给hero点压力,好的那就开始吧!添加enemy.h文件和enemy.h文件
#ifndef _ENEMY_H_//66define _ENEMY_H_include"cocos2d.h"include"DBgame.h"define MaxBuf 20
using namespace cocos2d;
class Enemy:public CCNode
{
public:
Enemy(void);
~Enemy(void);
//静态方法用于创建hero实例
static Enemy monster(char monsterName);
void setAnimation(Direction dir,Behaviour be,char* monsterName);
                                           
  Direction getDirection(); 
  Behaviour getBehaviour();
  void getCurrentAnimationIndex();
  void boxAttacked(Direction dir,Behaviour be,int i);
  void boxAttackedDone(CCNode* pSender,void *i);
  void portal(Direction dir,Behaviour be,int i);
  void portalDone(CCNode* pSender,void *i);
  void cube(Direction dir,Behaviour be,int i);
  void cubeDone(CCNode* pSender,void *i);
  void executeAnimation(Direction dir,Behaviour be,int nextAni,char* monsterName);
  void executeDone(CCNode* pSender,void* i);
  void deadAnimation(int id,char* monsterName);
  void enemyDeadAnimation(int id,char* monsterName);
  void enemyDeadAnimationDone();
  void enemypDingDeadAnimation(int id,char* monsterName);
  void enemypDingDeadAnimationDone();
  void enemyWingDeadAnimation(int id,char* monsterName);
  void enemyWingDeadAnimationDone();
  void dingDead(int id,char* monsterName);
  void dingDeadDone();
  int getDeadID();
  int id;
  void pDingDead(int id,char* monsterName);
  void pDingDeadDone();
  int getpDingDeadID();
  int pId;
  int wID;
  int getWingDeadID();
  //void wingDead(int id,char* monsterName);
  //void wingDeadDone();
  CCRect getRect();
  CCRect getCollisionRect(int width,int height);
                                           
  Behaviour behaviour;
  Direction direction;
  void jump();
  CCSprite* getMonsterSprite();
  CCAnimate *getAnimate(char* monsterName);
  protected:
CCAnimation* getAnimation();
  CCSprite *sprite;
  float xVel;
  float yVel;
  CCPoint touchPoint;
  bool init(char* monsterName);
};
define MAXLIFE 100

  class EnemyData
{  public:
  //yDing     42
  EnemyData(void);
  float getMonsterHeight(int i);
  //void initMonsterHeightArray(int i);
  void setMonsterHeight(float height,int i);
  int getEnemyLife(int i);
  void setEnemyLife(int life,int i);
  float getActionTime(int i);
  void setActionTime(float val,int i);
  CCPoint getPositionMonster(int i);
  void setPositionMonster(CCPoint pos,int i);
  private:
  //CCMutableArray<float> monsterHeight;
  CCPoint monPosition[MaxBuf];
  float actionTime[MaxBuf];
  int enemyLife[MaxBuf];
  float monsterHeightArray[MaxBuf];
};
endif//enemy.h文件
#include"enemy.h"//497include"cocos2d.h"include"core\boy.h"include"DBgame.h"include"core\Animation.h"
using namespace cocos2d;
Enemy::Enemy()
{
xVel=0;
yVel=0;
}
Enemy::~Enemy()
{
}
Enemy* Enemy::monster(char monsterName)
{
                                     
  Enemy *monster = new Enemy();
  if (monster &amp;&amp; monster-&gt;init(monsterName))
  {
                                       
    monster-&gt;autorelease();
    return monster;
  }
  CC_SAFE_DELETE(monster);
  return NULL;
}  bool Enemy::init(char monsterName)
{  bool bRet = false;
  do{
//printf("hello-------------\n");
    this-&gt;setAnchorPoint(CCPointZero);
    //创建动画
    //sprite=CCSprite::spriteWithSpriteFrameName("yDing_0.png");
    char charBuffer[128]="\0";
                                       
    sprintf(charBuffer,"%s_0.png",monsterName);
    //CCLOG("hello-------------%s",charBuffer);
    sprite=CCSprite::spriteWithSpriteFrameName(charBuffer);//yDing,pDing
    sprite-&gt;setAnchorPoint(CCPointZero);
    this-&gt;addChild(sprite);
    //设置状态
    const char* str=charBuffer;
    if(strcmp("box_0.png",str)==0)
    {
      //CCLOG("BOX------------------");
      behaviour=MOVE;
      direction=BOVERLOOK;
    }
    else if(strcmp("pDing_0.png",str)==0)
    {
      //CCLOG("BOX------------------");
      behaviour=MOVE;
      direction=MOVERLOOK;
    }
    else if(strcmp("wing_0.png",str)==0)
    {
      behaviour=MOVE;
      direction=WLEFT;
    }
    else if(strcmp("yDing_0.png",str)==0)
    {
      behaviour=MOVE;
      //behaviour=DEAD;
      direction=MOVERLOOK;
      //direction=REMOVE;
    }
    else if(strcmp("portal_0.png",str)==0)
    {
      behaviour=MOVE;
      //behaviour=DEAD;
      direction=PORTALONE;
      sprite-&gt;setIsVisible(false);
      //direction=REMOVE;
    }
    else if(strcmp("cube_0.png",str)==0)
    {
      behaviour=MOVE;
      direction=CUBEONE;
    }
    //behaviour=MOVE;
    //direction=MOVERLOOK;
    //direction=MATTACK;
    CCAction* action=CCRepeatForever::actionWithAction(getAnimate(monsterName));//monsterName ---"yDing pDing"
    //sprite-&gt;runAction(CCRepeatForever::actionWithAction(getAnimate()));
    sprite-&gt;runAction(action);
    //
    bRet=true;
  }while(0);
  return bRet;
}  void Enemy::getCurrentAnimationIndex()
{  /*
  假设有一个CCAnimation anim,由5张图组成。
  将这个anim包装成CCAnimate
animate。使用的时侯sprite->runAction(animate),播放动画。
  */
  //这里我们来获取第几帧:
  int currentAnimIndex = 0; //精灵当前播放的是第几帧
  CCAnimation anim=getAnimation();
  for(int i = 1; i <4; i++)
  {
//CCLOG("animIndex");
    //5张图5帧
    if(sprite-&gt;displayedFrame() == anim-&gt;getFrames()-&gt;getObjectAtIndex(i))
    {
      //这个i返回的只是一个索引,如果帧数是从1开始计算就要+1
      currentAnimIndex = i+1;
      CCLOG("animaIndex:%d",currentAnimIndex);
    }
  }
}  CCSprite
Enemy::getMonsterSprite()
{  return this->sprite;
}  void Enemy::boxAttacked(Direction dir,Behaviour be,int i)
{  behaviour=be;
  direction=dir;
this-&gt;cleanup();
  sprite-&gt;cleanup();
  CCAction *sequneceAction = CCSequence::actions(
    getAnimate("box"),
    CCCallFuncND::actionWithTarget(this, callfuncND_selector(Enemy::boxAttackedDone),(void*)i),
    NULL);
                                     
  sprite-&gt;runAction(sequneceAction);
}//--------------------2013.3.3  //下一关的通道有关函数
  void Enemy::portal(Direction dir,Behaviour be,int i)
{  behaviour=be;
  direction=dir;
sprite-&gt;setIsVisible(true);
  this-&gt;cleanup();
  sprite-&gt;cleanup();
  CCAction *sequneceAction = CCSequence::actions(
    getAnimate("portal"),
    CCCallFuncND::actionWithTarget(this, callfuncND_selector(Enemy::portalDone),(void*)i),
    NULL);
                                     
  sprite-&gt;runAction(sequneceAction);
}  void Enemy::portalDone(CCNode* pSender,void i)
{  int j=(int)i;
  if(j==1)
  {
behaviour=MOVE;
    direction=PORTALTWO;
  }
  sprite-&gt;stopAllActions();
  sprite-&gt;runAction(CCRepeatForever::actionWithAction(getAnimate("portal")));
}//---------------------2013.3.3  //道具获得箱子的有关函数
  void Enemy::cube(Direction dir,Behaviour be,int i)
{  behaviour=be;
  direction=dir;
sprite-&gt;setIsVisible(true);
  this-&gt;cleanup();
  sprite-&gt;cleanup();
  CCAction *sequneceAction = CCSequence::actions(
    getAnimate("cube"),
    CCCallFuncND::actionWithTarget(this, callfuncND_selector(Enemy::cubeDone),(void*)i),
    NULL);
                                     
  sprite-&gt;runAction(sequneceAction);
}  void Enemy::cubeDone(CCNode
pSender,void *i)
{  int j=(int)i;
  if(j==1)
  {
behaviour=MOVE;
    direction=CUBEONE;
  }
  else if(j==2)
  {
    behaviour=MOVE;
    direction=CUBETWO;
  }
  sprite-&gt;stopAllActions();
  sprite-&gt;runAction(CCRepeatForever::actionWithAction(getAnimate("cube")));
  sprite-&gt;setIsVisible(false);
}  void Enemy::enemyDeadAnimation(int id,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-&gt;runAction(sequneceAction);
}  void Enemy::enemyDeadAnimationDone()
{  sGlobal->enemyDeadAnimationDone(1,true);
}  void Enemy::enemypDingDeadAnimation(int id,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-&gt;runAction(sequneceAction);
}  void Enemy::enemypDingDeadAnimationDone()
{  sGlobal->enemyDeadAnimationDone(2,true);
}  void Enemy::enemyWingDeadAnimation(int id,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-&gt;runAction(sequneceAction);
}  void Enemy::enemyWingDeadAnimationDone()
{  sGlobal->enemyDeadAnimationDone(3,true);
}  int Enemy::getWingDeadID()
{  return this->wID;
}  void Enemy::deadAnimation(int id,char monsterName)
{  behaviour=DEAD;
  direction=REMOVE;
  this->id=id;
  sprite->stopAllActions();
  sprite->runAction(CCRepeatForever::actionWithAction(getAnimate(monsterName)));
}  void Enemy::dingDead(int id,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-&gt;runAction(sequneceAction);
}  void Enemy::pDingDead(int id,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-&gt;runAction(sequneceAction);
}  int Enemy::getpDingDeadID()
{  return this->pId;
}  int Enemy::getDeadID()
{  return this->id;
}  void Enemy::dingDeadDone()
{  //behaviour=DEAD;
  //direction=REMOVE;
  //sprite->stopAllActions();
  //运动的算法
  CCPoint pos=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);
}  void Enemy::pDingDeadDone()
{  //
}  void Enemy::boxAttackedDone(CCNode* pSender,void i)
{  int j=(int)i;
  if(j==1)
  {
behaviour=MOVE;
    direction=BONE;
  }
  else if(j==2)
  {
    behaviour=MOVE;
    direction=BTWO;
  }
  else if(j==3)
  {
    behaviour=MOVE;
    direction=BTHREE;
  }
                                     
  sprite-&gt;stopAllActions();
  sprite-&gt;runAction(CCRepeatForever::actionWithAction(getAnimate("box")));
}  void Enemy::setAnimation(Direction dir,Behaviour be,char
monsterName)
{  direction=dir;
  behaviour=be;
  sprite->stopAllActions();
  sprite->runAction(CCRepeatForever::actionWithAction(getAnimate(monsterName)));
}  //1 2 3 yDing          11 12 13 pDing
  void Enemy::executeAnimation(Direction dir,Behaviour be,int nextAni,char* monsterName)
{  behaviour=be;
  direction=dir;
this-&gt;cleanup();
  sprite-&gt;cleanup();
  CCAction *sequneceAction = CCSequence::actions(
    getAnimate(monsterName),
    CCCallFuncND::actionWithTarget(this, callfuncND_selector(Enemy::executeDone),(void*)nextAni),
    NULL);
                                     
  sprite-&gt;runAction(sequneceAction);
}  void Enemy::executeDone(CCNode pSender,void i)
{  int next=(int)i;
  if(next==1)
  {
behaviour=MOVE;
    direction=MOVERLOOK;
  }
  else if(next==2)
  {
    behaviour=MOVE;
    direction=MATTACK;
  }
  else if(next==3)
  {
    behaviour=DEAD;
    direction=REMOVE;
  }
  else if(next==11)
  {
    behaviour=MOVE;
    direction=MOVERLOOK;
  }
  else if(next==12)
  {
    behaviour=MOVE;
    direction=MATTACK;
  }
  else if(next==13)
  {
    behaviour=DEAD;
    direction=REMOVE;
  }
  else if(next==21)
  {
    behaviour=MOVE;
    direction=WRIGHT;
  }
  else if(next=22)
  {
    behaviour=MOVE;
    direction=WLEFT;
  }
  else if(next==23)
  {
    behaviour=MOVE;
    direction=WATTACK;
  }
  else if(next=24)
  {
    behaviour=DEAD;
    direction=WREMOVE;
  }
  sprite-&gt;stopAllActions();
  if(next&lt;20&amp;&amp;next&gt;10)
  {
    sprite-&gt;runAction(CCRepeatForever::actionWithAction(getAnimate("pDing")));
  }
  else if(next&lt;10)
  {
    sprite-&gt;runAction(CCRepeatForever::actionWithAction(getAnimate("yDing")));
  }
  else if(next&gt;20)
  {
    sprite-&gt;runAction(CCRepeatForever::actionWithAction(getAnimate("wing")));
  }
}  //注意,不同精灵,这个函数写法不同,主要区别都是OVERLOOK上,有些精灵是没有四方向的
  CCAnimate * Enemy::getAnimate(char monsterName)
{  if (behaviour==DEAD)
  {
//direction=MOVERLOOK;
  }
                                     
  return AnimationManager::getInstance()-&gt;getAnimate(monsterName,behaviour,direction);
}  CCAnimation
Enemy::getAnimation()
{  if (behaviour==DEAD)
  {
//direction=MOVERLOOK;
  }
  return AnimationManager::getInstance()-&gt;getAnimation("yDing",behaviour,direction);
}  Direction Enemy::getDirection()
{  return this->direction;
}  Behaviour Enemy::getBehaviour()
{  return this->behaviour;
}  CCRect Enemy::getRect()
{  float x=sprite->getPosition().x;
  float y=sprite->getPosition().y;
  //printf("x:%f  y:%f\n",x,y);
  return CCRectMake(x,y,70,62);}  CCRect Enemy::getCollisionRect(int width,int height)
{  float x=sprite->getPosition().x;
  float y=sprite->getPosition().y;
  //CCLOG("Enemy--x:%f  y:%f   width:%d    height:%d\n",x,y,width,height);
  return CCRectMake(x,y,width,height);
}  void Enemy::jump()
{  this->sprite->runAction(CCJumpTo::actionWithDuration(0.05f,ccp(this->sprite->getPosition().x , this->sprite->getPosition().y),20,100));
}  EnemyData::EnemyData(void)
{  for(int i=0;i<MaxBuf;i++)
  {
enemyLife[i]=MAXLIFE;
    monsterHeightArray[i]=2.5;
    actionTime[i]=0.0;
    monPosition[i]=CCPointZero;
  }
  //monsterHeight=new CCMutableArray&lt;float*&gt;();
}  int EnemyData::getEnemyLife(int i)
{  return this->enemyLife;}  void EnemyData::setEnemyLife(int life,int i)
{  this->enemyLife=life;
}  float EnemyData::getMonsterHeight(int i)
{  return this->monsterHeightArray;
}  void EnemyData::setMonsterHeight(float height,int i)
{  this->monsterHeightArray=height;
}  void EnemyData::setActionTime(float val,int i)
{  this->actionTime=val;
}  float EnemyData::getActionTime(int i)
{  return this->actionTime;
}  void EnemyData::setPositionMonster(CCPoint pos,int i)
{  this->monPosition=pos;
}  CCPoint EnemyData::getPositionMonster(int i)
{  return this->monPosition;

  }现在可以在scene中添加npc了,说到就开始。Global.h中添加如下定义:
CCMutableArray<Enemy*> enemyArray;
void addMonster();
Global.cpp中实现:
CCMutableArray<CCStringToStringDictionary > * all = data->getObjects();
do
 {
    for (int i = 0 ; i &lt;all-&gt;count(); i++)
    {
      CCStringToStringDictionary * temp = all-&gt;getObjectAtIndex(i);
      if(temp-&gt;objectForKey("name")-&gt;toStdString() == std::string("y"))
      {
        float x = temp-&gt;objectForKey("x")-&gt;toFloat();  
        float y = temp-&gt;objectForKey("y")-&gt;toFloat();
        CCVector2d* vector=new CCVector2d();
        vector-&gt;x=x;
        vector-&gt;y=5;
        monsterPositionArray-&gt;addObject(vector);
        Enemy* monster = Enemy::monster("yDing");
        monster-&gt;getMonsterSprite()-&gt;setPosition(ccp(x,5));
        map-&gt;addChild(monster,map-&gt;getChildren()-&gt;count());
        enemyArray-&gt;addObject(monster);//yDing
      }
}
HelloworldScene.cpp中的init()中添加如下
sGlobal->addMonster();
下一篇将会讲解enemy的群集运动以及配合动画,以及hero的碰撞检测准备。待续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。long原创               

关注下面的标签,发现更多相似文章