¿Cuál es la mejor manera de hacer una animación de pelota que rebota con bucle infinito en iPhone?
Estoy desarrollando un juego para iPhone en el que los pájaros rebotan.
He configurado las imágenes para animar las alas del pájaro volador de esta manera:
[imgBird[i] setAnimationImages:birdArrayConstant];
[imgBird[i] setAnimationDuration:1.0];
[imgBird[i] startAnimating];
Ahora, la forma en que hago que el pájaro se mueva es usar un NSTimer para disparar cada 0,03 segundos, lo que suma/resta 1 de la coordenada xoy de imgBird[i].center.
Aprendí a hacerlo así desde aquí. http://icodeblog.com/2008/10/28/iphone-programming-tutorial-animating-a-ball-using-an-nstimer/
Pero el problema es que los pájaros disminuyen la velocidad tan pronto como se dispara otro temporizador (para mover mi barco de la misma manera) y vuelve a la velocidad original cuando dejo de mover el barco.
¿Existe una mejor manera de mantener al pájaro en movimiento excepto NSTimer?
El movimiento del pájaro es un bucle infinito.
Deberá importar CoreGraphics y los marcos QuartzCore a su proyecto.
Agregue estas líneas al principio de su archivo.
#import <QuartzCore/QuartzCore.h>
#import <CoreGraphics/CoreGraphics.h>
...
UIImageView *bird = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bird2.png"]];
CALayer *b = bird.layer;
// Create a keyframe animation to follow a path to the projected point
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"scale"];
animation.removedOnCompletion = NO;
// Create the path for the bounces
CGMutablePathRef thePath = CGPathCreateMutable();
// Start the path at my current location
CGPathMoveToPoint(thePath, NULL, bird.center.x, bird.center.y);
CGPathAddLineToPoint(thePath, NULL,20, 500.0);
/* // very cool path system.
CGMutablePathRef thePath = CGPathCreateMutable();
CGPathMoveToPoint(thePath,NULL,74.0,74.0);
CGPathAddCurveToPoint(thePath,NULL,74.0,500.0,
320.0,500.0,
320.0,74.0);
CGPathAddCurveToPoint(thePath,NULL,320.0,500.0,
566.0,500.0,
566.0,74.0);
*/
//animation.rotationMode = kCAAnimationRotateAuto;
animation.path = thePath;
animation.speed = 0.011;
//animation.delegate = self;
animation.repeatCount = 1000000;
// Add the animation to the layer
[b addAnimation:animation forKey:@"move"];
Espero que esto ayude un poco.
Según tu pregunta, parece que estás usando más de un temporizador. Usa solo uno para animar todos tus objetos. En algún lugar, cuando se inicie tu aplicación, tienes esto:
[NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(mainLoop:) userInfo:nil repeats:YES];
Luego, en el bucle principal, algo como esto:
- (void)mainLoop:(NSTimer *)timer
{
// compute new position for imgBirds
for (int i=0; i<kBirdCount; i++)
{
imgBirds[i].center = CGPointMake(somex, somey);
}
// compute new position for ship
ship.center = CGPointMake(somex, somey);
}
Además, debes calcular somex
y somey
en función del intervalo de tu temporizador. De esa manera, si lo cambias, tu animación seguirá teniendo el mismo aspecto.