笨木头  2012-11-01 10:49     Cocos2d-x,Cocos2d-x2.0     阅读(4899)     评论(3)
转载请注明,原文地址: http://www.benmutou.com/archives/19
文章来源:笨木头与游戏开发

 地球人己阻止不了程序猿们学习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

 

 

 

 

3 条评论
  • qq634416025 2013-02-26 19:47:00

    你好 LZ 我感觉理解不过来 这种写游戏模式我还是第一次见 因为我没有写过游戏 我大三学生 我想学习一下cocos2d-x游戏编程 我该怎么学呢
    0回复
  • musicvs 2013-02-26 21:05:00

    [reply]qq634416025[/reply]
    我觉得,如果你能深刻体会到“一切都是对象”这种感觉的话,可能会有一个里程碑式的突破。
    比如这篇文章说到的,子弹是一个对象,我们可以直接在代码里生成子弹对象,简单对其进行控制。但其实生成子弹这件事又可以涉及到一个对象——子弹管理器。
    当一切都划分为一个个对象时(也许某些对象仅仅包含十几行代码),一切都变得简单起来。

    糟糕,貌似我越解释越乱了,嘿嘿。
    其实你不用着急,我觉得你现在把所有功能都写在一个类里,甚至一个函数里,都没有关系,只要能实现你需要的功能就可以了。
    等你认为一个函数太糟糕的时候,你就会领悟到为什么会有函数这种东西。当你认为只有一个类实在是太糟糕,太难修改的时候,你也会领悟到,为什么会有类这种东西。
    先实现再优化,这非常管用,哈哈~
    0回复
  • qq634416025 2013-02-28 22:36:00

    嗯嗯 谢谢
    0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发