我使用AtlasSpriteManager和AltasSprite通过1个文件的fram动画创建帧。我想写一些东西,首先显示一个简单的图片,没有任何动画,例如当我触摸它时,它显示一些动画并返回到第一个位置和帧。我只是无法使用此代码显示没有动画的第一帧:
Sprite *checker = [Sprite spriteWithFile:@"test.png"];
float frameWidth = [checker boundingBox].size.width / frameNumber;
float frameHeight = [checker boundingBox].size.height;
AtlasSpriteManager *mgr = [AtlasSpriteManager spriteManagerWithFile:fileName];
AtlasSprite *sprite = [AtlasSprite spriteWithRect:CGRectMake(pos.x, pos.y, frameWidth, frameHeight) spriteManager:mgr];
sprite.position = ccp(pos.x, pos.y);
[mgr addChild:sprite];
[layer addChild:mgr];
AtlasAnimation* animation = [AtlasAnimation animationWithName:@"Animation" delay:delay];
assert( animation != nil );
for(int i = 0; i < frameNumber; i++){
[animation addFrameWithRect:CGRectMake(i * frameWidth, 0, frameWidth, frameHeight)];
}
id action = [Animate actionWithAnimation:animation];
assert( action != nil );
id repeatAction;
if(repeatNumber == 0){
repeatAction = [RepeatForever actionWithAction:action];
}else{
repeatAction = [Repeat actionWithAction:action times:repeatNumber];
}
[sprite runAction:repeatAction];
任何想法怎么做? 提前谢谢
答案 0 :(得分:0)
我认为我不按你的意图理解你的问题。
据我所知,你有一个精灵,你有动画。但是当动画结束时,它不会返回你希望精灵静止时设置的帧。
在我们的代码中,您使用actionWithAnimation:
,是否尝试将其设置为actionWithAnimation:restoreOrigionalFrame:
,然后将restoreOrigionalFrame
部分设置为YES?
那应该渲染动画,但是当它停止时,返回到动画之前的帧。
或者,你可以让动作运行,然后当它停止时,通过调用AtlasSprite上的setTextureRect:
手动返回到某个帧。
[sprite setTextureRect:CGRectMake( x, y, width, height )];
这个标记下面的是我的老答案:
您现在拥有的代码会立即为其设置动画。
如果您希望动画触摸开始,则必须检查触摸。然后添加代码以在接收触摸的方法中启动动画。
有关如何在cocos2d下载中使用触摸的示例代码。
基本上:让你的精灵成为TargetedTouchDelegate
(或创建一个新对象来做到这一点,但这有点麻烦)并实施-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
答案 1 :(得分:0)
我认为你需要将CallFunc动作与Sequence动作相结合。
从你的代码:
}
.....
.....
id action = [Animate actionWithAnimation:animation];
assert( action != nil );
id repeatAction;
if(repeatNumber == 0){
repeatAction = [RepeatForever actionWithAction:action];
}else{
repeatAction = [Repeat actionWithAction:action times:repeatNumber];
}
id actionCallFunc = [CallFunc actionWithTarget:self selector:@selector(resetSprite)];
id actionSequence = [Sequence actions: repeatAction, actionCallFunc, nil];
[sprite runAction:repeatAction];
....
}
-(void)resetSprite{
[sprite runAction:repeatAction];
}
首先执行你的repeatAction,当它结束时,actionCallFunc将被执行,调用resetSprite方法,你可以用你的精灵做你想做的事。