cocos2dx HelloWorld 第一个例子的代码解析


    前段时间一直在忙着游戏的开发工作,很少有时间看cocos2dx,最近时间比较充裕,又重新开始cocos2dx的学习工作。


    话说看了 testcpp的一些源码,看了各种例子和****,到现在突然间觉得无从下手了,碉堡了,所以我觉得有必要梳理一下学习的思路,以免走错道。


    话不多说,开始记录


     首先按惯例开始创建第一个项目hello world,创建的方式很多种,在这里我用的是python脚本方式创建的,网上查看了一下,大家貌似都推荐这种创建方式,创建的步骤,在另外一边文章中有记录了,在这里就不多说了,网上的文章一大推,搜索方式 百度,输入cocos2dx python 肯定有答案的

     在这里给出一个我的简单记录地址:http://864343928.iteye.com/blog/2081967


   创建好项目之后,运行后看到的效果:
                 
              
cocos2dx HelloWorld 第一个例子的代码解析
 


    当然看到的不是hello world几个大字,我修改了一下,以表示我对运行成功之后的心情cocos2dx HelloWorld 第一个例子的代码解析

  

   以上是运行效果,现在看一下项目的结构,只看class文件中的结构,其他的以后有时间在介绍,如下:

 

                                              
cocos2dx HelloWorld 第一个例子的代码解析
 

     

 

      AppDelegate 游戏的入口,从oc衍生过来的, 里面包含游戏的启动,暂停以及结束等等方法

      HelloWorldScene 这个就是主场景得类

 

     AppDelegate 的bool AppDelegate::applicationDidFinishLaunching() 的方法中创建了一个场景,并让导演运行这个场景

 

     // create a scene. it's an autorelease object
    CCScene *pScene = HelloWorld::scene();

    // run
    pDirector->runWithScene(pScene);

    然后在来看HelloWorldScene ,看代码可以知道,HelloWorldScene是一个层,她有一个方法是创建一个场景,然后还有一个宏,这个宏就是创建她本身即一个层

   //继承了一个层

     class HelloWorld : public cocos2d::CCLayer
{
public:
    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init(); 

    // there's no 'id' in cpp, so we recommend returning the class instance pointer

    //静态方法创建一个场景
    static cocos2d::CCScene* scene();
   
    // a selector callback
    void menuCloseCallback(CCObject* pSender);
   
    // implement the "static node()" method manually

    //一个实现宏,创建一个层就是helloWorldScene  他本身
    CREATE_FUNC(HelloWorld);
};

 

在来看helloworldscene的实现文件helloworldscene.cpp

 

   通过调用CCScene的静态方法,创建一个场景的指针,然后在调用HelloWorld的create的方法,创建一个层并且把层加入到场景中 看代码

 

    CCScene* HelloWorld::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();
   
    // 'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

 

当调用helloworld的create()方法时,这个方法首先会,调用helloworld类的构造函数,然后调用init() 初始化方法,然后告诉这个指针会自动释放内存,这样就完成了整个hello world项目的初始化工作。

  这个是helloWorldScene 的create()方法的宏定义

    #define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
    __TYPE__ *pRet = new __TYPE__(); \
    if (pRet && pRet->init()) \
    { \
        pRet->autorelease(); \
        return pRet; \
    } \
    else \
    { \
        delete pRet; \
        pRet = NULL; \
        return NULL; \
    } \
}

 

  

    整个的流量是,appDelegate的初始化方法,调用helloWorldScene的 scene()方法,创建一个场景,而在helloWorldScene的scene()方法中,创建场景的同时,创建一个他自己本身的层并且加入到场景中,然后创建层的同时完成初始化的工作