尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/17187599
<捕鱼达人>回顾
【cocos2d-x IOS游戏开发-捕鱼达人1】内容介绍
上节回顾
【cocos2d-x IOS游戏开发-城市跑酷3】读取资源,设置背景层
游戏的元素应该是多种多样的,只有一个背景就略显单调了,这里我们来加入一些道具。
来看下具体的实现:
//加入背景:城市灯火 _background = CCSprite::createWithSpriteFrameName("background.png"); _background->setAnchorPoint(ccp(0,0)); _gameBatchNode->addChild(_background, kBackground);添加路灯:
//设置路灯 _foreground = CCSprite::createWithSpriteFrameName("lamp.png"); _foreground->setAnchorPoint(ccp(0,0)); _gameBatchNode->addChild(_foreground, kForeground);添加云朵:用数组CCArray 存云朵,并设置云朵的位置。
CCArray 是cocos2dx中充分支持的类。它被用来优化游戏。你可以在cocos2d/Support中找到这个类。
它和苹果的NSMutableArr类相似,但是CCArray的表现力更好一些。
注意:CCArray和CCDictionary类被用来保存cocox2dx的类,然而他们并没有和STL一样强大。因此,没有必要使用CCArray或者CCDictionary来替代你的项目中的一些STL。
CCArray仅仅提供对象包装类的功能
CCArray继承自CCObject类(CCObject的主要目的是自动的回收内存),并且提供一系列接口。
注意点一:
CCArray中有一个remove方法和一个fastRemove方法,看一下源代码可知,remove是一个完全的移除操作,而faseRemove仅仅将当前元素release了,主要的区别点在于向前移动了这个元素之后的元素之后,没有显式的删除元素。代码如下:
unsigned int remaining = arr->num - index; if(remaining>0) { memmove((void *)&arr->arr[index], (void *)&arr->arr[index+1], remaining * sizeof(CCObject*)); }
faseRemoveObject是快速的,但是它也意味着在CCArray中的对象将会改变位置,那么如果你使用CCArray的排序信息,你不应该使用faseRemoveObject方法。
注意点二:
CCArray初始它的引用计数为1,并且被设置为了autorelease。因此创建CCArray的时候你需要去retain,并且在析构函数中你需要手动的release内存。否则使用过程中可能CCArray已经释放造成错误。
现在看一下具体的使用方法:
//加入精灵云 CCSprite * cloud; _clouds = CCArray::createWithCapacity(4); _clouds->retain(); float cloud_y; for (int i = 0; i < 4; i++) { //云位置:一低一高一低一高显示 cloud_y = i % 2 == 0 ? _screenSize.height * 0.7f : _screenSize.height * 0.8f; cloud = CCSprite::createWithSpriteFrameName("cloud.png"); cloud->setPosition(ccp (_screenSize.width * 0.15f + i * _screenSize.width * 0.25f, cloud_y)); _gameBatchNode->addChild(cloud, kBackground); _clouds->addObject(cloud);//添加数组元素 }加入一组竞技团队:
//加入一个竞技团队 _jam = CCSprite::createWithSpriteFrameName("jam_1.png"); CCAnimation* animation; animation = CCAnimation::create(); //CCSpriteFrame对应的就是帧,将CCSpriteFrame添加到CCAnimation生成动画数据, //用CCAnimation生成CCAnimate(就是最终的动画动作),最后可以用CCSprite执行这个动作。 CCSpriteFrame * frame; int i; for(i = 1; i <= 3; i++) { //共有3帧,这里用for循环将对应的序列图加入到动画中 char szName[100] = {0}; sprintf(szName, "jam_%i.png", i); frame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(szName); animation->addSpriteFrame(frame); } //设置每两帧间时间间隔 animation->setDelayPerUnit(0.2f / 3.0f); //设置动画结束后是否保留动画帧信息 animation->setRestoreOriginalFrame(false); //设置循环播放次数 (-1:无限循环) animation->setLoops(-1); //由这个动画信息创建一个序列帧动画 _jamAnimate = CCAnimate::create(animation); //保存这个动画 _jamAnimate->retain(); _gameBatchNode->addChild(_jam, kBackground);
下一节:导演说,大家动起来。