我在我的游戏中使用cocos2d-x。 我对cocos2d-x创建方法有一些疑问。
当游戏角色需要在更新方法中更改动画时,我总是使用create()方法创建新的动画,Animate,RepeatForever对象
但我认为这不好,因为如果我创建新的动画,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对象。那我该怎么办?
P.S
我使用类memeber变量来保存Object而不是为update方法中的每个循环创建新的cocos动画对象, 但它导致错误,错误说“expression _referenceCount> 0”
p.s2
我很害怕我可怕的英语......
答案 0 :(得分:1)
在ClassName.h中:
CCAction* _aniRun;
void createAnimation();
Inside 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);
答案 1 :(得分:1)
我也是cocos2d-x的新手。我没有完整的命令..我对retain()和release()有基本的了解。
在cocos 2dx中,有一个AutoreleasePool - 负责referancecount,当你调用object-&gt; autorelease()时,这个对象 将被添加到此autoreleasepool。此池将帮助您在当前帧的生命周期内获取对象。
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有一个自动释放池,用于排出保留count = 0的对象,这是一个变量,用于检查cocos2dx对象的范围。
现在,当您使用create方法创建新对象时,它已添加到自动释放池中,您无需在任何地方将其释放或删除。
但是当你使用'new'创建新对象时,你肯定需要在它的析构函数中或在它的使用结束后释放它。
当你的对象被添加到自动释放池但你需要它在其他地方你可以保留它时,它会将其保留计数增加1,然后你必须在使用结束后手动释放它。
无论何时向对象添加对象,它都会自动保留,但您不需要将其释放,而是将其从父对象中删除。
使用retain()和autorelease()有简单的规则:
我用new创建的所有东西都是我的,我负责从内存中删除它们
使用create()方法返回的所有内容都是自动释放的,并且会在CURRENT METHOD ENDS时释放。如果retainCount为零,则它们将从内存中清除。当我在实例变量中需要它们时,我必须保留它们。
我保留的一切我都必须从记忆中释放出来。
将此保留/释放事物视为参考计数器。如果计数器降至零,则对象将被删除。