cocos2d-x 在更新方法中使用 create() 方法

cocos2d-x use create() method in update method

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

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

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

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对象。那我该怎么办?

p.s

我使用 class memeber 变量来保存该对象,而不是为更新方法中的每个循环创建新的 cocos 动画对象, 但它会导致错误,错误说 "expression _referenceCount > 0"

p.s2

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

里面 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);

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

在 cocos 2dx 中,有一个 AutoreleasePool —— 它负责 referancecount ,当你调用 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. 我保留的一切我将不得不从记忆中释放它。

将此 retain/release 东西视为参考计数器。如果计数器降为零,对象将被删除。