Cocos2d-x 别急,先处理好CCScene和CCLayer的关系
别急,先处理好CCScene和CCLayer的关系
在整个游戏开始之前,我们先看一下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就一致了。要注意的是,GameLayer会是整个游戏的容器,它上面放置了飞机层,子弹层,UFO层,控制层等等,是整个游戏的基层,另外还包含了一些额外的属性,比如游戏难度等等,这些在后面都会介绍到。
//AppDelegate.cpp
CCScene *pScene = GameScene::create();
pDirector->runWithScene(pScene);
更多建议: