CocosX学习实录02——第5章 CCLayer子类的一般写法,obj-C改C++,

来源:互联网 发布:淘宝下架立刻就上架吗 编辑:程序博客网 时间:2024/06/06 05:02


本文按时间倒序

前言

找死!《ios5 cocos2d游戏开发实战(第2版)》是objC写的,

项目用C++,肿么办?

老师说,改!那就改呗!


第5章 主要讲CCLayer的使用。

头文件部分

创建后的代码只有一点,大部分要自己写!

鲁迅说,为了忘却的纪念。

我们来纪念一下。


生成代码如下:

#ifndef __MyScenes04__GameLayer__#define __MyScenes04__GameLayer__#include <iostream>#endif /* defined(__MyScenes04__GameLayer__) */

通常插入

#ifndef __MyScenes04__GameLayer__#define __MyScenes04__GameLayer__#include <iostream>#include "cocos2d.h"USING_NS_CC;class GameLayer  :public CCLaye{public:    GameLayer();//构造函数    ~GameLayer();//销毁方法,相当于dealloc    CREATE_FUNC(GameLayer);//这样层子类就默认有create方法了    virtual bool init();//实例方法,init,和objC不同,返回布尔值,    static CCScene *scene();//静态方法,对应的场景,场景是层的父容器        CCPoint gameLayerPosition;    CCPoint lastTouchLocation;};#endif /* defined(__MyScenes04__GameLayer__) */

多些废话,多些沟通

1)为什么要有scene静态方法呢?因为一个层正好对应一个场景嘛,场景加层,是层的父。添加场景,不是添加层,是添加层的父。有点像objC里面的控制器和View吧。为什么不继承自Scence呢?不知道。

2)注意,一旦  virtual bool init();  必须按照上面结构返回bool,如果弄反了会报错。


接下来,一个个看实现。

cpp文件部分

方法惯例

1) C++的所有方法实现部分,都要加命名空间::fun

2)使用命名空间,using namespace cocos2d; 不然要敲全称,谁傻啊。

实例方法init

1) init的返回值不同:

objC是类实例自身(层

-(id) init.....return self;bool FirstScene::init().....return true或者false

返回布尔值,最简是

bool BuildingController::init(){    if (!CCLayer::init())    {        return false;    }    return true;}

2) 生成方法不同:

objC是self初始化,C++写成父类的同名方法,实例的父类是层,所以写成CCLayer->init(),不是CCScene->create()方法。

    if ((self = [super init]))    if (CCLayer::init()) {
CCLayer的原文件是,C++的布尔含义,理解成是否创建了,当没有时,创建,返回true, 没有创建时,返回false。

bool CCLayer::init(){    bool bRet = false;    do     {               .......        // success        bRet = true;    } while(0);    return bRet;}
3) 设置点击:C++是方法,用前缀set,不用前缀is——is表示属性布尔。

self.isTouchEnabled = YES;this->setTouchEnabled(true);

代码惯例

1)CG开头的类,一律改成CC开头。比如CGSize==》CCSize  

2)静态方法 [XX XX]  改成 XX::XX

3)实例方法  [xx XX]  改成  xx->XX();

4)[XX node]  改成  XX::create();

5)@""  改成   ""

6)CGPointMake(...)    改成  ccp(...);

7)self    改成  this

8)[CCSprite spriteWithFile   改成   CCSprite::create

9)CCMoveBy actionWithDuration     改成      CCMoveBy::create  

10)CCSequence actions    改成      CCSequence::create

11)[CCTouchDispatcher sharedDispatcher]      改成    CCDirector::sharedDirector()->getTouchDispatcher()

12)CCRectContainsPoint(node->boundingBox(), touchLocation);    改成    node->boundingBox().containsPoint(touchLocation);

13)[self schedule:@selector(countBullets:) interval:3];   改成    


典型错误

1)子类没有写触摸事件

2)没有写命名空间

正确是







创建地图

tileMap = CCTMXTiledMap::create("bigMap.tmx");




原创粉丝点击