Quel est le meilleur moyen de créer une animation de balle rebondissante avec une boucle infinie sur iPhone?

StackOverflow https://stackoverflow.com/questions/1052878

  •  20-08-2019
  •  | 
  •  

Question

Je développe un jeu pour iPhone dans lequel les oiseaux rebondissent.

J'ai configuré les images pour animer les ailes de l'oiseau en vol comme ceci:

[imgBird[i] setAnimationImages:birdArrayConstant];
[imgBird[i] setAnimationDuration:1.0];
[imgBird[i] startAnimating];

Maintenant, la façon dont je fais bouger l'oiseau consiste à utiliser un NSTimer pour déclencher toutes les 0,03 secondes, ce qui ajoute / soustrait 1 à la coordonnée x ou y de imgBird [i] .center.

J'ai appris à le faire comme ça à partir d'ici. http: // icodeblog .com / 2008/10/28 / tutoriel-programmation-iphone-animation-a-ball-using-an-nstimer /

Mais le problème est que les oiseaux ralentissent dès qu'une autre minuterie (pour déplacer mon navire de la même façon) tire et revient à la vitesse initiale lorsque je cesse de déplacer le navire.

Existe-t-il un meilleur moyen de garder l'oiseau en mouvement, sauf NSTimer?

Le mouvement de l’oiseau est une boucle infinie.

Était-ce utile?

La solution

Vous devez importer CoreGraphics et les frameworks QuartzCore dans votre projet.

Ajoutez ces lignes en haut de votre fichier.

#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"];

J'espère que ça aide un peu.

Autres conseils

D'après votre question, il semble que vous utilisiez plus d'une minuterie. Utilisez un seul pour animer tous vos objets. Quelque part, au démarrage de votre application, procédez comme suit:

[NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(mainLoop:) userInfo:nil repeats:YES];

Ensuite, en boucle principale, quelque chose comme ceci:

- (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);
}

De même, vous devez calculer somex et somey en fonction de votre intervalle de temps. De cette manière, si vous le changez, votre animation aura toujours le même aspect.

Vous voudrez utiliser Core Animation au lieu de déplacer manuellement les oiseaux. Jetez un coup d'œil à CAAnimation dans les documents. En gros, vous configurez une animation, le chemin dans lequel vous voulez qu'elle avance, et vous lui dites simplement de courir. Ça va s'occuper du reste. Il a également un support pour l’assouplissement qui ralentira et accélérera le rythme, de sorte qu’il aura l’air plus naturel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top