cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建
一、場(chǎng)景與層的關(guān)系:
cocos2dx的框架可以說主要由導(dǎo)演,場(chǎng)景,層,精靈來(lái)構(gòu)成:
1、其中導(dǎo)演,意如其名,就是操控整個(gè)游戲的一個(gè)單例,管理著整個(gè)游戲。
2、場(chǎng)景就像電影的一幕劇情,所以說,懂得如何劃分好游戲的場(chǎng)景,是開始動(dòng)手做游戲的第一步。
3、一個(gè)場(chǎng)景會(huì)有很多層,用來(lái)處理場(chǎng)景不同的功能。
4、而精靈則是最小的單位,比如子彈,飛機(jī),敵機(jī)都是一個(gè)個(gè)的精靈所組成的。
?
二、WelcomeScene的搭建:
1、場(chǎng)景和層的二種搭建方法:
(1)一種就是跟HelloWorld示例一樣的方法,以一個(gè)層為主體,然后這個(gè)層建立成一個(gè)場(chǎng)景,這種方式適合用再一個(gè)場(chǎng)景下只有一個(gè)層的時(shí)候,可以縮短代碼的長(zhǎng)度。
(2)另一種就是先建立一個(gè)場(chǎng)景,然后再建立層。這是我比較推薦的做法,因?yàn)楸救耸莻€(gè)小白,認(rèn)為這種方法比較如何我們正常人的思維= =。然后先貼WelcomeScene.h的代碼:
#include "cocos2d.h"USING_NS_CC; //用引擎要的頭文件和名字空間class WelcomeScene :public Scene { public:CREATE_FUNC(WelcomeScene); //一個(gè)宏定義virtual bool init(); //繼承的init方法 };1、CREATE_FUNC():其實(shí)它就是一個(gè)宏定義,可以追蹤下去看他的代碼:
#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; \} }其實(shí)就是一個(gè)創(chuàng)建的方法,首先new一個(gè)新的對(duì)象,然后檢驗(yàn)是否申請(qǐng)到內(nèi)存,沒有的話直接跳過,有的話,執(zhí)行init()的方法。于是呢init()方法便成為一個(gè)場(chǎng)景的主干,就相當(dāng)于C++語(yǔ)言的main函數(shù)的感覺吧。
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; }其實(shí)就是創(chuàng)建一個(gè)WelcomeLayer然后通過addChild的方法加到這個(gè)場(chǎng)景當(dāng)中。
三、WelcomeLayer的搭建
如果說Scene是個(gè)大的一幕劇情,那么layer就代表了這一幕劇情中每一個(gè)角色。
這個(gè)WelcomeLayer主要是實(shí)現(xiàn)一個(gè)資源的加載,由于不能太過無(wú)聊所以還得加一個(gè)小小的緩沖幀動(dòng)畫。然后:
1、我們先看如何進(jìn)行資源的加載和背景的加入。
//主要通過cocos已經(jīng)實(shí)現(xiàn)的單例將所需要的圖片的plist文件加入SpriteFrameCache::getInstance()->addSpriteFramesWithFile("shoot.plist");SpriteFrameCache::getInstance()->addSpriteFramesWithFile("shoot_background.plist");//創(chuàng)建背景auto background = Sprite::createWithSpriteFrameName("background.png");background->setAnchorPoint(Vec2::ZERO);background->setPosition(Vec2::ZERO);this->addChild(background);//創(chuàng)建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)大家可以想一下,其實(shí)一個(gè)游戲的本質(zhì)就是在不停的繪圖,那你想想,如果每次再畫一個(gè)圖的時(shí)候再把圖片加入到內(nèi)存中,是不是會(huì)一卡一卡的 = = 所以呢,我們通過cocos2d封裝的方法一次性先加入進(jìn)去。
(2)然后大家可能不大清楚什么是plist文件,首先我們加載圖片資源的時(shí)候,其實(shí)是把所有的圖片打包成一個(gè)圖片加入進(jìn)去的,但我們要記錄那個(gè)圖片在新生成的圖片的哪一個(gè)位置,所以便需要引入一個(gè)plist文件,它就是一張表格,記錄了每個(gè)圖片在新生成圖片中的位置。上圖。如下~
???? ……?????????????????????????????????????????????
????????????????? 小的圖片???????????????????????????????????????????????????????????????????????????????????????? 打包后新生成的圖片。
(3)然后就是創(chuàng)建一個(gè)背景的精靈,設(shè)置錨點(diǎn)和位置,最后加入到這個(gè)層中。然后主要是這個(gè)錨點(diǎn)的定義,錨點(diǎn)其實(shí)就相當(dāng)于在一個(gè)圖片上打上一個(gè)圖釘,以這一個(gè)圖釘?shù)奈恢脕?lái)代表整個(gè)圖片的位置,然后通過setPosition來(lái)設(shè)置圖片的位置。
(4)copyRight和背景的創(chuàng)建類似。
(5)Vec2就是Point,代表一個(gè)點(diǎn)的數(shù)據(jù)類型。
2、幀動(dòng)畫的創(chuàng)建:
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;幀動(dòng)畫就是通過記賬圖片在很短的時(shí)間內(nèi)進(jìn)行形成的動(dòng)畫,所以可以看到,我們先設(shè)置動(dòng)畫的第一幀為一個(gè)精靈,然后創(chuàng)建一個(gè)幀動(dòng)畫,通過addSpriteFrame的方法加入圖片,然后通過setDelayPerUnit的方法設(shè)置切換圖片的時(shí)間,然后讓精靈做這個(gè)動(dòng)畫,然后的然后就看效果吧,這一節(jié)學(xué)習(xí)筆記就結(jié)束了= =,我怎么覺得寫完會(huì)累死的節(jié)奏。
?
??????????????????????????????????????????????????
總結(jié)
以上是生活随笔為你收集整理的cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 1261 字串数
- 下一篇: input的readonly属性与Tex