AtlasSpriteManager动画

时间:2009-11-20 14:05:05

标签: iphone cocos2d-iphone atlassprites

我使用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];

任何想法怎么做? 提前谢谢

2 个答案:

答案 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方法,你可以用你的精灵做你想做的事。