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


本文按时间倒序

前言

找死!《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");




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值