Chinaunix首页 | 论坛 | 博客
  • 博客访问: 178848
  • 博文数量: 18
  • 博客积分: 334
  • 博客等级: 入伍新兵
  • 技术积分: 233
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-20 14:45
文章分类

全部博文(18)

文章存档

2015年(5)

2013年(7)

2012年(6)

我的朋友

分类: C/C++

2015-12-23 15:46:28

在写helloWorld之前,先说一下游戏的逻辑架构:
1、一个导演(Director)同一个时间内只能加载一个场景(Scene),一个场景(Scene)中,可以加载多个层(Layer);
2、在层(layer)里可以加载层(Layer);
3、在一个层(Scene)里可以同时出现多个精灵(Sprite);
游戏逻辑图如下:


分析代码:
首先,我们知道,AppDelegate.cpp里的applicationDidFinishLaunching()是工程入口函数,我们看一下里面的代码写的是什么:

点击(此处)折叠或打开

  1. bool AppDelegate::applicationDidFinishLaunching() {
  2.    CCDirector* pDirector = CCDirector::sharedDirector();//调用CCDirector的静态函数sharedDirector();
  3.    pDirector->setDisplayStats(true);//游戏运行的帧间隔
  4.    pDirector->setAnimationInterval(1.0 / 60);//设置帧率
  5.    CCScene *pScene = HelloWorld::scene();//调用helloworld里的静态成员函数scene()
  6.    pDirector->runWithScene(pScene);//导演第一次运行场景调用runWithScene
  7.    return true;
  8. }
看到这段代码,我们再次看一下helloworld里定义了什么,进入HelloWorldScene.h里,有如下重要代码

点击(此处)折叠或打开

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

  6.     // there's no 'id' in cpp, so we recommend returning the class instance pointer
  7.     static cocos2d::CCScene* scene();
  8.     
  9.     // implement the "static node()" method manually
  10.     CREATE_FUNC(HelloWorld);
  11. };
HelloWorld继承了CCLayer,如果在HelloWorld里面什么都没有写的话,HelloWorld会全权的继承了CCLayer,所以HelloWorld的本质是一个层(scene)。

init()对helloWorld进行初始化工作,代替了构造器的作用,是一个工厂方法。代码如下:

点击(此处)折叠或打开

  1. bool HelloWorld::init()
  2.     {
  3.         //////////////////////////////
  4.         // 1. super init first
  5.         if ( !CCLayer::init() )//对CCLayer进行初始化
  6.         {
  7.             return false;
  8.         }
  9.         
  10.         CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();//获取主屏大小
  11.       
  12.         CCSprite* pSprite = CCSprite::create("HelloWorld.png");//增加精灵
  13.         pSprite->setPosition(ccp(visibleSize.width/2 +origin.x, visibleSize.height/2 + origin.y));//设置精灵位置
  14.         this->addChild(pSprite, 0);//把精灵加载到helloworld的层上
  15.         return true;
  16. }

scene()函数的作用是把层加载到场景里。

点击(此处)折叠或打开

  1. CCScene* HelloWorld::scene()
  2. {
  3.     // 'scene' is an autorelease object
  4.     CCScene *scene = CCScene::create();//创建场景
  5.     
  6.     // 'layer' is an autorelease object
  7.     HelloWorld *layer = HelloWorld::create();//创建层

  8.     // add layer as a child to scene
  9.     scene->addChild(layer);//把层加载到场景里

  10.     // return the scene
  11.     return scene;
  12. }
在创建层的时候调用了HelloWorld里面的静态成员函数create(),我们去看一下create()是如何创建的。
通过对代码的追踪create()在CREATE_FUNC()宏里。CREATE_FUNC()的定义如下:

点击(此处)折叠或打开

  1. #define CREATE_FUNC(__TYPE__) \
  2. static __TYPE__* create() \
  3. { \
  4.     __TYPE__ *pRet = new __TYPE__(); \
  5.     if (pRet && pRet->init()) \
  6.     { \
  7.         pRet->autorelease(); \
  8.         return pRet; \
  9.     } \
  10.     else \
  11.     { \
  12.         delete pRet; \
  13.         pRet = NULL; \
  14.         return NULL; \
  15.     } \
  16. }
在宏里面调用了init()函数
作用是:
对helloWorld进行初始化(见init()函数的实现)。
完成对层的调用之后,我们回到工程入口函数里面。
CCScene *pScene = HelloWorld::scene();
上段代码调用了helloWorld里面的scene赋给了pScene。
pDirector->runWithScene(pScene);
然后pDirector调用runWithScene去加载层,这样就实现了helloWorld的操作。

我们手动实现以下helloworld的功能:
首先我们创建一个MyLayer(层)类
MyLayer.h

点击(此处)折叠或打开

  1. #include "cocos2d.h"
  2. USING_NS_CC;

  3. class MyLayer:public CCLayer
  4. {
  5. public:
  6.     static MyLayer *create();//定义一个静态函数
  7.     bool init();//定义一个init()初始化作用
  8. };
MyLayer.cpp

点击(此处)折叠或打开

  1. #include "MyLayer.h"


  2. //对create进行实现,其实就是CREATE_FUN()宏里面的内容
  3. MyLayer *MyLayer::create()
  4. {
  5.     MyLayer *pRet = new MyLayer();
  6.     if (pRet && pRet->init())
  7.     {
  8.         pRet->autorelease();//内存管理
  9.     }
  10.     else
  11.     {
  12.         delete pRet;
  13.         pRet = NULL;
  14.     }
  15.     return pRet;

  16. }
  17. bool MyLayer::init()//对MyLayer进行初始化的作用
  18. {
  19.     CCLayer::init();
  20.     CCSize dSize = CCDirector::sharedDirector()->getWinSize();

  21.     CCSprite *pSprite = CCSprite::create("helloworld.png");
  22.     pSprite->setPosition(ccp(dSize.width / 2, dSize.height / 2));
  23.     
  24.     this->addChild(pSprite);

  25.     return true;
  26. }
然后再创建一个MyScene类,其作用就是加载MyLayer
MyScene.h

点击(此处)折叠或打开

  1. #include "cocos2d.h"
  2. USING_NS_CC;


  3. class MyScene:public CCScene
  4. {
  5. public:
  6.     //CREATE_FUNC(MyScene);
  7.     static MyScene *create();
  8.     bool init();
  9. };
MyScene.cpp

点击(此处)折叠或打开

  1. #include "MyScene.h"
  2. #include "MyLayer.h"

  3. myscene *myscene::create()
  4. {
  5.     myscene *pret = new myscene();
  6.     if (pret && pret->init())
  7.     {
  8.         pret->autorelease();
  9.     }
  10.     else
  11.     {
  12.         delete pret;
  13.         pret = null;
  14.     }
  15.     return pret;
  16. }
  17. bool MyScene::init()
  18. {
  19.     CCScene::init();
  20.     MyLayer *layer = MyLayer::create();
  21.     this->addChild(layer);

  22.     return true;

  23. }
然后在工程入口函数里面去调用
CCScene *pScene = MyScene::create();
也就实现了HelloWorld。
截图如下:


代码流程图如下:


阅读(1288) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~