新人问个弱智问题

   关于动画效果。
   http://www.cocos2d-x.org/wiki/Sprite_Sheet_Animation
   对于cocos3.0 , 其实我是照着官方文档抄的,代码如下:
   <pre class="brush:cpp; toolbar: true; auto-links: false;">

bool MainScene::init() {
if (!Layer::init()) {
return false;
}

char str = {0};
for (int i = 1; i < 8; i++) {
    sprintf(str, "bear%d.png", i);
    auto frame = SpriteFrame::create(str, Rect(0,0,40,40));
    frameVector.pushBack(frame);
}

auto animation = Animation::createWithSpriteFrames(frameVector, 0.1);
walkAction = Animate::create(animation);

bear = Sprite::create("bear1.png");
this->addChild(bear);

EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = CC_CALLBACK_2(MainScene::onTouchBegan, this);

EventDispatcher * eventDispatcher = Director::getInstance()->getEventDispatcher();
eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

// bear->runAction(animate);

return true;

}

bool MainScene::onTouchBegan(Touch *touch, Event *unused_event) {
bear->runAction(walkAction);
return false;
}



就是想实现一个熊移动的效果。。。
哪位可以给我一个可以运行的Animation完整的例子,只要是一个能够运行的工程就行?感激不尽。

上面的例子效果是:每次运行到runAction的时候就会崩溃。原因是
void Ref::retain()
{
CCASSERT(_referenceCount > 0, “reference count should greater than 0”);
++_referenceCount;
}
action的_referenceCount为0,触发了断言。
哪位可以给一个可以运行的例子吗?

自顶一下。。。。

bear为空指针,资源目录底下有对应资源码

bear不为空指针,action也不是空指针,对应资源是有的。

你的walkAction在你runAction之前被autorelease了,你可以在walkAction = Animate::create(animation);之后加一句walkAction->retain(),但是你得在析构函数中去release它

auto cache=SpriteFrameCache::getInstance();
cache->addSpriteFramesWithFile(“donghua.plist”);

Vector<SpriteFrame*> vec;
char name;
memset(name,0,15);

for (int i=0;i<20;i++)//根据donghua.plist的图片数量
{
sprintf(name,“donghua1%04d”,i);//根据donghua.plist中文件的命名
vec.pushBack(cache->getSpriteFrameByName(name));
}
Animation *animation=Animation::createWithSpriteFrames(vec,0.1f);
Animate *animate=Animate::create(animation);

auto sprite=Sprite::create();
this->addChild(sprite);
sprite->setPosition(visibleSize.width/2,visibleSize.height/2);
sprite->runAction(CCRepeatForever::create(animate));

哦 是我没仔细看,5楼说的对。

为什么walkAction会被直接autoRelease掉呢?我是用类的成员变量来保存的啊?难道成员变量的类型一定要为auto吗?

因为2dx的内存管理方式造成的,简单来说就是那个方法里面你不用这个对象,它就会被释放掉。
解决方法有两种:
第一种是retain
第二种是点击的时候才创建(建议用这种了)

referenceCount retain() release() autorelease() 是2dx对所有继承自ref的对象的管理方式,你用成员变量,只是保存住了这个对象所在的基本内存,但是因为他的referenceCount 变成了0,所以他所关联的所有东西已经被2dx释放了,所以这个对象虽然仍然存在,但已经不被2dx认可了,无法使用

建议你看一下源码中哪些操作涉及了retain和release,autorelease,理解一下2dx的内存管理方式

  每次点击后都创建,这样效率不是很低吗?

预先创建浪费空间,点击创建浪费时间,看你如何选择了。

不过开始不用考虑效率问题的,等遇到瓶颈的时候再考虑优化吧