天天看點

【cocos2dx-3.0beta-制作flappybird】對不起,我的數學老師是體育老師兼職的—遊戲中所用到的數字類封裝

一、引言

在遊戲進行的過程當中,我們需要實時的顯示得分,此外在遊戲結束的時候,也需要顯示最高分和本局得分。是以本節主要是講解如何顯示這些分數。

【cocos2dx-3.0beta-制作flappybird】對不起,我的數學老師是體育老師兼職的—遊戲中所用到的數字類封裝
【cocos2dx-3.0beta-制作flappybird】對不起,我的數學老師是體育老師兼職的—遊戲中所用到的數字類封裝
【cocos2dx-3.0beta-制作flappybird】對不起,我的數學老師是體育老師兼職的—遊戲中所用到的數字類封裝
【cocos2dx-3.0beta-制作flappybird】對不起,我的數學老師是體育老師兼職的—遊戲中所用到的數字類封裝

二、數字類的設計

這裡我們寫了一個Number類來處理數字的顯示。

素材裡面提供了多種不同類型的數字圖檔,是以我們需要根據實際情況選擇某一種數字的圖檔。

1、數字的對其方式:

typedef enum _gravity {
GRAVITY_CENTER = 1,
GRAVITY_LEFT,
GRAVITY_RIGHT
} Gravity;
           

2、設定每位數字的間距

const int NumberInterval = 4;
           

3、儲存0-9的每一位數字

Vector<SpriteFrame*> numberSeries;
           

4、根據指定格式生成數字

void NumberSeries::loadNumber(const char *fmt, int base) {
for (int i = base; i < 10 + base; i++){
const char *filename = String::createWithFormat(fmt, i)->getCString();
auto frame = AtlasLoader::getInstance()->getSpriteFrameByName(filename);
numberSeries.pushBack(frame);
}
}
           

5、把整型數字的每一位來擷取相應的圖檔

Node* Number::convert(const char* name, int number, Gravity gravity) {
//...
auto numberNode = Node::create();
float totalWidth = 0;
//擷取數字的每一位
while(number){
int temp = number % 10;
number /= 10;
auto sprite = Sprite::createWithSpriteFrame(numbers->at(temp));
totalWidth += sprite->getContentSize().width;
numberNode->addChild(sprite);
}
//...
numberNode->setContentSize(Size(totalWidth, numberZero->getContentSize().height));
return numberNode;
}
           

三、數字類的使用

1、在遊戲狀态層初始化的時候,載入需要用到的兩種數字:

Number::getInstance()->loadNumber(NUMBER_FONT.c_str(), "font_0%02d", 48);
Number::getInstance()->loadNumber(NUMBER_SCORE.c_str(), "number_score_%02d");
           

2、遊戲進行過程當中,更新分數:

this->scoreSprite = (Sprite* )Number::getInstance()->convert(NUMBER_FONT.c_str(), score);
scoreSprite->setPosition(Point(this->originPoint.x + this->visibleSize.width / 2,this->originPoint.y + this->visibleSize.height *5/6)); 
           

3、遊戲結束時,顯示本局分數

void StatusLayer::refreshScoreExecutor(float dt){
//......
scoreSprite = (Sprite *)Number::getInstance()->convert(NUMBER_SCORE.c_str(), this->tmpScore, Gravity::GRAVITY_RIGHT);
scoreSprite->setAnchorPoint(Point(1,0));
scoreSprite->setPosition(Point(this->originPoint.x + this->visibleSize.width * 3 / 4 + 20.0f, this->originPoint.y + this->visibleSize.height * 1 / 2));
scoreSprite->setTag(CURRENT_SCORE_SPRITE_TAG);
this->addChild(scoreSprite,1000);
//.....
}
           

4、遊戲結束是,顯示最高得分

//display the best score on the score panel
auto bestScoreSprite = (Sprite *)Number::getInstance()->convert(NUMBER_SCORE.c_str(), this->bestScore, Gravity::GRAVITY_RIGHT);
bestScoreSprite->setAnchorPoint(Point(1, 1));
bestScoreSprite->setPosition(scorepanelSprite->getContentSize().width - 28 ,
50);
scorepanelSprite->addChild(bestScoreSprite);
           

五、小結

本節主要介紹了數字的顯示方式,有關詳細代碼,還請移步到github: https://github.com/OiteBoys/Earlybird

繼續閱讀