Hello,
I'm new to game development and I'm trying to manually animate and positionate a sprite.
I already accomplished it changing one of Cocos2D examples.
Given the following code, what I want to know is: do I really need CCAnimation, since I'm just changing the frames manually? Is it a simpler/better way?
Setting frames and animation:
-(id) init
{
if( (self=[super init]) ) {
CGSize s = [[CCDirector sharedDirector] winSize];
CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage:@"animations/dragon_animation.png"];
// manually add frames to the frame cache
CCSpriteFrame *frame0 = [CCSpriteFrame frameWithTexture:texture rect:CGRectMake(132*0, 132*0, 132, 132) offset:CGPointZero];
CCSpriteFrame *frame1 = [CCSpriteFrame frameWithTexture:texture rect:CGRectMake(132*1, 132*0, 132, 132) offset:CGPointZero];
CCSpriteFrame *frame2 = [CCSpriteFrame frameWithTexture:texture rect:CGRectMake(132*2, 132*0, 132, 132) offset:CGPointZero];
CCSpriteFrame *frame3 = [CCSpriteFrame frameWithTexture:texture rect:CGRectMake(132*3, 132*0, 132, 132) offset:CGPointZero];
CCSpriteFrame *frame4 = [CCSpriteFrame frameWithTexture:texture rect:CGRectMake(132*0, 132*1, 132, 132) offset:CGPointZero];
CCSpriteFrame *frame5 = [CCSpriteFrame frameWithTexture:texture rect:CGRectMake(132*1, 132*1, 132, 132) offset:CGPointZero];
//
// Animation using Sprite Sheet
//
sprite = [CCSprite spriteWithSpriteFrame:frame0];
sprite.position = ccp( s.width/2-80, s.height/2);
sprite.anchorPoint = ccp(0,0);
[self addChild:sprite];
NSMutableArray *animFrames = [NSMutableArray array];
[animFrames addObject:frame0];
[animFrames addObject:frame1];
[animFrames addObject:frame2];
[animFrames addObject:frame3];
[animFrames addObject:frame4];
[animFrames addObject:frame5];
CCAnimation *animation = [CCAnimation animationWithName:@"fly" delay:0.2f frames:animFrames];
[sprite addAnimation:animation];
[self schedule:@selector(tick:) interval:1.0/60.0];
}
return self;
}
Animating and changing location:
#define RAW_SPEED 120.0
- (void)tick:(float)dt {
// Last absolute time
static double lastTime = 0.0;
// Absolute time difference from last frame
double timeDiff = 0.0;
// Actual absolute time
double actualTime = CFAbsoluteTimeGetCurrent();
// Position speed
static float speed = -RAW_SPEED;
// New position
float distanceTraveled = (speed * dt);
// Change animation frame interval
double animationInterval = 0.1;
// Last moved absolute time
static double lastMoved = 0.0;
// Actual animation frame
static int frame = 0;
// Change sprite animation frame
if((actualTime - lastMoved) >= animationInterval){
[sprite setDisplayFrame:@"fly" index:frame%6];
lastMoved = actualTime;
}
// New position for sprite
sprite.position = ccp(sprite.position.x + distanceTraveled, sprite.position.y);
// Check boundaries and flip speed and sprite
if(sprite.position.x + sprite.contentSize.width >= 480) {
speed = -RAW_SPEED;
sprite.flipX = NO;
}
if(sprite.position.x <= 0) {
speed = RAW_SPEED;
sprite.flipX = YES;
}
timeDiff = actualTime - lastTime;
lastTime = actualTime;
NSLog(@"actualTime: %f - timeDiff: %f - Distance: %f - speed: %f\n", actualTime, timeDiff, distanceTraveled, speed);
}
Thanks!