转载请表明地址:/jackystudio/article/details/11713197
在整个游戏开始之前,我们先看一下HelloWorld示例中CCScene和CCLayer之间的关系是怎么处理的。
//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();//通过此函数获取场景指针LAYER_CREATE_FUNC(HelloWorld);};#endif // __HELLOWORLD_SCENE_H__
//HelloWorldScene.cpp#include "HelloWorldScene.h"USING_NS_CC;CCScene* HelloWorld::scene(){CCScene *scene = CCScene::create();//创建并返回场景指针HelloWorld *layer = HelloWorld::create();scene->addChild(layer);return scene;}bool HelloWorld::init(){if ( !CCLayer::init() ){return false;}return true;}
cocos2d-x的示例中采用的是创建一个继承于CCLayer的HelloWorldScene,然后通过HelloWorldScene这个Layer中提供一个产生CCScene的指针的静态函数,获取场景的指针,载入场景。
但是我们这里并不打算这么做,通过一个CCLayer的子类来获取CCScene的指针,这样用起来很奇怪,所以,我把CCScene和CCLayer严格的分开来使用。
1.创建GameScene类继承于CCScene。
2.创建GameLayer类继承于CCLayer。
3.为GameScene添加成员变量 GameLayer* _gameLayer。
4.在GameScene的init里把_gameLayer add到场景中。
这样就能把GameScene和GameLayer结合起来,同时又分工独立。在后面的其他场景也是这样进行处理的。GameScene的结构如下。
//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实例CC_BREAK_IF(!_gameLayer);this->addChild(_gameLayer);//add _gameLayer到场景中bRet=true;} while (0);return bRet;}
而GameLayer就不再产生场景指针了。导演类直接从GameScene中获取场景指针。GameLayer其余部分的结构和HelloWorldScene就一致了。
//AppDelegate.cppCCScene *pScene = GameScene::create();pDirector->runWithScene(pScene);