【cocos2d-x IOS游戏开发-城市跑酷6】添加街区元素:墙、屋顶、烟囱

来源:互联网 发布:软件开发项目解决方案 编辑:程序博客网 时间:2024/05/06 07:52

尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/17201321


<捕鱼达人>回顾

【cocos2d-x IOS游戏开发-捕鱼达人1】内容介绍

上节回顾

【cocos2d-x IOS游戏开发-城市跑酷5】导演说:动起来,动起来!


快速移动的城里似乎少了点什么,对,是房子。

房子的组成呢:墙、屋顶、烟囱。

enum {kWallTile,//墙kRoofTile,//屋顶kChimney //烟囱};

在定义类型的时候,经常需要定义一些getter setter,有cocos2d从objc带来的CC_PROPERTY 和 CC_SYNTHESIZE。 

CC_SYNTHESIZE(int, _type, Type);//声明一个成员变量_puffing以及getfunName函数,没有set函数。getfunName函数的实现要自己做CC_SYNTHESIZE_READONLY(bool, _puffing, Puffing);//声明成员变量数组:烟囱CC_SYNTHESIZE(CCArray *, _chimneys, Chimneys);


但是需要注意的是

1.CC_PROPERTY更适用于快速声明一个值属性,而CC_SYNTHESIZE更适用于声明一个对象。因为CC_SYNTHESIZE提供的默认set没有任何合法性检查对于值属性来说太不实用。

2.这些方法的声明全部都是virtual的,即便是内联,声明为virtual的方法也不会产生内联函数,所以不管是CC_PROPERTY还是CC_SYNTHESIZE,他们的效率都是不高的。

3.CC_PROPERTY的get方法都没有对函数体声明const修饰符,这意味着对const对象,并不能调用CC_PROPERTY声明的get方法

4.在CC_SYNTHESIZE方法之后直接声明函数或者变量都会变成public:……注意,嗯。


注意对应的释放资源:

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);}

创建街区:

Block * Block::create () {Block * block = new Block();if (block && block->initWithSpriteFrameName("blank.png")) {block->autorelease();        block->initBlock();return block;}
//安全释放CC_SAFE_DELETE(block);return NULL;}


初始化街区的信息,添加资源

//初始化街区配置信息void Block::initBlock(){_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);}    }           _chimneys = CCArray::createWithCapacity(5);    _chimneys->retain();        CCSprite * chimney;    CCSprite * puff;        for (i = 0; i < 5; i++) {        chimney = CCSprite::createWithSpriteFrameName("chimney.png");        chimney->setVisible(false);        this->addChild(chimney, kForeground, kChimney);        _chimneys->addObject(chimney);                for (int j = 0; j < TOTAL_PUFFS; j++) {            puff = CCSprite::createWithSpriteFrameName("puff_1.png");            puff->setAnchorPoint(ccp(0,-0.5));            puff->setVisible(false);            chimney->addChild(puff, -1, j);        }    }
}

设置街区

//设置一块一块街区:入参:宽、高、类型void Block::setupBlock (int width, int height, int type) {this->setPuffing(false);_type = type;_width = width * _tileWidth;_height = height * _tileHeight + _tileHeight * 0.49f;this->setPositionY(_height);//这是墙CCSpriteFrame * wallFrame;//随机生成屋顶1或者屋顶2CCSpriteFrame * roofFrame = rand() % 10 > 6 ? _roof1 : _roof2;int num_chimneys;float chimneyX[] = {0,0,0,0,0};switch (type) {//这是一个坑(看不见)case kBlockGap:this->setVisible(false);return;//街区1case kBlock1:wallFrame = _tile1;chimneyX[0] = 0.2f;chimneyX[1] = 0.8f;num_chimneys = 2;break;case kBlock2:wallFrame = _tile2;chimneyX[0] = 0.2f;chimneyX[1] = 0.8f;chimneyX[2] = 0.5f;num_chimneys = 3;break;case kBlock3:wallFrame = _tile3;chimneyX[0] = 0.2f;chimneyX[1] = 0.8f;chimneyX[2] = 0.5f;num_chimneys = 3;break;case kBlock4:wallFrame = _tile4;chimneyX[0] = 0.2f;chimneyX[1] = 0.5f;num_chimneys = 2;break;}int i;GameSprite * chimney;int count;count = _chimneys->count();for (i = 0; i < count; i++) {chimney = (GameSprite *) _chimneys->objectAtIndex(i);if (i < num_chimneys) {chimney->setPosition( ccp (chimneyX[i] * _width, 0) );chimney->setVisible(true);} else {chimney->setVisible(false);}}this->setVisible(true);CCSprite * tile;count = _roofTiles->count();for (i  = 0; i < count; i++) {tile = (CCSprite *) _roofTiles->objectAtIndex(i);if (tile->getPositionX() < _width) {tile->setVisible(true);//显示相应的屋顶tile->setDisplayFrame(roofFrame);} else {tile->setVisible(false);}}count = _wallTiles->count();for (i  = 0; i < count; i++) {tile = (CCSprite *) _wallTiles->objectAtIndex(i);if (tile->getPositionX() < _width && tile->getPositionY() > -_height) {tile->setVisible(true);tile->setDisplayFrame(wallFrame);} else {tile->setVisible(false);}}}

下一节:设计烟囱