2013-10-13 3 views
1

В моей игре iOS я надеюсь, что герой будет продолжать работать до тех пор, пока не коснется экрана, и герой должен прыгнуть. Итак, я пишу:
В файле .h:cocos2d sprite repeat animation forever

@interface Hero : CCSprite { 
    CCSprite *_hero; 
    id _keepRunning; 
} 
@property(nonatomic,retain) id keepRunning; 

В .m файл:

@synthesize keepRunning = _keepRunning; 
-(id) init { 
    _keepRunning = [CCRepeatForever actionWithAction:[CCAnimate actionWithSpriteSequence:@"heroRun%04d.png" 
                       numFrames:30 
                        delay:0.02f 
                    restoreOriginalFrame:NO]];   
} 

Затем, когда начинается игра, я называю запуска() метод:

-(void) run { 
    [_hero stopAllActions]; 
    [_hero runAction:_keepRunning]; 
    _heroState = RUNNING; 
} 

Затем я обнаружил, что CCAnimate actionWithSpriteSequence: numFrames: delay: restoreOriginalFrame: устарел в cocos2d версии 2.0. Итак, мой вопрос: в cocos2d v2.0, как я могу реализовать эту анимацию? А именно, держите моего героя в бегах? Спасибо!
EDIT:
Я попытался это:

-(CCAnimation*) getMyAnimationWithFramesName:(NSString*)nameFormat numFrames:(int)numFrames delay:(float)delay { 
    NSMutableArray *frames = [[NSMutableArray alloc] init]; 
    for (int i = 1; i <= numFrames; i++) { 
     NSString *frameName = [NSString stringWithFormat:nameFormat,i]; 
     [frames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:frameName]]; 
    } 
    CCAnimation *ani = [CCAnimation animationWithSpriteFrames:frames delay:delay]; 
    return ani; 
} 

Тогда в Init():

_keepRunning = [self getMyAnimationWithFramesName:@"heroRun%04d.png" numFrames:30 delay:0.02f]; 

и в перспективе():

[_hero runAction:[CCAnimate actionWithAnimation:_keepRunning]]; 

Но до сих пор не Работа. Что мне делать?

+0

Попробуйте увеличить задержку (т.е. 0,1). Попробуйте выполнить регистрацию имен фреймов и/или массива фреймов для проверки правильности имен. Кроме того, если вы не используете ARC, вы пропустите массив frames. – LearnCocos2D

+0

@ LearnCocos2D Я проверил и обнаружил, что не использую ARC. В чем причина утечки массива кадров? Как это исправить? Спасибо! – lkkeepmoving

+0

Утечка находится в первой строке вашего метода getMyAnimationWithFramesName: numFrames: delay:. Вы не уничтожаете нигде не созданный массив 'frames' – Morion

ответ

2

Прежде всего скачать Фактура 'http://www.codeandweb.com/texturepacker/download' и сделать р-List и использовать его под кодом

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"AnimatedMan.plist"]; 

CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"AnimatedMan.png"]; 

[self addChild:spriteSheet]; 

Собирают список кадров (спрайт)

NSMutableArray *walkAnimFrames = [NSMutableArray array]; 
for (int i=1; i<=6; i++) { 
    [walkAnimFrames addObject: 
    [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
     [NSString stringWithFormat:@"step0%d.png",i]]]; 
} 

дают Action к Sprite

CCAnimation *walkAnim = [CCAnimation animationWithSpriteFrames:walkAnimFrames delay:0.1f]; 

     manSprite=[CCSprite spriteWithSpriteFrameName:@"step01.png"]; 
     manSprite.position=ccp(winsize.width/2, winsize.height/2-40); 

Sprite RepeaetForever для manSprite

id first=[CCSequence actions:[CCRepeatForever actionWithAction: 
             [CCAnimate actionWithAnimation:walkAnim]],nil]; 

[manSprite runAction:first];