天天看点

cocos2dx3.0戳青蛙游戏(打地鼠)

1戳青蛙项目描述

1.1功能描述

实现类似打地鼠游戏,青蛙随机出现在屏幕左边5*3的格子中,并会向屏幕右边移动,在青蛙逃离之前,手指点击实现戳灭青蛙的效果。随着分数增加,青蛙越来越多,当青蛙逃离5个后,游戏结束。青蛙分为大青蛙和小青蛙,大青蛙走的忙,要点击3下,小青蛙走的快,只需点击两下。

1.2所需技术

Cocos2D-x精灵类,动作类,多点触摸,CocoStudioUI编辑器,Vector

2戳青蛙运行流程

cocos2dx3.0戳青蛙游戏(打地鼠)

3戳青蛙详细设计

3.1实体基类

class CEntity : public Node {
public:
  CEntity();
  ~CEntity();
  void spriteBind(Sprite* sprite);
  Sprite* spriteGet();
private:
  Sprite* m_SprBind;
  CC_SYNTHESIZE(int, m_iHP, iHP);   //血量
  CC_SYNTHESIZE(int, m_iSpeed, iSpeed);   //速度
  CC_SYNTHESIZE(std::string, m_sName, sName); //名字
  CC_SYNTHESIZE(Point, m_pos, pos); //坐标
};      

3.2青蛙类

青蛙类是基于实体类的。

class CFrog :public CEntity
{
public:
  CFrog();
  ~CFrog();
  virtual bool init();
  CREATE_FUNC(CFrog);
  void createSpriteByName();
  bool clickJudge(Point pos);//判断该青蛙有没被点击
  void getHurt();//获得伤害
  bool dieJudge();//是否死亡判断
};      

createSpriteByName是根据m_sName,从精灵缓冲池中选取不同的图片(大小青蛙),并且绑定动画。青蛙具有血量,名字(类型),速度的属性。

3.3青蛙管理器类

class CFrogMgr :public Node
{
public:
  CFrogMgr();
  ~CFrogMgr();
  bool initBy();
  CREATE_FUNC(CFrogMgr);
  static CFrogMgr* createBy();
  void createFrog(float dt);
  void frogsMove(float dt);
  void touchDeal();
  CFrog* findClickFrog(Point pos);
  void frogPake(Point pos);
  void notityForPause(Ref* pData);
private:
  Vector<CFrog*> m_listFrog;
};      

青蛙管理器类createFrog方法每2秒产生青蛙,产生数量是跟分数成正比的。

随机青蛙的产生的位置,青蛙的类型。每产生一个青蛙加入到青蛙的容器中。

3.3.1青蛙移动

frogsMove方法每0.1秒执行一遍,具体内容是遍历青蛙容器,把每个青蛙个体的横坐标根据速度增加,当青蛙逃离了屏幕的最右端的时候,要把它从容器中删除。特别说明:容器的erase删除一个后会返回迭代器指向的下一个位置。

void CFrogMgr::frogsMove(float dt)
{
  //使用迭代器进行删除处理
  for (Vector<CFrog*>::iterator it = m_listFrog.begin(); it != m_listFrog.end();)
  {
    (*it)->setPositionX((*it)->getPositionX() + (*it)->getiSpeed());//横坐标增加
    if ((*it)->getPositionX() > MAP_WIDE)//当逃离时
    {
      (*it)->removeFromParentAndCleanup(true);
      it = m_listFrog.erase(it);
      NOTIFY->postNotification(NOTIFY_HP, (Ref*)1);
    }
    else
      ++it;
  }
}      

3.3.2多点触摸响应

void CFrogMgr::frogPake(Point pos)
{
  CFrog* frogDiv = findClickFrog(pos);
  if (frogDiv == NULL)
    return;
  else
  {
    frogDiv->getHurt();
    if (frogDiv->dieJudge() == true)
    {
      CocosDenshion::SimpleAudioEngine::getInstance()->playEffect(PATH_DIE_MUSIC);//循环播放背景音乐
      frogDiv->removeFromParentAndCleanup(true);
      m_listFrog.eraseObject(frogDiv);
      NOTIFY->postNotification(NOTIFY_SCORE, (Ref*)1);
    }
  }
}      

4戳青蛙运行结果