您的位置:首页 > 移动开发 > Cocos引擎

【cocos2d-x IOS游戏开发-城市跑酷4】设置“道具”:云、路灯、竞技团队

2013-12-07 14:37 645 查看
尊重开发者的劳动成果,转载的时候请务必注明出处: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);


下一节:导演说,大家动起来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐