天天看點

【cocos2dx-3.0beta-制作flappybird】玄關是必要的—遊戲歡迎界面的建立

這一節裡,我們主要是講解遊戲歡迎界面的制作。這裡我們把遊戲也當作一個場景(WelcomeScene)來實作——盡管它做的事情非常的簡單,僅僅是加載了歡迎層(WelcomeLayer)

ok,讓我們不妨先來看看我們最後完成的效果是什麼樣的吧。

【cocos2dx-3.0beta-制作flappybird】玄關是必要的—遊戲歡迎界面的建立

在welcomelayer這一層中,主要有這麼一些元素: 1)背景 2)地面 3)遊戲名字、版權描述 4)開始遊戲按鈕 5)揮動翅膀的小鳥

那麼,接下來我們要做的事情就非常簡單明了了——把合适的 精靈放在合适的位置即可!

一、背景的放置:

原版的背景是随機的,這裡我們做了一點小小的改動,即在白天的時候顯示白天的背景,而在晚上的時候顯示晚上的背景,那麼具體如何實作的呢?且看如下代碼:

//get the current time, the background image will selected by current time day or night: bg_day or bg_night
 time_t t = time(NULL);
 tm* lt = localtime(&t);
 int hour = lt->tm_hour;

 //create the background image according to the current time;
 Sprite *background;
 if(hour >= 6 && hour <= 17){
     background = Sprite::createWithSpriteFrame(AtlasLoader::getInstance()->getSpriteFrameByName("bg_day"));
 }else{
    background = Sprite::createWithSpriteFrame(AtlasLoader::getInstance()->getSpriteFrameByName("bg_night"));
 }
 background->setAnchorPoint(Point::ZERO);
 background->setPosition(Point::ZERO);
 this->addChild(background);           

二、地面效果:

咋一看地面是在不斷滾動的,不難了解,讓圖檔不斷往左移動即可實作這種效果。那麼,一張圖檔可以實作這樣的效果嗎? 事實上,通常我們采用兩個精靈(land1,land2),不斷交替地移動他們的X軸坐标。即當一張圖檔移出左邊視野以後,就設定它的X軸坐标為右邊最大值,這樣它又可以開始第二次的從右往左移動了。如此交替反複滾動,就實作了我們所看到的地面滾動的效果了。 這裡涉及到一個定時器的使用:

this->schedule(schedule_selector(WelcomeLayer::scrollLand), 0.01f);           

即每隔0.01S執行一次WelcomeLayer::scrollLand()函數。 聯系定時器的功能,也許你已經猜測scrollLand()函數所做的事情了,是的,其實就是不斷的設定land1,和land2 的X軸坐标啦。好吧,讓我們來看看它的廬山正面目吧:

void WelcomeLayer::scrollLand(float dt){
 this->land1->setPositionX(this->land1->getPositionX() - 2.0f);
 this->land2->setPositionX(this->land1->getPositionX() + this->land1->getContentSize().width - 2.0f);
 if(this->land2->getPositionX() == 0) {
  this->land1->setPositionX(0);
 }
}
           

三、遊戲名稱和版權資訊

顯然這兩個隻是普通的精靈而已,我們需要對他們的操作非常簡單。建立Sprite->setPosition()->addChild() 下面簡單舉例對遊戲名稱的操作:

//add the word game-title to the current scene
 Sprite *title = Sprite::createWithSpriteFrame(AtlasLoader::getInstance()->getSpriteFrameByName("title"));
 title->setPosition(Point(origin.x + visiableSize.width/2 , (visiableSize.height * 5) / 7));
 this->addChild(title);           

四、開始按鈕

相比遊戲名稱,我們發現當我們點選開始按鈕的時候,它是有動作的。是的這裡我們将引出一個菜單的概念。開始按鈕實際上應該稱之為菜單更加貼切。相比較Android裡面的OnClick事件,這裡的菜單通過回調函數來響應菜單項被選中時的事件。 1、一個菜單可以包括若幹菜單項,我們不妨先建立一個菜單項:

auto menuItem = MenuItemSprite::create(startButton,activeStartButton,NULL,CC_CALLBACK_1(WelcomeLayer::menuStartCallback, this));           

-------

1)MenuItemSprite::create() 的具體使用不妨參考一下cocosdx文檔學習一下 2)CC_CALLBACK_1 為cocos2dx 3.0 新定義的關于回調函數的宏 3)顯然,此處的menuStartCallback 就是菜單項選中以後的回調函數

2、然後,我們需要把這個菜單項放到某個菜單中去:

auto menu = Menu::create(menuItem,NULL);           

3、接下來我們要做的事情,當然就是放置這個菜單項了:

menu->setPosition(Point(origin.x ,origin.y));
 this->addChild(menu,1);           

五、揮動翅膀的小鳥

作為遊戲的主角,我們單獨寫了一個小鳥類來處理小鳥的相關動作。 這一步,我們不妨簡單地先添加一隻不會動的小鳥(嗯,我想你可以的= =),而在之後的小節中,我們将詳細講解小鳥類的具體實作。

六、小結

在這一節當中,我們引入了精靈的概念,介紹了遊戲歡迎界面的建立,菜單的使用,定時器的使用等等。如果你被這些概念弄糊塗了的話,不妨找一本cocos2dx的書籍來翻翻。當然最直接,最詳細的第一手資料當屬官方文檔了。

具體代碼以及遊戲截屏還有遊戲請移步該遊戲在代碼倉庫: https://github.com/OiteBoys/Earlybird

繼續閱讀