cocos2dx遊戲開發——微信打飛機學習筆記(三)——WelcomeScene的搭建

1、場景與層的關係:

cocos2dx的框架能夠說主要由導演,場景,層,精靈來構成:框架

一、其中導演,意如其名,就是操控整個遊戲的一個單例,管理着整個遊戲。函數

二、場景就像電影的一幕劇情,因此說,懂得如何劃分好遊戲的場景,是開始動手作遊戲的第一步。學習

三、一個場景會有不少層,用來處理場景不一樣的功能。動畫

四、而精靈則是最小的單位,好比子彈,飛機,敵機都是一個個的精靈所組成的。this

 

2、WelcomeScene的搭建:

一、場景和層的二種搭建方法:spa

(1)一種就是跟HelloWorld示例同樣的方法,以一個層爲主體,而後這個層創建成一個場景,這種方式適合用再一個場景下只有一個層的時候,能夠縮短代碼的長度。code

(2)另外一種就是先創建一個場景,而後再創建層。這是我比較推薦的作法,由於本人是個小白,認爲這種方法比較如何咱們正常人的思惟= =。而後先貼WelcomeScene.h的代碼:對象

#include "cocos2d.h"

USING_NS_CC;                         //用引擎要的頭文件和名字空間

class WelcomeScene :public Scene       
{
public:

    CREATE_FUNC(WelcomeScene);     //一個宏定義

    virtual bool init();                  //繼承的init方法
};

一、CREATE_FUNC():其實它就是一個宏定義,能夠追蹤下去看他的代碼:blog

#define CREATE_FUNC(__TYPE__)
 \
static __TYPE__* create() \

{ \
    __TYPE__ *pRet = new __TYPE__(); \
 
   if (pRet && pRet->init()) \
  
  { \
        pRet->autorelease(); \
      
  return pRet; \
    } \
   
 else \
   
 { \
        delete pRet; \
    
    pRet = NULL; \
     
   return NULL; \
   
 } 

}

其實就是一個建立的方法,首先new一個新的對象,而後檢驗是否申請到內存,沒有的話直接跳過,有的話,執行init()的方法。因而呢init()方法便成爲一個場景的主幹,就至關於C++語言的main函數的感受吧。繼承

二、而後就是init的方法作了什麼,咱們看看WelcomeScene.cpp:

#include "WelcomeScene.h"
#include "WelcomeLayer.h"

USING_NS_CC;

bool WelcomeScene::init()
{
    if (!Scene::init())
    {
        return false;
    }
    
    auto layer = WelcomeLayer::create();
    if (layer)
    {
        this->addChild(layer);
    }

    
    return true;
}

其實就是建立一個WelcomeLayer而後經過addChild的方法加到這個場景當中。

3、WelcomeLayer的搭建

若是說Scene是個大的一幕劇情,那麼layer就表明了這一幕劇情中每個角色。

這個WelcomeLayer主要是實現一個資源的加載,因爲不能太過無聊因此還得加一個小小的緩衝幀動畫。而後:

一、咱們先看如何進行資源的加載和背景的加入。

//主要經過cocos已經實現的單例將所須要的圖片的plist文件加入
 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("shoot.plist");
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("shoot_background.plist");


//建立背景
    auto background = Sprite::createWithSpriteFrameName("background.png");
    background->setAnchorPoint(Vec2::ZERO);
    background->setPosition(Vec2::ZERO);
    this->addChild(background);

//建立copyRight
    auto copyRight = Sprite::createWithSpriteFrameName("shoot_copyright.png");
    copyRight->setPosition(Vec2(origin.x + visibleSize.width/2, origin.y + visibleSize.height / 3*2));
    this->addChild(copyRight);

(1)你們能夠想一下,其實一個遊戲的本質就是在不停的繪圖,那你想一想,若是每次再畫一個圖的時候再把圖片加入到內存中,是否是會一卡一卡的 = = 因此呢,咱們經過cocos2d封裝的方法一次性先加入進去。

(2)而後你們可能不大清楚什麼是plist文件,首先咱們加載圖片資源的時候,實際上是把全部的圖片打包成一個圖片加入進去的,但咱們要記錄那個圖片在新生成的圖片的哪個位置,因此便須要引入一個plist文件,它就是一張表格,記錄了每一個圖片在新生成圖片中的位置。上圖。以下~

hero2hero1     ……                                              shoot

                  小的圖片                                                                                         打包後新生成的圖片。

(3)而後就是建立一個背景的精靈,設置錨點和位置,最後加入到這個層中。而後主要是這個錨點的定義,錨點其實就至關於在一個圖片上打上一個圖釘,以這一個圖釘的位置來表明整個圖片的位置,而後經過setPosition來設置圖片的位置。

(4)copyRight和背景的建立相似。

(5)Vec2就是Point,表明一個點的數據類型。

二、幀動畫的建立:

auto gameLoading = Sprite::createWithSpriteFrameName("game_loading1.png");
    gameLoading->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 7*3));
    this->addChild(gameLoading);


    auto animation = Animation::create();
    animation->setDelayPerUnit(0.5f);
    animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading1.png"));
    animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading2.png"));
    animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading3.png"));
    animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading4.png"));
    auto animate = Animate::create(animation);

gameLoading->runAction(animate);
    return true;

幀動畫就是經過記帳圖片在很短的時間內進行造成的動畫,因此能夠看到,咱們先設置動畫的第一幀爲一個精靈,而後建立一個幀動畫,經過addSpriteFrame的方法加入圖片,而後經過setDelayPerUnit的方法設置切換圖片的時間,而後讓精靈作這個動畫,而後的而後就看效果吧,這一節學習筆記就結束了= =,我怎麼以爲寫完會累死的節奏。

 

                                                   QQ截圖20140806215552

相關文章
相關標籤/搜索