Cocos2d-x 別急,先處理好CCScene和CCLayer的關(guān)系

2018-08-12 21:19 更新

別急,先處理好CCScene和CCLayer的關(guān)系

在整個(gè)游戲開始之前,我們先看一下HelloWorld示例中CCScene和CCLayer之間的關(guān)系是怎么處理的。

    //HelloWorldScene.h
    #ifndef __HELLOWORLD_SCENE_H__
    #define __HELLOWORLD_SCENE_H__

    #include "cocos2d.h"

    class HelloWorld : public cocos2d::CCLayer
    {
    public:
        virtual bool init();

        static cocos2d::CCScene* scene();//通過此函數(shù)獲取場(chǎng)景指針

        LAYER_CREATE_FUNC(HelloWorld);
    };

    #endif // __HELLOWORLD_SCENE_H__
    //HelloWorldScene.cpp
    #include "HelloWorldScene.h"

    USING_NS_CC;

    CCScene* HelloWorld::scene()
    {
        CCScene *scene = CCScene::create();//創(chuàng)建并返回場(chǎng)景指針

        HelloWorld *layer = HelloWorld::create();

        scene->addChild(layer);

        return scene;
    }

    bool HelloWorld::init()
    {
        if ( !CCLayer::init() )
        {
            return false;
        }
        return true;
    }

cocos2d-x的示例中采用的是創(chuàng)建一個(gè)繼承于CCLayer的HelloWorldScene,然后通過HelloWorldScene這個(gè)Layer中提供一個(gè)產(chǎn)生CCScene的指針的靜態(tài)函數(shù),獲取場(chǎng)景的指針,載入場(chǎng)景。

但是我們這里并不打算這么做,通過一個(gè)CCLayer的子類來獲取CCScene的指針,這樣用起來很奇怪,所以,我把CCScene和CCLayer嚴(yán)格的分開來使用。

1.創(chuàng)建GameScene類繼承于CCScene。

2.創(chuàng)建GameLayer類繼承于CCLayer。

*3.為GameScene添加成員變量 GameLayer _gameLayer。**

4.在GameScene的init里把_gameLayer add到場(chǎng)景中。

這樣就能把GameScene和GameLayer結(jié)合起來,同時(shí)又分工獨(dú)立。在后面的其他場(chǎng)景也是這樣進(jìn)行處理的。GameScene的結(jié)構(gòu)如下。

    //GameScene.h
    #pragma once

    #include "cocos2d.h"
    #include "GameLayer.h"

    USING_NS_CC;

    class GameScene :
        public CCScene
    {
    public:

        GameScene(void);

        ~GameScene(void);

        SCENE_CREATE_FUNC(GameScene);

        virtual bool init();

        GameLayer* _gameLayer;//把GameLayer暴露給GameScene

    };
    //GameScene.cpp
    #include "GameScene.h"

    GameScene::GameScene(void)
    {
        _gameLayer=NULL;
    }

    GameScene::~GameScene(void)
    {
    }

    bool GameScene::init()
    {
        bool bRet=false;
        do
        {
            CC_BREAK_IF(!CCScene::init());
            _gameLayer=GameLayer::create();//在這里獲取GameLayer實(shí)例
            CC_BREAK_IF(!_gameLayer);
            this->addChild(_gameLayer);//add _gameLayer到場(chǎng)景中
            bRet=true;
        } while (0);

        return bRet;
    }

而GameLayer就不再產(chǎn)生場(chǎng)景指針了。導(dǎo)演類直接從GameScene中獲取場(chǎng)景指針。GameLayer其余部分的結(jié)構(gòu)和HelloWorldScene就一致了。要注意的是,GameLayer會(huì)是整個(gè)游戲的容器,它上面放置了飛機(jī)層,子彈層,UFO層,控制層等等,是整個(gè)游戲的基層,另外還包含了一些額外的屬性,比如游戲難度等等,這些在后面都會(huì)介紹到。

    //AppDelegate.cpp
    CCScene *pScene = GameScene::create();
    pDirector->runWithScene(pScene);  
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)