使用cocos2d-x 寫的蜘蛛閃避小遊戲------從cocos2d移植過來的~有哪裏缺陷的可以提噢。親。

以下是附上的代碼。 主要是一個類GameScene類。
#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的庫目錄下。 我那資源文件夾裏沒有打包庫。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章