cocos2dx初体验
我们创建工程后总会自带一个HelloWorld类,短短的几行代码就出来了一个游戏的雏形,请问我们真的理解它了吗?如果我们能早一点弄明白这几行代码,我们或许会比现在走得更远。
理解HelloWorld类
HelloWorld去掉退出按钮只有下面三个函数。
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(HelloWorld);//一定要自己看源码
这三行代码一定要做到透彻理解和重写。因为所有的游戏场景都需要这三个函数。
创建游戏HelloWorld场景的时候,只需要在AppDelegate写一句: Helloworld::createScene();
请看它的实现
// 'scene' is an autorelease object
auto scene = Scene::create();
// 'layer' is an autorelease object
auto layer = HelloWorld::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
首先新建一个新场景,然后create一个HelloWorld层并添加到新创建的场景,最后返回这个场景给AppDelegate。
一个场景的创建和展示就是这么简单,但是你有没有发现HelloWorld中没有create呢?并且没有调用init()方法呢?我们在HelloWorld中没有在任何地方看到调用init初始化,那么这是在哪里调用的呢?
这里当时我看一个博主的博客理解了半天,
其实就是在CREATE_FUNC(MainScene);中,你点击CREATE_FUNC按F12也行,右击转到定义也可以。
就会出现如下宏定义
#defineCREATE_FUNC(__TYPE__) \ static __TYPE__*create() \ { \ __TYPE__ *pRet = new __TYPE__(); \ if (pRet && pRet->init()) \ { \ pRet->autorelease(); \ return pRet; \ } \ else \ { \ delete pRet; \ pRet = NULL; \ return NULL; \ } \ }
这里 \ 就是换行,因为宏定义代码如果放同一行阅读不方便
可以看到CREATE_FUNC宏其实是定义了一个静态成员函数,这个函数可以new一个新的对象,并对其进行init()操作。
这样整个Helloworld的逻辑就清晰了:
外部类调用static cocos2d::Scene* createScene();来创建一个新的场景。 CREATE_FUNC(HelloWorld);是定义一个静态的create类成员函数,并在这个函数中调用virtual bool init();初始化这个场景。
以后每当我们新建一个场景的时候,按照这个格式即可。好了,下面该动手了。
其实就是在HelloWorld.h中将helloworld换成MainScene,这就是在外部类调用函数创建了一个新的场景,那这样还不行啊,是不是,我们还要初始化这个场景,那就要调用virtual bool init();那怎么调用呢,就需要之前提到的CREATE_FUNC的宏定义,在宏定义里面调用。
所以这里就有这3行代码是非常重要的。
这样我们就完全掌握了游戏场景的创建和它的原理,其实更重要的是我们认识到了应该去怎么学,cocos2dx引擎使用了大量的宏定义,我们一定不能只追求表面的用法,而应该深入下去学习宏实现了那些东西。特别是到后面的内存管理更是如此。
总结一下,也再重复一遍,所有游戏场景的基础都是这三句代码:
static cocos2d::Scene* createScene(); virtual bool init(); CREATE_FUNC(HelloWorld);