1. 程式人生 > >【cocos2dx 3.2】Flappy Bird開發超詳細講解(六)主角小鳥的建立

【cocos2dx 3.2】Flappy Bird開發超詳細講解(六)主角小鳥的建立

本文可以隨意轉載,轉載請註明出處,謝謝!

像之前我們說的,GameLayer是管家,其他的東西(小鳥,管道,草地等)各自封裝成類。現在我們就把主角小鳥封裝成一個類。

在這裡我們先思考下,我們有三種不同顏色的小鳥,在預載入LoadingScene裡我們給它們初始化了各自的動畫,現在我們要實現的就是隨機建立一隻小鳥,並添上對應的動畫。這隻小鳥應該賦予它物理屬性,然後把它要放到GameLayer中讓管家管理。這些就是本期要實現的內容了。

我們建立一個小鳥類BirdSprite。

看程式碼:

//BirdSprite.h

#ifndef _BIRDSPRITE_H_
#define _BIRDSPRITE_H_
#include "cocos2d.h"
USING_NS_CC;
class BirdSprite:public Layer
{
public:
	virtual bool init();
	//這個類物件的訪問介面,通過它來例項化物件
	static BirdSprite* getInstance();
	CREATE_FUNC(BirdSprite);
private:
	//建構函式私有,這樣就不可以隨便宣告這個類的物件了
	BirdSprite();
	//宣告一個靜態物件,也是這個類唯一的物件
	static BirdSprite* instance;
	Sprite* m_bird;
};

#endif

//BirdSprite.cpp

#include "BirdSprite.h"
#include "LoadingScene.h"
#include "define.h"

//注意這裡要初始化
BirdSprite* BirdSprite::instance = NULL;

BirdSprite::BirdSprite()
{

}

BirdSprite* BirdSprite::getInstance()
{
	if (instance==NULL)
	{
		instance = new BirdSprite();
		instance->init();
	}
	return instance;
}

bool BirdSprite::init()
{
	if (!Layer::init())
	{
		return false;
	}
	auto winSize = Director::getInstance()->getWinSize();

	//隨機選擇一種顏色的小鳥,並播放對應的動畫
	Animate* animate;
	switch (int tmp=rand()%3)
	{
	case 0:
		m_bird = Sprite::createWithSpriteFrameName("bird0_0.png");
		animate = Animate::create(AnimationCache::getInstance()->getAnimation(BIRDANIMATION_0));
		m_bird->runAction(RepeatForever::create(animate));
		break;
	case 1:
		m_bird = Sprite::createWithSpriteFrameName("bird1_0.png");
		animate = Animate::create(AnimationCache::getInstance()->getAnimation(BIRDANIMATION_1));
		m_bird->runAction(RepeatForever::create(animate));
		break;
	case 2:
		m_bird = Sprite::createWithSpriteFrameName("bird2_0.png");
		animate = Animate::create(AnimationCache::getInstance()->getAnimation(BIRDANIMATION_2));
		m_bird->runAction(RepeatForever::create(animate));
		break;
	default:
		break;
	}
	//設定小鳥的屬性,這邊添上了物理屬性,參考之前的草地設定
	m_bird->setPosition(Point(winSize.width / 2, winSize.height*0.8));
	auto birdbody = PhysicsBody::create();
	auto birdshape = PhysicsShapeCircle::create(BIRD_RADIUS);
	birdbody->addShape(birdshape);
	birdbody->setDynamic(true);
	birdbody->setLinearDamping(0.7f);
	birdbody->setGravityEnable(false);
	birdbody->setCategoryBitmask(1);
	birdbody->setCollisionBitmask(-1);
	birdbody->setContactTestBitmask(-1);
	m_bird->setPhysicsBody(birdbody);
	this->addChild(m_bird);



	return true;
}

小鳥類封裝好之後,我們就可以在管家那裡新增它了,看GameLayer.cpp,別忘了匯入對應的標頭檔案哦,下次就不再提示了。

	//新增小鳥
	auto bird = BirdSprite::create();
	this->addChild(bird);


好了,程式碼裡我也註釋的比較詳細了,而且這期的內容比較少,很多上一期的知識點,就當作一半學習新的東西,一半鞏固上一期的知識,本期的重點是單例模式。

我們來預覽一下效果吧:

本期的原始碼下載地址:連結: http://pan.baidu.com/s/1i3vI4yL 密碼: s4ie

有什麼疑問或者原始碼下載地址失效啊之類的可以在此留言我會及時更新的,祝大家更上一層樓!