#pragma once
#include "cocos2d.h"
USING_NS_CC;
class GameScene :public cocos2d::CCLayer
{
public:
GameScene(void);
~GameScene(void);
//遊戲開始初始化
void initGame();
//player 的重力感應更新位置
virtual void update(float dt);
void didAccelerate(CCAcceleration* pAccelerationValue);
/** 初始化蜘蛛**/
void initSpiders();
/** 排列蜘蛛**/
void resetSpiders();
/** 蜘蛛的幀更新 動作**/
void spiderUpdate(float dela);
/** 蜘蛛的移動更新**/
void runSpiderMoveSequence(CCSprite *sprite);
/** 讓蜘蛛在移動的過程中產生扭動效果,就是放大縮小**/
void runSpiderWiggleSequence(CCSprite *sprite);
/** 蜘蛛下降到平面底部的時候回調的方法**/
void spiderBelowScreen(CCNode *node);
/** 蜘蛛與player的碰撞檢測 **/
void checkSpiderCollision(float dela);
/** 遊戲結束**/
void gameOver();
/** 觸屏事件回調,當手指離開屏幕,遊戲重新開始**/
void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
/** 重置遊戲**/
void resetGame();
private:
CCSprite *player;
CCPoint playerVelocity;
CCArray *spiders;
float spiderMoveDuration;
int numSpiderMoved;
CCLabelBMFont *font;
//int totalTime;
float totalTime;
int score;
};
下面個是GameScene.cpp實現方法
#include "GameScene.h" #include "SimpleAudioEngine.h" using namespace CocosDenshion; GameScene::GameScene(void):player(NULL) { this->initGame(); this->setTouchEnabled(true); } void GameScene::initGame() { CCSize size = CCDirector::sharedDirector()->getWinSize(); CCSprite *bg = CCSprite::create("bg.jpg"); bg->setPosition(ccp(size.width*0.5f,size.height*0.5f)); this->addChild(bg); player = CCSprite::create("player.png"); player->setPosition(ccp(size.width/2,player->getContentSize().height/2)); this->addChild(player); font = CCLabelBMFont::create("0","bitmapFontTest3.fnt"); font->setPosition(ccp(size.width*0.5,size.height)); font->setAnchorPoint(ccp(0.5f,1.0f)); this->addChild(font,10);//addChild會自動retain //this->gameOver(); CCLabelTTF *startTtf = CCLabelTTF::create("tap screen to play","Arial",20); startTtf->setPosition(ccp(size.width*0.5,size.height*0.25)); this->addChild(startTtf,100,101); //動作:閃爍 CCBlink *blink = CCBlink::create(10,20); CCRepeatForever *repeatBlink = CCRepeatForever::create(blink); startTtf->runAction(repeatBlink); initSpiders(); SimpleAudioEngine::sharedEngine()->playBackgroundMusic("bg.mp3",true); //當有蜘蛛到最底部時候發出的聲音,先加載到內存。 //SimpleAudioEngine::sharedEngine()->preloadEffect("sipder.mp3"); } GameScene::~GameScene(void) { spiders->release(); spiders = NULL; } void GameScene::didAccelerate( CCAcceleration* pAccelerationValue ) { //控制減速的速率 值越小,更容易改變方向 float deceleration = 0.4f; //加速計的敏感值越大,主角對加速計的輸入會越敏感 float sensitivity = 6.0; //最大輸入值 float maxVelocity = 100.0f; playerVelocity.x = playerVelocity.x*deceleration + pAccelerationValue->x*sensitivity; if (playerVelocity.x>=maxVelocity) { playerVelocity.x = maxVelocity; }else if(playerVelocity.x <=-maxVelocity) { playerVelocity.x = -maxVelocity; } } void GameScene::update( float dt ) { CCPoint point = player->getPosition(); point.x +=playerVelocity.x; CCSize size = CCDirector::sharedDirector()->getWinSize(); //判斷player是否移動到屏幕外面 if(point.x>=(size.width-player->getContentSize().width*0.5)) { point.x =size.width- player->getContentSize().width*0.5; playerVelocity = CCPointZero; }else if (point.x<=player->getContentSize().width*0.5) { point.x = player->getContentSize().width*0.5; playerVelocity = CCPointZero; }else{ } player->setPosition(point); /*int totalTime =0;*/ totalTime += dt; int currentTime = (int)totalTime; if (score < currentTime) { score = currentTime; CCString *s = CCString::stringWithFormat("%i",score); font->setString(s->getCString()); } checkSpiderCollision(dt); } void GameScene::initSpiders() { CCSize size = CCDirector::sharedDirector()->getWinSize(); CCSprite *tempSprite = CCSprite::create("spider.png"); //算出一行可以放多少蜘蛛 int numSpiders = size.width/tempSprite->getContentSize().width; this->spiders = CCArray::create(numSpiders); spiders->retain(); for(int i=0;i<numSpiders;i++) { CCSprite *spider = CCSprite::create("spider.png"); this->addChild(spider,0,2); spiders->addObject(spider); } } void GameScene::resetSpiders() { CCSize size = CCDirector::sharedDirector()->getWinSize(); CCSprite *tempSprite =(CCSprite *) spiders->lastObject(); //精靈的寬度 int contentW = tempSprite->getContentSize().width; int contentH = tempSprite->getContentSize().height; int numSprites = spiders->count(); for (int i=0;i<numSprites;i++) { CCSprite *spider = (CCSprite *)spiders->objectAtIndex(i); if (spider!=NULL) { //把蜘蛛放在頂部 spider->setPosition(ccp(contentW*i+contentW*0.5,size.height+contentH*0.5)); spider->stopAllActions(); } } //如果之前的預約動作方法如果還存在就去掉,否則沒有spiders效果 unschedule(schedule_selector(GameScene::spiderUpdate)); schedule(schedule_selector(GameScene::spiderUpdate),0.7f); numSpiderMoved = 0; spiderMoveDuration = 4.0f; } void GameScene::spiderUpdate( float dela ) { for(int i=0;i<10;i++) { int randomSpiderIndex = CCRANDOM_0_1()*(spiders->count()); CCSprite *spider = (CCSprite *)spiders->objectAtIndex(randomSpiderIndex); if(spider->numberOfRunningActions() == 0) { this->runSpiderMoveSequence(spider); //這樣可以確保每次只有一隻蜘蛛在移動 runSpiderWiggleSequence(spider); break; } } } void GameScene::runSpiderMoveSequence( CCSprite *sprite ) { CCSize size = CCDirector::sharedDirector()->getWinSize(); //隨着時間的推移,增加移動的蜘蛛數量 numSpiderMoved ++; if(numSpiderMoved%8==0 && spiderMoveDuration>2.0f) { spiderMoveDuration -=0.1f; } CCPoint belowScreenPostion = CCPointMake(sprite->getPosition().x,-sprite->getContentSize().height*0.5); CCMoveTo *move = CCMoveTo::create(spiderMoveDuration,belowScreenPostion); CCCallFuncN *call = CCCallFuncN::create(this,callfuncN_selector(GameScene::spiderBelowScreen)); CCFiniteTimeAction *sequence = CCSequence::create(move,call,NULL); sprite->runAction(sequence); } void GameScene::runSpiderWiggleSequence(CCSprite *sprite) { CCScaleTo *scaleUp = CCScaleTo::create(CCRANDOM_0_1()*2+1,1.5f); CCEaseBackInOut *easeUp = CCEaseBackInOut::create(scaleUp); CCScaleTo *scaleDown = CCScaleTo::create(CCRANDOM_0_1()*2+1,0.75f); CCEaseBackInOut *easeDown = CCEaseBackInOut::create(scaleDown); CCActionInterval *sequence =(CCActionInterval*)CCSequence::create(easeUp,easeDown,NULL); sprite->runAction(sequence); } void GameScene::spiderBelowScreen( CCNode *obj ) { CCAssert((CCSprite*)obj,"obj is not spider"); CCSize size = CCDirector::sharedDirector()->getWinSize(); CCSprite * spider = (CCSprite *)obj; CCPoint pos = CCPointMake(spider->getPosition().x,size.height+spider->getContentSize().height*0.5); spider->setPosition(pos); //SimpleAudioEngine::sharedEngine()->playEffect("spider.mp3"); } void GameScene::checkSpiderCollision( float dela ) { int pW = player->getContentSize().width; int pRadius = pW*0.4;//粗略的計算 CCSprite *tempSprite = (CCSprite *)spiders->lastObject(); int sW = tempSprite->getContentSize().width; int sRadius = sW*0.4;//粗略的計算 int maxCollisionDis = pRadius+sRadius; //蜘蛛與player的最短無交點的距離爲半徑相加 int numSpiders = spiders->count(); for(int i =0;i<numSpiders;i++) { CCSprite *spider = (CCSprite *)spiders->objectAtIndex(i); if (spider->numberOfRunningActions()==0) {//沒有運動的蜘蛛就不檢測 continue; } //檢測在運動的蜘蛛是否與player有交點重合 float actualDistance = ccpDistance(player->getPosition(),spider->getPosition()); if (actualDistance<maxCollisionDis) { this->gameOver(); } } } void GameScene::gameOver() { CCObject *obj = NULL; if(spiders!=NULL){ CCARRAY_FOREACH(spiders,obj){ CCSprite *s = (CCSprite*)obj; s->stopAllActions(); } } this->resetSpiders(); this->setAccelerometerEnabled(false); this->setTouchEnabled(true); this->unscheduleAllSelectors(); CCSize size = CCDirector::sharedDirector()->getWinSize(); CCLabelTTF *ttf = CCLabelTTF::create("GameOver","Marker Felt",60); ttf->setPosition(ccp(size.width/2,size.height/3)); this->addChild(ttf,100,100); //顏色漸變 CCTintTo *tint1 = CCTintTo::create(2,255,255,0); CCTintTo *tint2 = CCTintTo::create(2,255,255,255); CCTintTo *tint3 = CCTintTo::create(2,255,0,0); CCTintTo *tint4 = CCTintTo::create(2,255,0,255); CCTintTo *tint5 = CCTintTo::create(2,0,255,0); CCTintTo *tint6 = CCTintTo::create(2,0,255,255); CCActionInterval *sequence =(CCActionInterval*) CCSequence::create( tint1, tint2, tint3, tint4, tint5, tint6,NULL); CCRepeatForever *repeatTint = CCRepeatForever::create(sequence); ttf->runAction(repeatTint); //動作:轉動,顫動 CCRotateTo *rotate1 = CCRotateTo::create(2,3); CCEaseBounceInOut *bounce1 = CCEaseBounceInOut::create(rotate1); CCRotateTo *rotate2 = CCRotateTo::create(2,-3); CCEaseBounceInOut *bounce2 = CCEaseBounceInOut::create(rotate2); CCActionInterval *sequence2 = (CCActionInterval*)CCSequence::create(bounce1,bounce2,NULL); CCRepeatForever *repeatRotate = CCRepeatForever::create(sequence2); ttf->runAction(repeatRotate); //動作:跳動 CCJumpBy *jump = CCJumpBy::create(3,CCPointZero,size.height/3,1); CCRepeatForever *repeatJump = CCRepeatForever::create(jump); ttf->runAction(repeatJump); CCLabelTTF *startTtf = CCLabelTTF::create("tap screen to play again","Arial",20); startTtf->setPosition(ccp(size.width*0.5,size.height*0.25)); this->addChild(startTtf,100,101); //動作:閃爍 CCBlink *blink = CCBlink::create(10,20); CCRepeatForever *repeatBlink = CCRepeatForever::create(blink); startTtf->runAction(repeatBlink); } void GameScene::ccTouchesEnded( CCSet *pTouches, CCEvent *pEvent ) { resetGame(); } void GameScene::resetGame() { this->setTouchEnabled(false); this->removeChildByTag(100,true); this->removeChildByTag(101,true); this->setAccelerometerEnabled(true); this->scheduleUpdate(); score = 0; totalTime = 0; font->setString("0"); this->resetSpiders(); }
代碼裏有註釋。大致上是實現手機的重力感應控制一個player在水平方向上移動。然後躲避蜘蛛。 然後會根據贏的時間現實在手機屏幕上。
下面是在android手機上安裝以上的遊戲ndk編譯後的截圖
我的資源裏面有win32和android 的工程。可以去資源裏面下載放在cocos2d-x 2.0.1的庫目錄下。 我那資源文件夾裏沒有打包庫。