¿Cuál es la mejor manera de hacer una animación de pelota que rebota con bucle infinito en iPhone?

Resuelto Chintan Patel asked hace 15 años • 3 respuestas

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.

Chintan Patel avatar Jun 27 '09 21:06 Chintan Patel
Aceptado

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.

John Ballinger avatar Jul 01 '2009 13:07 John Ballinger

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 somexy someyen función del intervalo de tu temporizador. De esa manera, si lo cambias, tu animación seguirá teniendo el mismo aspecto.

Marco Mustapic avatar Jun 27 '2009 21:06 Marco Mustapic