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() 有简单的规则:
我用new创建的一切都是我的,我负责从内存中删除它们
使用 create() 方法返回的所有内容都是自动释放的,并将在当前方法结束时释放。如果 retainCount 为零,它们将从内存中清除。当我在实例变量中需要它们时,我必须保留它们。
我保留的一切我将不得不从记忆中释放它。
将此 retain/release 东西视为参考计数器。如果计数器降为零,对象将被删除。
我在游戏中使用 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() 有简单的规则:
我用new创建的一切都是我的,我负责从内存中删除它们
使用 create() 方法返回的所有内容都是自动释放的,并将在当前方法结束时释放。如果 retainCount 为零,它们将从内存中清除。当我在实例变量中需要它们时,我必须保留它们。
我保留的一切我将不得不从记忆中释放它。
将此 retain/release 东西视为参考计数器。如果计数器降为零,对象将被删除。