while working with textures animations many time you need to store multiple animation with a single sprite
[_gameHero addAnimation: textures2 frameRate:6 withKey:@"move up"]; //index 1
[_gameHero gotoAndPlay:0 label:@"loop"]; //plays moveright animation and loop it
[_gameHero gotoAndPlay:3 label:@"playonce"]; //plays moveleft animation but only once
adding also a complete handler when animation is complete
for eg hero is a sprite now hero contain different animation such as walk left , walk right ,walk up, walk down
so here i come with a solution
in .m file copy this code
===================================
#import <SpriteKit/SpriteKit.h>
//spriteSequence
@interface spriteSheet : SKSpriteNode
{
//private variable no one
}
@property SKTexture *startingFrame;
@property SKSpriteNode *animatedsprite;
@property SKAction *Animation;
@property SKAction *currentAction;
@property NSMutableArray *spritesArray;
@property NSMutableArray *frameRateArray;
@property NSMutableArray *actionKeys;
//public mehods
-(id) initSpritesheet:(NSString*)firstFrame;
-(void)addAnimation:(NSMutableArray*)frames frameRate:(float)time withKey:(NSString*)Key;
-(void)gotoAndPlay:(int)animationindex label:(NSString*)framelabel;
//for ground hero
@property float totalWidth;
//for zipline
@property float Hspeed;
//
@end
=============================.h file copy this code
#import "spriteSheet.h"
@implementation spriteSheet
-(id) initSpritesheet:(SKTexture*)firstFrame{
self=[super init];
if(self)
{
//passing rect to rectangle
_startingFrame=firstFrame;
[self addRefernce];
}
return self;
}
-(void) addRefernce
{
//adding a reference
_animatedsprite=[SKSpriteNode spriteNodeWithTexture:_startingFrame];
_animatedsprite.anchorPoint=CGPointMake(0.5, 0.5);
[self addChild:_animatedsprite];
_spritesArray=[[NSMutableArray alloc] init];
_frameRateArray=[[NSMutableArray alloc] init];
_actionKeys=[[NSMutableArray alloc] init];
}
//
-(void)addAnimation:(NSMutableArray*)frames frameRate:(float)time withKey:(NSString*)Key
{
[_spritesArray addObject:frames];
[_frameRateArray addObject:[NSNumber numberWithFloat:time]];
[_actionKeys addObject:Key];
}
-(void)gotoAndPlay:(int)animationindex label:(NSString*)framelabel;
{
NSMutableArray *frames=_spritesArray[animationindex];
float time=[_frameRateArray[animationindex] floatValue];
NSString *key=_actionKeys[animationindex];
_Animation = [SKAction animateWithTextures:frames timePerFrame:time resize:TRUE restore:TRUE];
if([framelabel isEqualToString:@"loop"])
{
_currentAction = [SKAction repeatActionForever:_Animation ];
}
else if([framelabel isEqualToString:@"playonce"])
{
_currentAction=_Animation;
}
[_animatedsprite runAction:_currentAction withKey:key];
}
-(void)removeThisAction:(int)index
{
[_animatedsprite removeActionForKey:_actionKeys[index]];
}
@end
now how to add animation in ur main file
where texture is a single frame which store first frame of our animation
NSString *frame =texture];
_gameHero=[[herospriteSheet alloc] initSpritesheet:frame];
where textures1,textures2,textures3,textures4 are array which store textures array
//adding animation
[_gameHero addAnimation:textures1 frameRate:1 withKey:@"moveright"]; //index 0[_gameHero addAnimation: textures2 frameRate:6 withKey:@"move up"]; //index 1
[_gameHero addAnimation textures3 frameRate:1 withKey:@"movedown"];//index 2
[_gameHero addAnimation: textures4 frameRate:0.5 withKey:@"moveleft"];//index 3
play a animation
[_gameHero gotoAndPlay:0 label:@"loop"]; //plays moveright animation and loop it
[_gameHero gotoAndPlay:3 label:@"playonce"]; //plays moveleft animation but only once
adding also a complete handler when animation is complete
[_gameHero runAction: _gameHero.currentAction completion:^{
[_gameHero gotoAndPlay:0 label:@"loop"];
}];
Comments
Post a Comment