cocos2dx初体验
阅读原文时间:2023年07月13日阅读:2

我们创建工程后总会自带一个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);

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章