一、引言
在遊戲進行的過程當中,我們需要實時的顯示得分,此外在遊戲結束的時候,也需要顯示最高分和本局得分。是以本節主要是講解如何顯示這些分數。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiN1EDM1czMwETMyMDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
二、數字類的設計
這裡我們寫了一個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