1戳青蛙項目描述
1.1功能描述
實作類似打地鼠遊戲,青蛙随機出現在螢幕左邊5*3的格子中,并會向螢幕右邊移動,在青蛙逃離之前,手指點選實作戳滅青蛙的效果。随着分數增加,青蛙越來越多,當青蛙逃離5個後,遊戲結束。青蛙分為大青蛙和小青蛙,大青蛙走的忙,要點選3下,小青蛙走的快,隻需點選兩下。
1.2所需技術
Cocos2D-x精靈類,動作類,多點觸摸,CocoStudioUI編輯器,Vector
2戳青蛙運作流程
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);
}
}
}