地球人己阻止不了程序猿们学习cocos2d-x了-学习笔记04

地球人己阻止不了程序猿们学习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就不会自己释放,而是等我们主动释放,我们可以等到析构函数执行时再释放。不然我们在游戏过程中就操作不了数组了。

然后,怎么遍历CCArraycocos2d-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

你可能感兴趣的:(游戏,php,java)