I took Riq's advice and made a custom Animate class that worked like a charm. I've pasted it below and you can read more about it here:
http://getsetgames.com/189
FastAnimate.h:
#import "cocos2d.h"
@interface FastAnimate : IntervalAction <NSCopying>
{
Animation *animation;
}
+(id) actionWithAnimation:(id<CocosAnimation>) a;
-(id) initWithAnimation:(id<CocosAnimation>) a;
@end
FastAnimate.m:
#import "FastAnimate.h"
@implementation FastAnimate
+(id) actionWithAnimation: (id<CocosAnimation>)anim {
return [[[self alloc] initWithAnimation:anim] autorelease];
}
-(id) initWithAnimation: (id<CocosAnimation>)anim {
NSAssert( anim!=nil, @"Animate: argument Animation must be non-nil");
if( (self=[super initWithDuration: [[anim frames] count] * [anim delay]]) ) {
animation = [anim retain];
}
return self;
}
-(id) copyWithZone: (NSZone*) zone {
return [[[self class] allocWithZone: zone] initWithAnimation: animation];
}
-(void) dealloc {
[animation release];
[super dealloc];
}
-(void) start {
[super start];
}
-(void) stop {
[super stop];
}
-(void) update: (ccTime) t {
NSUInteger idx=0;
ccTime slice = 1.0f / [[animation frames] count];
if(t !=0 )
idx = t/ slice;
if( idx >= [[animation frames] count] ) {
idx = [[animation frames] count] -1;
}
id<CocosNodeFrames> sprite = (id<CocosNodeFrames>) target;
if (! [sprite isFrameDisplayed: [[animation frames] objectAtIndex: idx]] ) {
[sprite setDisplayFrame: [[animation frames] objectAtIndex:idx]];
}
}
@end