cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建
一、場景與層的關系:
cocos2dx的框架可以說主要由導演,場景,層,精靈來構成:
1、其中導演,意如其名,就是操控整個游戲的一個單例,管理著整個游戲。
2、場景就像電影的一幕劇情,所以說,懂得如何劃分好游戲的場景,是開始動手做游戲的第一步。
3、一個場景會有很多層,用來處理場景不同的功能。
4、而精靈則是最小的單位,比如子彈,飛機,敵機都是一個個的精靈所組成的。
?
二、WelcomeScene的搭建:
1、場景和層的二種搭建方法:
(1)一種就是跟HelloWorld示例一樣的方法,以一個層為主體,然后這個層建立成一個場景,這種方式適合用再一個場景下只有一個層的時候,可以縮短代碼的長度。
(2)另一種就是先建立一個場景,然后再建立層。這是我比較推薦的做法,因為本人是個小白,認為這種方法比較如何我們正常人的思維= =。然后先貼WelcomeScene.h的代碼:
#include "cocos2d.h"USING_NS_CC; //用引擎要的頭文件和名字空間class WelcomeScene :public Scene { public:CREATE_FUNC(WelcomeScene); //一個宏定義virtual bool init(); //繼承的init方法 };1、CREATE_FUNC():其實它就是一個宏定義,可以追蹤下去看他的代碼:
#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函數的感覺吧。
2、然后就是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的方法加到這個場景當中。
三、WelcomeLayer的搭建
如果說Scene是個大的一幕劇情,那么layer就代表了這一幕劇情中每一個角色。
這個WelcomeLayer主要是實現一個資源的加載,由于不能太過無聊所以還得加一個小小的緩沖幀動畫。然后:
1、我們先看如何進行資源的加載和背景的加入。
//主要通過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);//創建copyRightauto 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,代表一個點的數據類型。
2、幀動畫的創建:
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的方法設置切換圖片的時間,然后讓精靈做這個動畫,然后的然后就看效果吧,這一節學習筆記就結束了= =,我怎么覺得寫完會累死的節奏。
?
??????????????????????????????????????????????????
總結
以上是生活随笔為你收集整理的cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 1261 字串数
- 下一篇: input的readonly属性与Tex