0

我正在使用 AtlasSpriteManager 和 AltasSprite 使用 1 个文件创建逐帧动画。我想写一些东西,首先显示一个简单的图片,没有任何动画,例如当我触摸它时,它会显示一些动画并返回到第一个位置和帧。我无法使用以下代码显示没有动画的第一帧:

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];

知道怎么做吗?提前谢谢

4

2 回答 2

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 方法,您可以在其中对您的精灵做您想做的事情。

于 2009-11-30T12:36:34.640 回答
0

更新的答案

我认为我没有按照您的意图理解您的问题。

据我所知,你有一个精灵,你有一个动画。但是当动画完成时,它不会返回到您希望在静止时设置精灵的帧。

在您使用的我们的代码actionWithAnimation:中,您是否尝试过将其设置为actionWithAnimation:restoreOrigionalFrame:然后将restoreOrigionalFrame部分设置为是?

那应该渲染动画,但是当它停止时,返回到动画之前的帧。

setTextureRect:或者,您可以让动作运行,然后当它停止时,通过调用AtlasSprite手动返回到某个帧。

[sprite setTextureRect:CGRectMake( x, y, width, height )];

在此标记下方是我的旧答案:


您现在拥有的代码将立即对其进行动画处理。

如果您希望动画在触摸时开始,则必须检查是否有触摸。然后在接收触摸的方法中添加启动动画的代码。

cocos2d 下载中有关于如何使用触摸的示例代码。

基本上:让你的精灵成为一个TargetedTouchDelegate(或创建一个新对象来做到这一点,但这有点麻烦)并实现-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event

于 2009-11-21T02:12:59.620 回答