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); } }
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>