Quel est le meilleur moyen de créer une animation de balle rebondissante avec une boucle infinie sur iPhone?
-
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.
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.