cocos2dx的框架能夠說主要由導演,場景,層,精靈來構成:框架
一、其中導演,意如其名,就是操控整個遊戲的一個單例,管理着整個遊戲。函數
二、場景就像電影的一幕劇情,因此說,懂得如何劃分好遊戲的場景,是開始動手作遊戲的第一步。學習
三、一個場景會有不少層,用來處理場景不一樣的功能。動畫
四、而精靈則是最小的單位,好比子彈,飛機,敵機都是一個個的精靈所組成的。this
一、場景和層的二種搭建方法: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文件,它就是一張表格,記錄了每一個圖片在新生成圖片中的位置。上圖。以下~
小的圖片 打包後新生成的圖片。
(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的方法設置切換圖片的時間,而後讓精靈作這個動畫,而後的而後就看效果吧,這一節學習筆記就結束了= =,我怎麼以爲寫完會累死的節奏。