Sprite Frames are getting confused - cocos2d-iphone

Just a quick question, when using sprite sheets and plists with coocs2d does the animations call each frame by name or does it run through the rows of the image? I am getting some frame confusions where its displaying a frame from a different sequence, say it shows a jump frame when its running. Any pointers would be helpful!
The problem seems to be when I add multiple actions
NSMutableArray *walkAnimFrames = [NSMutableArray array]; //Animation Frames
for (int i=1; i<=6; i++) {
[walkAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:#"Standing_%d.png",i]]];
}
NSMutableArray *runAnimFrames = [NSMutableArray array];
for (int i=1; i<=11; i++) {
[runAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:#"Running_%d.png",i]]];
}
NSMutableArray *jumpAnimFrames = [NSMutableArray array];
for (int i=1; i<=12; i++) {
[runAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:#"rwby_jump%d.png",i]]];
}
CCAnimation *walkAnim = [CCAnimation
animationWithSpriteFrames:walkAnimFrames delay:0.1f]; //Animations
self.walkAction = [CCRepeatForever actionWithAction:
[CCAnimate actionWithAnimation:walkAnim]];
CCAnimation *runAnim = [CCAnimation
animationWithSpriteFrames:runAnimFrames delay:0.1125f];
self.runAction = [CCRepeatForever actionWithAction:
[CCAnimate actionWithAnimation:runAnim]];
CCAnimation *jumpAnim = [CCAnimation
animationWithSpriteFrames:jumpAnimFrames delay:0.1125f];
self.jumpAction = [CCRepeatForever actionWithAction:
[CCAnimate actionWithAnimation:jumpAnim]];

Related

How to create animation in cocos2d 3.0?

So I tried
self.walkAction = [CCRepeatForever actionWithAction: [CCAnimate actionWithAnimation:walkAnim]];
But then I discovered that CCRepeatForever has been renamed and CCAnimate removed. How can I replace this?
All code: http://pastebin.com/VnrtiCwb
CCRepeatForever was replaced with CCActionRepeatForever and CCAnimate with CCActionAnimate
try this code
CCSprite *sprite = [CCSprite spriteWithImageNamed:#"sv_anim_1.png"]; // comes from your .plist file
sprite.position = ccp( [[CCDirector sharedDirector] viewSize].width/2, [[CCDirector sharedDirector] viewSize].height/2 );
CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithFile:#"scene1atlas.png"];
[batchNode addChild:sprite];
[self addChild:batchNode];
NSMutableArray *animFrames = [NSMutableArray array];
for(int i = 1; i < 5; i++)
{
//NSString *str=[NSString stringWithFormat:#"an1_anim%d.png",i];
CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:#"an1_anim%d.png",i]];
[animFrames addObject:frame];
}
animation = [CCAnimation animationWithSpriteFrames:animFrames delay:0.2f];
[sprite runAction:[CCActionRepeatForever actionWithAction:[CCActionAnimate actionWithAnimation:animation]]];

how to run multiple ccAnimation in one ccSprite

I have one character sprite and i have to run multiple ccAnimation on it like run animation and jump animation. For this i have created spritesheet and assign it the frames. here is my code:
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:#"ch_run_slow.plist"];
spriteSheet = [CCSpriteBatchNode batchNodeWithFile:#"ch_run_slow.png"];
[self addChild:spriteSheet];
_character = [CCSprite spriteWithSpriteFrameName:#"Ch_run_slow_12.png"];
_character.tag=1;
[spriteSheet addChild:_character];
and my animation functions are:
-(void) characterSlowRun
{
NSMutableArray *runSlowAnimFrames = [NSMutableArray array];
for (int i=1; i<=12; i++)
{
[runSlowAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:#"Ch_run_slow_%d.png",i]]];
}
CCAnimation *runSlow = [CCAnimation
animationWithSpriteFrames:runSlowAnimFrames delay:0.1f];
runSlowAction=[CCAnimate actionWithAnimation:runSlow];
runSlowAction = [CCRepeatForever actionWithAction:
[CCAnimate actionWithAnimation:runSlow]];
[_character runAction:runSlowAction];
}
and Jump Action method is:
-(void) characterJumpSmall
{
[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFramesFromFile:#"ch_run_slow.plist"];
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:#"ch_jump_small.plist"];
spriteSheet = [CCSpriteBatchNode batchNodeWithFile:#"ch_jump_small.png"];
NSMutableArray *jumpSmallAnimFrames = [NSMutableArray array];
for (int i=1; i<=13; i++)
{
[jumpSmallAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:#"Ch_jump_small_%d.png",i]]];
}
CCAnimation *jumpSmall = [CCAnimation
animationWithSpriteFrames:jumpSmallAnimFrames delay:0.1f];
jumpSmallAction=[CCAnimate actionWithAnimation:jumpSmall];
[_character runAction:jumpSmallAction];
}
on init i call [self characterSlowRun]; and on ccTouchesEnded i use [_character stopAction:runSlowAction];
[self characterJumpSmall];
initially runSlow action works fine bt when tap on screen it crashes. jump action not working. what i do? please help me
You have to stop your walkSlow Action with [_charactar stopAllActions] because walkSlow is running endlessly.
Assertion failure in -[CCSprite setTexture:]. And that's all? I am sure that your error message is a bit longer. Also you can check cocos2d sources, as it is open source and see what line caused this assertion failure.
Anyway, it seems that your touble is just a result of trying to use frames from different spritesheets on a single sprite. Place your animations to a single spritesheet and it should work fine.

How to run two animation at same time at same sprite?

In my game, I am running two animations using CCSpawn but it shows only one animation at a time. What is wrong here? Here is my code.
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:#"walkcycle.plist"] ;
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:#"walkcycle.png"];
[heroWorldLayer addChild:spriteSheet];
NSMutableArray *runFrames = [NSMutableArray array];
for(int i = 1; i <= 11; ++i) {
CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:#"Run_Anim00%02d.png", i]];
[runFrames addObject:frame];
}
id runAnim = [CCAnimation animationWithFrames:runFrames delay:1.0/22.0];
id runAnimate = [CCAnimate actionWithAnimation:runAnim restoreOriginalFrame:NO];
// _runAction = [CCRepeatForever actionWithAction:runAnimate];
// [heroBodySprite runAction:_runAction];
NSMutableArray *poofFrames = [NSMutableArray array];
for(int i = 1; i <= 10; ++i) {
CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:#"Poof00%02d.png", i]];
[poofFrames addObject:frame];
}
id poofAnim = [CCAnimation animationWithFrames:poofFrames delay:1.0/20.0];
id poofAnimate = [CCAnimate actionWithAnimation:poofAnim restoreOriginalFrame:NO];
// id poofAction = [CCRepeatForever actionWithAction:poofAnimate];
// [heroBodySprite runAction:poofAction];
[heroBodySprite runAction:[CCRepeatForever actionWithAction:[CCSpawn actions:runAnimate, poofAnimate, nil]]];
You basically want to display two different frames at the same time on the same sprite. That is just not possible, think about it. What kind of magic do you expect Cocos2d to do for you ? Some animations are just not made to be compatible with each other. It's like if you tried to move a sprite to the left and to the right at the same time, and were surprised it didn't work...

moving sprite animation

i have a cocos2d world, and a sprite/body that is moving fast .
when contact occur i am calling animation function.
The problem is , that when the animation is running in the current sprite position, the sprite was already gone to another place so animation is not in right place:
how would i run this animation function to follow my sprite ?
code:
-(void)animation:(NSString *)animation
{
NSLog(#"check:%#",animation);
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:[NSString stringWithFormat:#"%#.plist",animation]];
sprite = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:#"%#_00000.png",animation]]; //take the corrdinates of this picture from the plist
sprite.position=boy.position;
//sprite.position=ccp(160,175);
CCSpriteBatchNode *spriteSheet = [ CCSpriteBatchNode batchNodeWithFile:[NSString stringWithFormat:#"%#.png",animation]];
[spriteSheet addChild:sprite]; //add this coordinates from the spritesheet to the screen
[self addChild:spriteSheet];
NSString *Path = [[NSBundle mainBundle] bundlePath];
NSString *animPath = [Path stringByAppendingPathComponent: [NSString stringWithFormat:#"%#.plist", animation]];
NSDictionary *animSpriteCoords = [[NSDictionary alloc] initWithContentsOfFile: animPath];
NSDictionary *animFramesData = [animSpriteCoords objectForKey:#"frames"];
int b=0;
int a=0;
NSMutableArray *animFrames = [NSMutableArray array];
for(int i = 1; i < [animFramesData count]; i++)
{
a=a+1;
if(a==10)
{
b=b+1;
a=0;
}
CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:#"%#_000%0i%1i.png",animation,b,a]]; //[NSString stringWithFormat:#"eye_blinking_0000%1d.png",i]
[animFrames addObject:frame];
}
//CCAnimation *dollAnimation = [CCAnimation animation];
CCAnimation* dollAnimation = [CCAnimation animationWithFrames:animFrames delay:0.1f];
//CCAnimation *dollAnimation = [CCAnimation animationWithName:#"dance" animationWithFrames:animFrames];
//[dollAnimation setDelay:0.1f];
CCAnimate * Action = [CCAnimate actionWithAnimation:dollAnimation];
id call=[CCCallFunc actionWithTarget:self selector:#selector(finishAnimation)];
id sequence=[CCSequence actions:Action,[CCHide action],call,nil];
[sprite runAction:sequence];
}
thnaks a lot.
CCFollow will have the animation sprite follow the boy sprite:
id follow = [CCFollow actionWithTarget:boy];
[sprite runAction:follow];
Alternative is to continuously update the animation sprite's position to that of the boy position (sprite.position = boy.position) in a scheduled update method.

Box2D body with animating sprite sheet plist

I have created an animating sprite using CCSpriteBatchNode and CCSprite. I use plist to get frames. Here is the code I put it in init().
//================== making animating sprite
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: #"framelist.plist"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode
batchNodeWithFile:#"frames.png"];
[self addChild:spriteSheet];
NSMutableArray *walkAnimFrames = [NSMutableArray array];
for(int i = 1; i <= 2; ++i) {
[walkAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:#"frame%d.png", i]]];
}
CCAnimation *walkAnim = [CCAnimation
animationWithFrames:walkAnimFrames delay:0.1f];
//_frameSprite is CC Sprite
_frameSprite = [CCSprite spriteWithBatchNode:spriteSheet
rect:CGRectMake(0,0,48,48)];
_frameSprite.position = ccp(winSize.width + 60, winSize.height/2);
_flyAction = [CCRepeatForever actionWithAction:
[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];
[_frameSprite runAction:_flyAction];
[spriteSheet addChild:_frameSprite];
Once the sprite is ready and running on screen I created b2BodyDef and assign b2Body (i.e. frameBodyDef, frameBody) my sprite as shown below.
b2BodyDef frameBodyDef;
frameBodyDef.type = b2_staticBody;
frameBodyDef.position.Set(160/PTM_RATIO, 200/PTM_RATIO);
frameBodyDef.userData = _frameSprite;
frameBody = _world->CreateBody(&frameBodyDef);
After creating the body, when build and ran, the program crashes at line
frameBody = _world->CreateBody(&frameBodyDef);
Saying BAD ACCESS.
Please kindly help me out in this, why the animating sprite cannot be added to the body???
Thank you.
Here is the solution I figure it out.
If you make sprite sheet from plist and want your animation sheet to add to the body make sure first add your sprite object to the body then add the sprite to the sheet.
here is the right code
//================== making animating sprite
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: #"framelist.plist"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode
batchNodeWithFile:#"frames.png"];
[self addChild:spriteSheet];
NSMutableArray *walkAnimFrames = [NSMutableArray array];
for(int i = 1; i <= 2; ++i) {
[walkAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:#"frame%d.png", i]]];
}
CCAnimation *walkAnim = [CCAnimation
animationWithFrames:walkAnimFrames delay:0.1f];
//_frameSprite is CC Sprite
_frameSprite = [CCSprite spriteWithBatchNode:spriteSheet
rect:CGRectMake(0,0,48,48)];
_frameSprite.position = ccp(winSize.width + 60, winSize.height/2);
_flyAction = [CCRepeatForever actionWithAction:
[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];
[_frameSprite runAction:_flyAction];
b2BodyDef frameBodyDef;
frameBodyDef.type = b2_staticBody;
frameBodyDef.position.Set(160/PTM_RATIO, 200/PTM_RATIO);
frameBodyDef.userData = _frameSprite; //================first add the sprite to body
frameBody = _world->CreateBody(&frameBodyDef);
[spriteSheet addChild:_frameSprite]; //======second add sprite to the sheet