地球人己阻止不了程序猿们学习cocos2d-x了-学习笔记04
笨木头花心贡献,啥?花心?不呢,是用心~
转载请注明,原文地址:http://blog.csdn.net/musicvs/article/details/8135705
正文:
教程地址:http://cn.cocos2d-x.org/bbs/forum.php?mod=viewthread&tid=979&extra=page%3D1
这篇教程太可恶了,一下子塞了好多知识啊喂,我都还没有吸收完,说说我吸收的部分吧。
1.每一帧都想做操作?
有时候,我们需要在每一帧的时候都做一些操作,比如判断碰撞什么的,那么,CCNode就拥有这个功能。
只要是继承了CCNode的类都拥有update方法,update方法会在游戏的每一帧都调用一次,前提是,我们的类加入到了场景中,并且调用了这个方法:scheduleUpdate()。
这样,update方法就会每一帧都被调用,在里面尽情做操作吧。
#ifndef __SIMPLE_MOVE_CONTROLLER_H__
#define __SIMPLE_MOVE_CONTROLLER_H__
#include "Controller.h"
/************************************************************************/
/* 简单移动控制器
/* 只会往左移动
/************************************************************************/
class SimpleMoveController : public Controller {
public:
virtual void update(float dt);
virtual bool init();
static SimpleMoveController* create();
void setiXSpeed(int iXSpeed);
private:
int iXSpeed; /* X方向移动速度*/
};
#endif
bool SimpleMoveController::init()
{
bool bRet = false;
do
{
this->scheduleUpdate();
bRet = true;
} while (0);
return bRet;
}
void SimpleMoveController::update( float dt )
{
if(this->listener) {
this->listener->updatePosition(dt, iXSpeed, 0.0f);
this->listener->hideIfDead();
}
}
2.播放音乐
这个游戏不可缺少的呢,cocos2d-x已经封装好了,我们要调用很简单:
/*
1.播放音乐有两种,一种是长时间播放的背景音乐,一种是瞬间播放的效果音乐
2.播放音乐之前需要预先加载音乐,调用preload*方法即可
3.播放背景音乐调用playBackgroundMusic,停止的话调用stopBackgroundMusic
4.播放效果音乐调用playEffect,不需要主动停止
*/
CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSI_BACKGROUND);
CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect(MUSI_LASER);
CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic(MUSI_BACKGROUND);
CocosDenshion::SimpleAudioEngine::sharedEngine()->stopBackgroundMusic(true);
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect(MUSI_LASER);
3.数组还是list?
Java里的ArrayList用得好舒服,不过在cocos2d-x 2.x版本里好像已经没有类似这样的功能了。换成了CCArray,这个也是列表的功能,但是已经没有了类型限制了,什么类型都能放进去,自己小心点就是了。
用法很简单:
/* 创建怪物*/
CCArray *mMonsterArray = CCArray::createWithCapacity(MAX_NUM);
mMonsterArray->retain();
Monster* mMonster = NULL;
for(int i = 0; i < MAX_NUM; i++) {
mMonster = Monster::createWithBatchNode(batchNode);
mMonsterArray->addObject(mMonster);
}
createWithCapacity的方式创建CCArray,就是指定了这个列表有多大。
至于retain,大概的意思是,CCArray会在使用后立即被释放,而不是等我们主动释放,也就是说,我们的函数结束了,CCArray对象也结束了。调用了retain之后,CCArray就不会自己释放,而是等我们主动释放,我们可以等到析构函数执行时再释放。不然我们在游戏过程中就操作不了数组了。
然后,怎么遍历CCArray?cocos2d-x也已经写好了:
CCObject* obj = NULL;
CCARRAY_FOREACH(mMonsterArray, obj) {
Monster* mMonster = (Monster*) obj;
}
不多说了,我也只会用而已,这个CCARRAY_FOREACH是一个宏,大概的操作就是从数组的第一个指针到最后一个指针的for循环。
4.再论update方法
Update方法几乎不可或缺了,这里有一点想提醒一下,我在写这个游戏Demo的过程中,总是发现对象的update方法没有被调用,原因是,我的这个对象没有加入到场景中。
所以,自己建的类对象,千万不要忘记加入到场景中。
在代码中多次出现只有CCSpriteBatchNode对象,没有CCLayer对象的情况下,怎么把我的对象添加到layer场景呢?很简单,CCSpriteBatchNode对象有一个getParent方法,用这个方法就可以获得CCLayer对象了,然后addChild,搞定。
5.关于释放资源
释放资源当然也很重要,在这篇教程中,我了解到:
1. 使用CC_SAFE_RELEASE释放CCArray对象
2. 使用CC_SAFE_DELETE释放普通指针对象
3. 普通对象调用autoRelease方法会自动回收对象
我仅限于了解,也许要在以后开发过程中碰到这些问题才能深刻理解吧。
大概就这么多了,还有很多游戏开发的思想在这个小游戏中也体现出来了,对于我这种开发游戏不多的人,很受益。
6.说说这个小游戏的大概思想流程
我自己按照教程写了一个,比教程的要简陋一些,下载地址:http://download.csdn.net/detail/musicvs/4709955