【问题标题】:cocos2d-x use create() method in update methodcocos2d-x 在 update 方法中使用 create() 方法
【发布时间】:2015-05-02 09:11:02
【问题描述】:

我在游戏中使用 cocos2d-x。 我有一些关于 cocos2d-x 创建方法的问题。

当游戏角色需要在更新方法中改变动画时,我总是使用 create() 方法来创建新的 Animation 、 Animate 、 RepeatForever 对象

但我认为这不好,因为如果我创建新的 Animation、Animate、RepeatForever 对象来更改我的游戏角色的动画,如下所示 (下面的代码只是Update方法的一部分)

auto anim = cocos2d::Animation::create();
anim->setDelayPerUnit(0.3);

anim->addSpriteFrameWithFile("./Hero/walk1_0.png");

anim->addSpriteFrameWithFile("./Hero/walk1_1.png");


anim->addSpriteFrameWithFile("./Hero/walk1_2.png");

anim->addSpriteFrameWithFile("./Hero/walk1_3.png");

auto animation = cocos2d::Animate::create(anim);

m_pBasicSprite->runAction(animation);

当游戏角色频繁更换动画时,会导致创建过多的 cocos 对象。那我该怎么办呢?

附言

我使用类成员变量来保存该对象,而不是在更新方法中为每个循环创建新的 cocos 动画对象, 但它会导致错误,错误说“表达式_referenceCount> 0”

p.s2

我很抱歉我糟糕的英语......

【问题讨论】:

    标签: cocos2d-x


    【解决方案1】:

    在 ClassName.h 中:

    CCAction* _aniRun;
    void createAnimation();
    

    在 ClassName.cpp 中:

    // create a function
    void ClassName::createAnimation()
    {
        // run ani
        CCAnimation* animation=CCAnimation::create();
        animation->setDelayPerUnit(0.05f);
        for (int i=0; i<1; i++)
        {
            char str[50];
            sprintf(str,"game/bird/run%d.png", i);
            animation->addSpriteFrameWithFileName(str);
        }
        _aniRun = CCRepeatForever::create(CCAnimate::create(animation));
        _aniRun->retain();
    }
    

    现在无论你想在哪里播放动画,只需调用

    player->runAction(aniRun);    
    

    不要忘记在析构函数中释放_aniRun

    CC_SAFE_RELEASE(_aniRun);
    

    【讨论】:

    • 对不起,我可以问更多关于 cocos 节点对象的问题吗?什么是retain() 方法?听说retain()和release()是控制cocos节点对象引用计数的方法。但是,什么时候 cocos 对象的引用计数会增加或减少?你能给我一些关于 retain() 和 release() 的想法吗?当我调用保留和释放()?非常感谢
    • @HelloWorld 我已经添加了一个答案,它将对你有所帮助.. 不太清楚,因为我也是新人..
    【解决方案2】:

    我也是 cocos2d-x 的新手。我对它没有完全的控制权。我对 retain() 和 release() 有基本的了解。

    在 cocos 2dx 中,有一个 AutoreleasePool ——它负责引用计数,当你调用 object->autorelease() 时,这个对象 将被添加到此自动释放池中。此池将帮助您在当前帧的生命周期内保留对象。

    Ref有4个功能,含义是

    retain: add reference count by 1
    
    release: minus reference count by 1
    
    autorelease: put the object in to AutoReleasePool, which means that cocos2d-x will invoke release automatically at the end of this frame
    
    getReferenceCount: as the meaning of the function, it will retain the reference count of this object
    

    cocos2dx 有一个自动释放池,它会排出保留计数 = 0 的对象,这是一个变量,用于检查 cocos2dx 对象的范围。

    现在,当您使用 create 方法创建新对象时,它已经添加到自动释放池中,您无需在任何地方释放或删除它。

    但是当你使用 'new' 创建新对象时,你肯定需要在其析构函数中或在其使用结束后释放它。

    当您的对象被添加到自动释放池中,但您在其他地方需要它时,您可以保留它,这会将其保留计数增加一,然后您必须在使用结束后手动释放它。

    每当您添加子对象时,它都会自动保留,但您无需释放它,而是将其从父对象中移除。

    retain() 和 autorelease() 有简单的规则:

    1. 我用 new 创建的所有东西都是我的,我负责从内存中删除它们

    2. 使用 create() 方法返回的所有内容都是自动释放的,并将在当前方法结束时释放。如果retainCount 为零,它们将从内存中清除。当我在实例变量中需要它们时,我必须保留它们。

    3. 我保留的所有内容都必须从内存中释放出来。

    将此保留/释放事物视为引用计数器。如果计数器归零,则该对象将被删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多