Cocos2dx游戏开发系列笔记18:《跑酷》游戏源码解析(3)
来源:未知 责任编辑:责任编辑 发表时间:2014-01-20 07:52 点击:次
关于这种用法,骨头不是很熟悉,
首先看看 CC_SYNTHESIZE(int, _type, Type); 的源码
#define CC_SYNTHESIZE(varType, varName, funName)
protected: varType varName;
public: virtual varType get##funName(void) const { return varName; }
public: virtual void set##funName(varType var){ varName = var; }
应该是自动生成 set get 方法的一个宏方法。
第二个CC_SYNTHESIZE_READONLY(bool, _puffing, Puffing); 方法
应该也是自动生成 get 方法的宏方法。
这样肯定是会减少代码量,但对于骨头这种新手来说,比较乱容易弄混。使用时必须小心。
然后 h文件里还剩下几个 inline 内联方法。
inline virtual int left() {
return this->getPositionX();
}
inline virtual int right() {
return this->getPositionX() + _width;
}
再来看下 Block.cpp 文件:
Block::~Block () {
//安全释放
CC_SAFE_RELEASE(_chimneys);
CC_SAFE_RELEASE(_wallTiles);
CC_SAFE_RELEASE(_roofTiles);
CC_SAFE_RELEASE(_puffAnimation);
CC_SAFE_RELEASE(_puffSpawn);
CC_SAFE_RELEASE(_puffMove);
CC_SAFE_RELEASE(_puffFade);
CC_SAFE_RELEASE(_puffScale);
}
在贴砖类的析构方法里,使用了这种表达式的宏定义,去看下源码:
#define CC_SAFE_DELETE(p) do { if(p) { delete (p); (p) = 0; } } while(0)
#define CC_SAFE_DELETE_ARRAY(p) do { if(p) { delete[] (p); (p) = 0; } } while(0)
#define CC_SAFE_FREE(p) do { if(p) { free(p); (p) = 0; } } while(0)
#define CC_SAFE_RELEASE(p) do { if(p) { (p)->release(); } } while(0)
#define CC_SAFE_RELEASE_NULL(p) do { if(p) { (p)->release(); (p) = 0; } } while(0)
#define CC_SAFE_RETAIN(p) do { if(p) { (p)->retain(); } } while(0)
#define CC_BREAK_IF(cond) if(cond) break
关于 表达式的宏定义里使用 do{...}while(0),好像还有讲头:等骨头学习一阵在研究。
同样的,构造方法里是初始化一些值,create方法里是实例化 Blocl这个CCSprite对象。
初始化街区配置信息 void Block::initBlock()
先初始化不同类型的贴砖CCsprite:
_tile1 = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName (building_1.png); _tile2 = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName (building_2.png); _tile3 = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName (building_3.png); _tile4 = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName (building_4.png); _roof1 = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName (roof_1.png); _roof2 = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName (roof_2.png);然后放到两个数组里:
int i;
_wallTiles = CCArray::createWithCapacity(20);
_wallTiles->retain();
_roofTiles = CCArray::createWithCapacity(5);
_roofTiles->retain();
CCSprite * tile;
for (i = 0; i < 5; i++) {
tile = CCSprite::createWithSpriteFrameName(roof_1.png);
tile->setAnchorPoint(ccp(0, 1));
tile->setPosition(ccp(i * _tileWidth, 0));
tile->setVisible(false);
this->addChild(tile, kMiddleground, kRoofTile);
_roofTiles->addObject(tile);
for (int j = 0; j < 4; j++) {
tile = CCSprite::createWithSpriteFrameName(building_1.png);
tile->setAnchorPoint(ccp(0, 1));
tile->setPosition(ccp(i * _tileWidth, -1 * (_tileHeight * 0.47f + j * _tileHeight)));
tile->setVisible(false);
this->addChild(tile, kBackground, kWallTile);
_wallTiles->addObject(tile);
}
}
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 进入详细评论页>>

![cocos2d_x+lua[2]](/uploads/allimg/131030/110J64609-0-lp.jpg)








