上面提到,我们写游戏是从定制我们的Scene开始的。如何定制我们的Scene呢?有两种做法,第一种是继承Scene,改写他的init函数来添加演员。第二种是,直接在外部动态的添加演员。这里我们使用第二种方法。cocos2d-x在架构上支持多个Scene的切换,我们这里只把Scene作为一个舞台或者容器,他本身不提供任何额外的功能。而且我们只使用一个Scene来开发游戏。对于简单的游戏开发来说,使用多个Scene能起到简化代码作用,但是如果是复杂点的游戏,使用一个Scene能提高我们的控制能力。
如果Scene不提供内容,那么谁来提供内容呢?那就是Layer。Scene里面可以添加多个Layer来呈现内容。而Layer本身其实也只是一个容器和管理工具,他管理多个Sprite。真正提供内容的正是Sprite。在我刚开始写游戏的时候,我很纳闷,做游戏怎么和雪碧扯上关系了。这里的Sprite是一个通用的游戏术语,翻译为精灵,你可以理解为一张图片。
cocos2d-x本身提供的Layer也是没有内容的,需要我们来定制。这里我们采用第一种做法,继承一个Layer来定制他。比如说我们需要现实一个游戏的背景图片,可以使用下面的代码:
class HelloBgLayer : public cocos2d::Layer
{
public:
HelloBgLayer() = default;
virtual ~HelloBgLayer() = default;
virtual bool init();
CREATE_FUNC(HelloBgLayer);
};
USING_NS_CC;
bool HelloBgLayer::init()
{
if (!Layer::init()) {
return false;
}
auto bg = Sprite::create("bg.png");
bg->setPosition(_contentSize.width/2, _contentSize.height/2);
addChild(bg);
return true;
}
现在我们有了自己定制的Layer,我们就需要把他添加到场景中去,并且是在导演开始场景之前就准备好:
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
auto director = Director::getInstance();
auto scene = Scene::create();
auto layer = HelloBgLayer::create();
scene->addChild(layer);
director->runWithScene(scene);
return true;
}
现在我们游戏的背景就已经搭建好了。
一张好的bg就能带来游戏感十足的体验。要做到这步需要注意几点:
如何使用C++里面的类和继承需要参考一点C++语法,这里我们覆写init函数,来达到定制的目的。在init函数里面,我们要先调用父类的init函数,这是最严谨的做法,不调用都是错误的。之后我们要创建一个背景精灵,添加到我们的Layer。为了能正确显示,需要我们吧bg.png这个文件添加到工程中去。后面的代码是设置背景的位置,使用的是Layer的尺寸的一半,也就是中心点的位置。为了使用上的方便,我们利用CREATE_FUNC(HelloBgLayer);来添加一个create函数。之后我们就能利用HelloBgLayer::create()来创建我们的BgLayer了。
我们的Layer已经布置好,为了让观众看到,还需要添加到Scene里面去。这里比上面多了2行代码。第一行创建一个BgLayer,第二行把这个BgLayer添加到Scene里面。这样导演运行场景的时候,我们的Layer就显示出来了。