2013-10-10 22:57:41 lizizhe1880 阅读数 2877
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18416 人正在学习 去看看 李宁

这里本人电脑配置是win7 64位,cocos2d-x2.20,VS2012

1:首先当然是下载cocos2d-x啦。我采用的是2.20版本【说明:2.14以后的版本和之前的VS模板生成和环境配置不一样】往下拉有环境配置教程

 点这里下载Cocos2d-X:http://www.cocos2d-x.org/download


解压然后你会得到如下图



然后运行:build-win32.bat编译

编译完后

你会生成一个Debug.win32和Release.win32


接下来运行cocos2d-win32.VS2012.sln



-----------------------------------华丽分割线---------------------------------------


AccelerometerTest       // 按键加速项目

CocosDragonJS           //  一个吃金币的游戏- -!90%使用cocosbuilder完成,10%使用javascript完成

CrystalCraze                  // 消除游戏

HelloCpp                        // cocos2dx程序的基本框架实例,开发语言用C++

HelloLua                        // cocos2dx程序的基本框架实例,开发语言用Lua


libBox2d                          //  物理引擎,知道是C++写的

ibchipmunk                    //  物理引擎,资料比较少

ibcocos2d                      // 就是我们主角了,cocos2dx游戏引擎

libcocosdenshion        // 是自带的一个轻量级音频库

libExtension                   // 是自带的一些扩展,里面有一个简单的GUI系统

libJSBinding                  // 是绑定JS

libLua                             // 是绑定Lua脚本的库

MoonWarriors              // 是一个飞行设计游戏的例子,用JS实现的 

TestCpp,TestJavascript和TestLua是对cocos2dx游戏引擎一些基本功能的演示demo,从名字也可以看出他们使用了不同的语言

WatermelonwithMe   // 示例游戏,10%使用CocosBuilder完成,90%使用javascript完成


-----------------------------------华丽分割线结束---------------------------------------


环境配置请看:http://blog.csdn.net/leoncoder/article/details/12523727




刚接触Cocos2d-x,如有错误请大家纠正,共同学习进步 

 编程QQ群:160296200

 本篇博客出Leon,转载请注明出处:http://blog.csdn.net/leoncoder/article/details/12587427
2015-04-03 15:53:36 zhancaihua 阅读数 1464
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18416 人正在学习 去看看 李宁

写这篇文章,没有花我多少时间。但是由于我的笔记写在云笔记中,图片也多。csdn也不支持直接复制粘贴图片,可以说把笔记移植过来比我当初写还要费事,希望改进吧



从入口开始分析,我们来看看addaction函数,他接受一个动作,并绑定自己,是否暂停取决于节点的running属性。

 

我们来具体看看ActionManager这个类

class CC_DLLActionManager : public Ref

{

public:

       ActionManager(void);

        ~ActionManager(void);

 

      void addAction(Action *action, Node*target, bool paused);

 

        void removeAllActions();

 

       void removeAllActionsFromTarget(Node*target);

 

      void removeAction(Action *action);

 

   

    void removeActionByTag(int tag, Node*target);

   

    

    void removeAllActionsByTag(int tag, Node*target);

 

     Action* getActionByTag(int tag, const Node*target) const;

     ssize_tgetNumberOfRunningActionsInTarget(const Node *target) const;

 

 

      void pauseTarget(Node *target);

 

       void resumeTarget(Node *target);

       Vector<Node*>pauseAllRunningActions();

   

        void resumeTargets(constVector<Node*>& targetsToResume);

 

    void update(float dt);

   

protected:

 

 

    void removeActionAtIndex(ssize_t index,struct _hashElement *element);

    void deleteHashElement(struct _hashElement*element);

    void actionAllocWithHashElement(struct_hashElement *element);

 

protected:

    struct _hashElement    *_targets;

    struct_hashElement    *_currentTarget;

    bool            _currentTargetSalvaged;

};

 

struct _hashElement   *_targets;

    struct_hashElement    *_currentTarget;

如果是对定时器数据结构很熟悉的人没看到这个结构体应该不会陌生。的确,内部结构是相同的,只不过把之前的定时器对象改为现在的action.


类似的,每个hash节点一般由一个target标志,根据target找到节点。每个节点弱引用一个动作的array,也就是说,每个节点可以绑定多个动作,paused记录了当前动作的暂停状态。

 

 

下面来看看addAction函数:

voidActionManager::addAction(Action *action, Node *target, bool paused)

{

    CCASSERT(action != nullptr, "");

    CCASSERT(target != nullptr, "");

 

//查找hash表,看看是否有相同的target,如果没有新建一个插入表中。

    tHashElement *element = nullptr;

    // we should convert it to Ref*, because wesave it as Ref*

    Ref *tmp = target;

    HASH_FIND_PTR(_targets, &tmp, element);

    if (! element)

    {

        element =(tHashElement*)calloc(sizeof(*element), 1);

        element->paused = paused;

        target->retain();

        element->target = target;

        HASH_ADD_PTR(_targets, target,element);

    }

//为弱引用的数组分配内存

     actionAllocWithHashElement(element);

 

//同一个动作结束前,如果被同一个节点包含两次,触发断言

     CCASSERT(!ccArrayContainsObject(element->actions, action), "");

//将新的动作加入数组

     ccArrayAppendObject(element->actions,action);

 

 

     action->startWithTarget(target);

}

现在我们不介绍最后一句,因为我们需要回过头去看看Action及其子类

Action

class CC_DLL Action: public Ref, public Clonable

{

public:

   //动作的默认tag,一般不可以用默认tag索引动作

    static const int INVALID_TAG = -1;

    /**

     * @js NA

     * @lua NA

     */

    virtual std::string description() const;

 

    /** returns a clone of action */

    virtual Action* clone() const

    {

        CC_ASSERT(0);

        return nullptr;

    }

 

    /** returns a new action that performs theexactly the reverse action */

    virtual Action* reverse() const

    {

        CC_ASSERT(0);

        return nullptr;

    }

 

    //! return true if the action has finished

//判断动作是否结束

    virtual bool isDone() const;

 

    //! called before the action start. It willalso set the target.

//_taggetoriginTarget都赋值为新的绑定对象

    virtual void startWithTarget(Node *target);

 

    /**

    called after the action has finished. Itwill set the 'target' to nil.

    IMPORTANT: You should never call"[action stop]" manually. Instead, use:"target->stopAction(action);"

    */

//动作结束后,调用该函数,把_target设置为null

    virtual void stop();

 

    //! called every frame with it's deltatime. DON'T override unless you know what you are doing.

//类似定时器中的update函数

    virtual void step(float dt);

 

    /**

    called once per frame. time a value between0 and 1

 

    For example:

    - 0 means that the action just started

    - 0.5 means that the action is in themiddle

    - 1 means that the action is over

    */

//类似定时器中的trigger函数

 

    virtual void update(float time);

   

    inline Node* getTarget() const { return_target; }

    /** The action will modify the targetproperties. */

    inline void setTarget(Node *target) {_target = target; }

   

    inline Node* getOriginalTarget() const {return _originalTarget; }

    /** Set the original target, since targetcan be nil.

    Is the target that were used to run theaction. Unless you are doing something complex, like ActionManager, you shouldNOT call this method.

    The target is 'assigned', it is not'retained'.

    @since v0.8.2

    */

    inline void setOriginalTarget(Node*originalTarget) { _originalTarget = originalTarget; }

 

    inline int getTag() const { return _tag; }

    inline void setTag(int tag) { _tag = tag; }

 

CC_CONSTRUCTOR_ACCESS:

    Action();

    virtual ~Action();

 

protected:

    Node   *_originalTarget;

    /** The "target".

    The target will be set with the'startWithTarget' method.

    When the 'stop' method is called, targetwill be set to nil.

    The target is 'assigned', it is not'retained'.

    */

    Node    *_target;

    /** The action tag. An identifier of theaction */

    int    _tag;

 

private:

    CC_DISALLOW_COPY_AND_ASSIGN(Action);

};

 

isDownupdatestep这三个函数是虚函数,action并没有做什么实际的事情,所以我们现在还不知道他干了些什么,我们之后去看看具体的动作类就会清楚了。

_originalTarget_target这两者有什么区分现在也不清楚

 

我们来看看最重要的一个子类FiniteTimeAction

class CC_DLLFiniteTimeAction : public Action

{

public:

    //! get duration in seconds of the action

    inline float getDuration() const { return_duration; }

    //! set duration in seconds of the action

    inline void setDuration(float duration) {_duration = duration; }

 

    //

    // Overrides

    //

    virtual FiniteTimeAction* reverse() constoverride

    {

        CC_ASSERT(0);

        return nullptr;

    }

    virtual FiniteTimeAction* clone() constoverride

    {

        CC_ASSERT(0);

        return nullptr;

    }

 

CC_CONSTRUCTOR_ACCESS:

    FiniteTimeAction()

    : _duration(0)

    {}

    virtual ~FiniteTimeAction(){}

 

protected:

    //! duration in seconds

    float _duration;

 

private:

   CC_DISALLOW_COPY_AND_ASSIGN(FiniteTimeAction);

};

只是增加了一个_duration属性,也就是动作的持续时间,应该是为了他的延时动作子类准备的。

 

 

我么接着看ActionInstant这个瞬时动作:

class CC_DLLActionInstant : public FiniteTimeAction //<NSCopying>

{

public:

    //

    // Overrides

    //

    virtual ActionInstant* clone() constoverride

    {

        CC_ASSERT(0);

        return nullptr;

    }

   

    virtual ActionInstant * reverse() constoverride

    {

        CC_ASSERT(0);

        return nullptr;

    }

 

    virtual bool isDone() const override;

    virtual void step(float dt) override;

    virtual void update(float time) override;

};

瞬时动作类重写了step函数和isDown函数,其他的isDoneupdate函数并没有做出变化

step:


调用了update函数,并传入参数1。我们可以看看update函数的注释

 

called once perframe. time a value between 0 and 1

 

    For example:

     0 means that the action just started

    0.5 means that the action is in the middle

     1 means that the action is over

    */

1表示动作结束了

 

isDown:


isDown也返回true。我们或许会疑惑,不过接下来看了ActionManager中的update函数之后你就会明白了:

该函数在导演类的init函数中被注册到定时器:


该函数有最高的定时触发优先级,每一帧动作的运行都会触发该函数。

voidActionManager::update(float dt)

{

    for (tHashElement *elt = _targets; elt !=nullptr; )

    {

        _currentTarget = elt;

        _currentTargetSalvaged = false;

 

        if (! _currentTarget->paused)

        {

            // The 'actions' MutableArray maychange while inside this loop.

            for (_currentTarget->actionIndex= 0; _currentTarget->actionIndex < _currentTarget->actions->num;

               _currentTarget->actionIndex++)

            {

               _currentTarget->currentAction =(Action*)_currentTarget->actions->arr[_currentTarget->actionIndex];

                if(_currentTarget->currentAction == nullptr)

                {

                    continue;

                }

 

               _currentTarget->currentActionSalvaged = false;

 

                _currentTarget->currentAction->step(dt);

 

                if(_currentTarget->currentActionSalvaged)

                {

                    // The currentAction toldthe node to remove it. To prevent the action from

                    // accidentallydeallocating itself before finishing its step, we retained

                    // it. Now that step isdone, it's safe to release it.

                   _currentTarget->currentAction->release();

                } else

                if (_currentTarget->currentAction->isDone())

                {

                    _currentTarget->currentAction->stop();

 

                    Action *action =_currentTarget->currentAction;

                    // Make currentAction nilto prevent removeAction from salvaging it.

                   _currentTarget->currentAction = nullptr;

                    removeAction(action);

                }

 

               _currentTarget->currentAction = nullptr;

            }

        }

 

        // elt, at this moment, is still valid

        // so it is safe to ask this here(issue #490)

        elt = (tHashElement*)(elt->hh.next);

 

        // only delete currentTarget if noactions were scheduled during the cycle (issue #481)

        if (_currentTargetSalvaged &&_currentTarget->actions->num == 0)

        {

            deleteHashElement(_currentTarget);

        }

    }

 

    // issue #635

    _currentTarget = nullptr;

}

我们可以看到,step就相当于一个触发函数,而动作中的update函数就是触发函数中调用的函数,出发完成后,判断动作是否结束,如果结束调用stop函数,并移除动作。

我们现在可以回到之前的瞬时动作,update函数被传值为1isDown返回true,就很好理解了。

瞬时动作的基类没有实现update函数,我们以一个具体的瞬时动作来做例子:

class CC_DLL Show : public ActionInstant

{

public:

    /** Allocates and initializes the action */

    static Show * create();

 

 

    //

    // Overrides

    //

    virtual void update(float time) override;

    virtual ActionInstant* reverse() constoverride;

    virtual Show* clone() const override;

 

CC_CONSTRUCTOR_ACCESS:

    Show(){}

    virtual ~Show(){}

 

private:

    CC_DISALLOW_COPY_AND_ASSIGN(Show);

};

 

重写了update函数:


接着看

void ActionManager::update(float dt)中的那个removeAction函数:

好了一目了然,之前的_originTarget_targrt的区别也就知道了,_target是为了实现节点动作用的,二_target置为空之后,_originTarget便可以用来删除这个动作,动作删除后被release

 

 

好了,我们可以接着看延时动作了:

class CC_DLLActionInterval : public FiniteTimeAction

{

public:

    /** how many seconds had elapsed since theactions started to run. */

    inline float getElapsed(void) { return_elapsed; }

 

    //extension in GridAction

    void setAmplitudeRate(float amp);

    float getAmplitudeRate(void);

 

    //

    // Overrides

    //

    virtual bool isDone(void) const override;

    virtual voidstep(float dt) override;

    virtual void startWithTarget(Node *target)override;

    virtual ActionInterval* reverse() constoverride

    {

        CC_ASSERT(0);

        return nullptr;

    }

 

    virtual ActionInterval *clone() constoverride

    {

        CC_ASSERT(0);

        return nullptr;

    }

 

CC_CONSTRUCTOR_ACCESS:

    /** initializes the action */

    bool initWithDuration(float d);

 

protected:

    float_elapsed;

    bool  _firstTick;

};

_elapsed表示延时动作度过的时间

isDone:



很简单,只要度过的时间大于等于动作的生命周期就表示动作结束。

step:


很简单的定时逻辑,ActionManager中的update函数每一次出发后调用step函数,dt一般是每一帧的时间(大多数是1 /60)。每一次调用后,把dt加到_elapsed就可以做到计时了。update的参数被限制在0-1之间,具体的实现得看一个具体的例子:


这里的initWithDuration就是我们创建动作时候传递的动作生命周期。

update



很简单吧,每次变化后的属性重新设置给Node就达到了动画的目的。

 

 

我们接下来看看移除动作:

 void removeAction(Action *action)


移除很简单,找到绑定对象,从对象的动作数组中移除即可。

 

 

接下来看看Node中的stopAction函数:


函数原理都是一样的,拿其中一个举例:


间接调用了移除动作的函数。

 

注意事项:不要用action中的stop函数来停止动作,因为判断动作是否结束的标志是isDown函数,并且判断过程还是在动作执行之后。stop函数会将_target置为null,这样运行动作就会试图去修改_target的属性,导致程序奔溃。还有一点就是动作运行结束后会被删除,如果想多次运行动作,请retain

 

 

总结:

动作最重要的几个函数

isDown

step

stop

update

以及ActionManager::update

还有动作的重要属性:

_target

_origintarget

_elapsed


2016-08-23 16:53:18 skylin19840101 阅读数 2439
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18416 人正在学习 去看看 李宁

Cocos2d-x

2.1以前的版本

第一步:下载Cocos2d-X的引擎包

第二步:进入Cocos2d-X文件夹

“cd cocos2d-1.0.1-x-0.9.2”

然后“sudo ./install-templates-xcode.sh”命令开始执行安装命令

执行成功后,会在Xcode中安装好一些Cocos工程模板




然后根据这些模板去创建Cocos2d-x工程即可。



2.2以后的版本

将下载的压缩包解压到你指定的文件夹里。

进入到目录cocos2d-x-3.2alpha0/tools/cocos2d-console/bin/cocos.py

打开终端运行cocos.py脚本创建文件

./cocos.py new HelloWorldDemo -p com.coco2dx.org -l cpp -d ~/Desktop

或者

python cocos.py new HelloWorldDemo -p com.coco2dx.org -l cpp -d ~/Desktop

参数说明:

  • HelloWorldDemo为项目名称
  • -p后面接包名
  • -l后面接开发语言类型,有cpp, lua, js三种类型
  • -d后面接项目存放的目录

项目创建完成后,用Xcode打开HelloWorldDemo/proj.ios_mac里的Xcode项目文件,运行项目即可


Cocos2d-JS

Cocos2d-JS 是跨全平台的游戏引擎,采用原生JavaScript语言,可发布到包括Web平台,iOS,Android,Windows Phone8,Mac,Windows等平台,引擎基于MIT开源协议,完全开源,免费,易学易用,拥有活跃的社区支持。Cocos2d-JS让2D的游戏编程门槛更低,使用更加容易和高效。和其他类似游戏框架相比,它定义了更加清晰的2D游戏编程的基本组件,采用易学易用的API设计,并采用全球领先、具备原生性能的脚本绑定解决方案实现游戏的跨原生平台发布,开发效率更高,使用上最简单。

Cocos2d-JS是Cocos2d-x的JavaScript版本,融合了Cocos2d-HTML5和Cocos2d-x JavaScript Bindings(JSB)。它支持Cocos2d-x的所有核心特性并提供更简单易用的JavaScript风格API,基于Cocos2d-JS的框架,您可以方便的使用JavaScript语言进行游戏开发,快速构建原型进行验证,并让您的游戏跑在所有支持HTML5规范的浏览器上。由于Cocos2d-html5的API和Cocos2d-x JSB的API高度一致,可让您的游戏不用修改代码或者修改少量代码就可打包为原生性能表现的混合游戏,发布到原生应用市场,从而实现,一次编码全平台部署的效果,带给您全所未有的机遇。


不得不吐槽下cocos官网说明文档的坑爹之处:

1. 用Cocos Console工作流开发网页/原生平台游戏(JSB开发环境简介)

http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/cocos2d-js/2-working-environment-and-workflow/2-2-cross-native-browser-game-with-cocos-console/zh.md



点击"引擎下载页面"跳到:



这里好像也没有JS的引擎包吧,没办法,看着"HTML5 LITE VERSION"比较像,硬着头皮点进去


下载下来的结果也跟说明文档里不一致


2."搭建Cocos2d-JS v3.x 开发环境"

http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/cocos2d-js/3-jumping-into-cocos2d-js/3-1-installation/zh.md



点击"Cocos Code IDE"超链接却跳到 "Cocos Creator"的下载,好像他们不是同一个东东吧;

点击"Cocos-JS v3.0"也是一样的结果。



后面是到论坛上上找到了一个下载地址:

http://forum.cocos.com/t/cocos-code-ide-1-2-0/34958


够变态吧,既然让大家使用,居然把下载地址搞得云山雾罩的,这是要绕死大家的节奏啊

后来在cc论坛发现,原来是被放弃了,既然放弃了,官方的文档也得同步更新啊,这误导多少无辜群众: IDE被放弃了?下载都没了


真是蛋疼!抓狂抓狂抓狂

后来终于搞明白了,原来是换成使用Cocos Creater了:

Cocos Creator入门


所以Coco-JS工程的创建方法:

1. 直接命令行创建

这个比较通用,不管官网各种开发工具怎么变来变去

切换到Cocos2d-X的以下目录:   /tools/cocos2d-console/bin

./cocos new Cocos2d-JSDemo -p com.xxxxxx.cocos2djs -l js -d /doc/sample/cocos2d



2. Cocos Creator创建


Cocos2d-LUA

1. 直接命令行创建

切换到Cocos2d-X的以下目录:   /tools/cocos2d-console/bin

按照官网的介绍:

./cocos.py new Cocos2d-LuaDemo -p  会出现权限的问题



添加sudo运行,出现命令找不到的问题



干脆直接换成cocos执行



还是出现命令找不到,在cocos前添加 ./。不要使用sudo,否则会出现一些权限的问题



终于成功了



2. Cocos Creator也支持Lua:  LUA引擎支持

3. 用Cocos Code IDE 创建lua工程

不过Cocos Code IDE工具已经被废了


参考

1、官网: http://www.cocos.com/doc/

2、cocos2d-x环境的搭建之xcode

2014-03-24 19:19:37 Legendof1991 阅读数 3354
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18416 人正在学习 去看看 李宁

此系列文章用的是cocos2d-x 2.2.2版本

1. cocos2d-x架构


cocos2d-x架构如下图,摘自cocos2d-x官网。



2. cocos2d-x目录结构


解压cocos2d-x压缩包后,可以看到如下目录结构:


下面详细介绍cocos2d-x目录结构:

(1)cocos2dx:游戏引擎源码。

(2)CocosDenshion:游戏声音引擎文件。

(3)Debug.win32和Release.win32:win32平台下项目debug/release目录

(4)document:你可以下载doxygen文档系统,利用该系统打开此目录下的doxygen.config文件,然后再生成离线API文档。

(5)extensions:引擎拓展包,包含了图形用户界面(GUI)的控制功能、网络访问(network)、CocosBuilder支持甚至2.5D功能等。

(6)external:存放Box2D和chipmunk物理引擎源码等第三方库。

(7)licenses:cocos2d依赖很多其他开源项目。所有授权许可文件都在这个目录。

(8)plugin:插件工具集。

(9)projects:开发者自己创建的项目目录。

(10)samples:引擎自身的实例,开发者可以从中学到很多东西。

(11)scripting:js和lua脚本的相关源文件。

(12)template:这里汇聚了c++、js和lua在各平台的模板。

(13)tools:cocos2dx的工具集,创建项目在此目录下创建。

(14)CHANGELOG:作者修订记录文档。


2014-06-17 11:01:36 u011225840 阅读数 2395
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18416 人正在学习 去看看 李宁

这篇博客用来整理与cocos2d-x相关的工作,只要有新的分析、扩展或者修改,都会更改此文章。

祝大家愉快~


1.源码分析

1.CCScrollView源码分析

http://blog.csdn.net/u011225840/article/details/30033501  

2.CCTableView源码分析

http://blog.csdn.net/u011225840/article/details/30032379

3.Scheduler源码分析
http://blog.csdn.net/u011225840/article/details/32141349

4.Ref (CCObject) 源码分析
http://blog.csdn.net/u011225840/article/details/32919969

2.cocos2d-x的扩展


1.实现可以循环的CCCycleScrollview 2.x版本

  http://blog.csdn.net/u011225840/article/details/31354703 

3.未来的工作

1.发布EventDispatcher的源码分析

2.发布CycleScrollView源码的3.x版本,增加自动校正位置的方法,重构代码组成。
没有更多推荐了,返回首页