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);

 

posted @ 2020-02-15 00:12  zust-lms  阅读(325)  评论(0编辑  收藏  举报