1、bool AppDelegate::applicationDidFinishLaunching()

(1)这个函数是一切的开始,看一下这个函数做了写什么:

    bool  
      AppDelegate::applicationDidFinishLaunching() { 
     
 
           
      // initialize director 
     
 
           
      CCDirector* pDirector = CCDirector::sharedDirector(); 
     
 
           
      CCEGLView* pEGLView = CCEGLView::sharedOpenGLView(); 
     

         
     
 
           
      pDirector->setOpenGLView(pEGLView); 
     
 
            
     
 
           
      // turn on display FPS 
     
 
           
      pDirector->setDisplayStats( 
      true 
      );// 是否显示帧数等调试信息 
     

         
     
 
           
      // set FPS. the default value is 1.0/60 if you don't call this 
     
 
           
      pDirector->setAnimationInterval(1.0 / 60);// 设置游戏的帧率 
     

         
     
 
           
      // create a scene. it's an autorelease object 
     
 
           
      CCScene *pScene = HelloWorld::scene();// 创建一个场景 
     

         
     
 
           
      // run 
     
 
           
      pDirector->runWithScene(pScene);// 根据创建的场景,run起来 
     

         
     
 
           
      return  
      true 
      ; 
     
 


(2)显然,我们要实现在窗口中输出HelloWord,只要写一个相应的场景scene就可以了。


2、MyHelloWorldScene场景类

(1)首先,利用类向导添加一个名为MyHelloWorldScene的C++类,因为文件创建位置的缘故,不建议直接用类向导添加类,而建议手动添加.h和.cpp文件并将文件放到Classes文件夹下。

Cocos2dx学习笔记(二)MyHelloWorldScene场景类_cocos2d-x


Cocos2dx学习笔记(二)MyHelloWorldScene场景类_#define_02


(2)关于CREATE_FUNC宏,其实就是定义了一个静态的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; \ 
     
 
           
      } \ 
     


说明:

a、这个宏是一个带参数的宏函数,参数为__TYPE__,实际调用时传入的就是调用类的类名;

b、关于每行结尾的“\”符,用于表示一行未完,也就是说为了书写阅读便利将本该是一行的内容写成多行,但是加上“\”符号后,对于编译器来说,依然是一行。究其根本,是因为宏定义只允许一条语句。

c、这个宏的内容就是声明和定义了一个返回调用类指针的create函数,并且该函数是静态函数。


(3)讲到宏,再介绍两个十分常用的宏:

a、USING_NS_CC,即using namespace cocos2d

b、CC_BREAK_IF,定义如右:#define CC_BREAK_IF(cond)            if(cond) break


(4)贴出场景类模板代码

MyHelloWorldScene .h


      #pragma once 
     
 
      #include "cocos2d.h" 
     

         
     
 
      class  
      MyHelloWorldScene :  
      public  
      cocos2d::CCScene 
     
 
      { 
     
 
      public 
      : 
     
 
           
      CREATE_FUNC(MyHelloWorldScene); 
     
 
           
      virtual  
      bool  
      init(); 
     


MyHelloWorldScene .cpp

  #include "MyHelloWorldScene.h" 
     

         
     
 
      bool  
      MyHelloWorldScene::init() 
     
 
      { 
     
 
           
      bool  
      bRct =  
      false 
      ; 
     
 
           
      do  
     
 
           
      { 
     
 
               
      CC_BREAK_IF( !CCScene::init() ); 
     

         
     
 
               
      bRct =  
      true 
      ; 
     
 
           
      }  
      while  
      (0); 
     

         
     
 
           
      return  
      bRct; 
     
 


说明:在MyHelloWorldScene类中其实实现了两个函数,即create函数和init函数,并且在create函数中调用了init函数。


(5)既然有场景类了,那么这么运行这个场景呢,前面提到过一个函数applicationDidFinishLaunching,自动生成的HelloWorldScene场景就是在这个函数内创建并运行的。我们依葫芦画瓢,修改相应的代码:

a、首先,包含我们创建的场景类的头文件:#include "MyHelloWorldScene.h"

b、其次,修改applicationDidFinishLaunching函数中的代码,注释掉原有的代码,并添加自己的代码:

   bool  
      AppDelegate::applicationDidFinishLaunching() { 
     

         
     
 
           
      ... ...// 省略 
     

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

         
     
 
           
      // run 
     
 
           
      pDirector->runWithScene(pScene); 
     

         
     
 
           
      return  
      true 
      ; 
     
 
      } 


c、尝试运行,编译链接通过,如下:

Cocos2dx学习笔记(二)MyHelloWorldScene场景类_#include_03


(6)我们看到,程序虽然跑起来了,但是却没有显示任何内容(一片黑色)。这是因为场景中是空的,我们只是搭了一个架子,舞台上没有任何东西。


3、还是先总结一下吧,以便日后又忘了

(1)Cocos2d-x项目的初始化过程,实际项目创建时只有一个AppDelegate类,和一个场景类;AppDelegate类除了构造函数和析构函数外,有3个函数,分别是applicationDidFinishLaunching、applicationDidEnterBackground和applicationWillEnterForeground。名字够长,意思也很明显,主要就是applicationDidFinishLaunching这个函数,它完成整个程序的初始化过程,如果整个过程无误的话(返回值为true),那么程序就run起来了。

(2)而在applicationDidFinishLaunching函数中具体做的操作就是创建了一个场景,并更具这个场景运行程序(当然还有一些其它的参数设置);

(3)而创建场景时,会调用了场景类的create函数,这个函数定义在一个宏(CREATE_FUNC)内;

(4)而在create函数中,会调用init函数,也就是说init是create的一部分。

(5)如果我们想要往场景中添加“东西”,只要放在init函数中就可以了。