Sur iPhone, quel est le meilleur moyen de déplacer un UIImageView avec des contrôles à l'écran?

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

Question

Je développe une version iPhone de ce jeu. http://www.students.uni-mainz.de/rathb000/ Fillit / Game.html

J'utilise un NSTimer pour modifier la position du navire de 1 pixel et l'intervalle de temps pour le minuteur est de 0,002.

Cependant, j’ai remarqué que le vaisseau ne se déplaçait pas plus vite si je réduisais l’intervalle de temps furthur. Enfait, il n'y a pas de différence entre 0,05 et 0,002. Existe-t-il une restriction sur le temps minimum que vous devez donner en tant que NSTimeInterval?

Le navire se déplace actuellement trop lentement pour que le jeu soit passionnant.

De plus, le mouvement des oiseaux (également réalisé par NSTimer) devient plus lent lorsque j’appuie sur un bouton pour déplacer le navire.

Avez-vous une idée de la façon dont cela peut être résolu?

Était-ce utile?

La solution 6

Compris cela.

Il a fallu utiliser Core Animation pour déplacer le navire et faire déplacer les oiseaux par NSTimer. Fonctionne bien de cette façon mais jusqu’à une certaine limite. Les oiseaux ralentissent à nouveau lorsque la vitesse du navire augmente plus qu’une certaine limite.

Autres conseils

NSTimer n'est pas un mécanisme en temps réel; il se déclenche dans le cadre de la boucle d'exécution et n'est pas idéal pour créer des animations fluides et fluides. Il existe toutefois un SDK faisant partie du système d'exploitation de l'iPhone, appelé Core Animation. Il fournit une bibliothèque de fonctions permettant de réaliser une animation fluide des calques et des vues. Voici une série assez bonne des didacticiels vidéo qui pourraient vous être utiles. Il existe également un excellent livre intitulé Animation principale pour Mac OS X et iPhone qui vous pouvez trouver utile.

Il existe également le documentation d'animation de base d'Apple décrivant comment utiliser la classe CABasicAnimation pour animer les propriétés de tout calque ou de toute vue. Voici un exemple d'animation de couche explicite à partir de la documentation:

CABasicAnimation *theAnimation; 

theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
theAnimation.duration=3.0;
theAnimation.repeatCount=1;
theAnimation.autoreverses=NO;
theAnimation.fromValue=CATransform3DTranslate(0,0,0);
theAnimation.toValue=CATransform3DTranslate(20,20,0);

[theLayer addAnimation:theAnimation forKey:@"animateTransform"];

À partir de NSTimer docs:

  

Une minuterie n’est pas un mécanisme en temps réel; il ne se déclenche que lorsque l’un des modes de la boucle d’exécution auquel le chronomètre a été ajouté est en marche et peut vérifier si le temps de déclenchement du minuteur est écoulé. En raison des différentes sources d'entrée gérées par une boucle d'exécution typique, la résolution effective de l'intervalle de temps d'un temporisateur est limitée à environ 50 à 100 millisecondes. Si la minuterie se déclenche alors que la boucle est dans un mode qui ne surveille pas la minuterie ou pendant un appel prolongé, la minuterie ne se déclenche pas avant la prochaine vérification de la boucle par la boucle. Par conséquent, l'heure réelle à laquelle le minuteur se déclenche peut être une période de temps significative après l'heure de déclenchement planifiée.

Peut-être pourriez-vous essayer de déplacer UIView en utilisant des animations UIView au lieu d'un minuteur.

Vous pourriez envisager d’augmenter la distance: déplacez le navire de 3 ou 4 pixels toutes les 0,05 secondes au lieu d’un pixel toutes les 0,002 secondes.

À mon avis, vous devriez utiliser le même pas de temps globalement pour toutes les entités de votre jeu et non pas exclusivement pour le vaisseau du joueur. Si le navire se déplace trop lentement avec votre pas de temps, augmentez la distance parcourue par image.

Vraiment, vous devriez penser à déplacer le vaisseau de votre joueur en pixels / seconde. Lorsque l'événement NSTimer est déclenché, obtenez le temps écoulé depuis la dernière mise à jour. Utilisez ce temps écoulé pour déplacer vos entités de jeu. Par exemple, si votre pas de mise à jour est de 0,05 seconde et que vous souhaitez déplacer le vaisseau du joueur de 100 pixels par seconde, vous devez le déplacer de 100 * 0,05 = 5 pixels dans cette mise à jour. Cette méthode tiendra compte de la taille variable des pas de temps et vos entités de jeu apparaîtront toujours comme se déplaçant à une vitesse constante, même si votre mécanisme de minuterie n’est pas aussi cohérent.

Non seulement NSTimer n'est pas le bon outil pour ce type d'animation, mais votre conception est fausse.

Une minuterie avec un entier égal à 0002 se déclenche 500 fois par seconde. C'est une façon folle d'animer ce jeu.

Je vous suggère de vous familiariser avec la conception de jeux en 2D et de trouver un meilleur moyen de détecter les collisions. Anonym suggère de créer un rectangle de collision autour du navire plutôt que de compter sur les pixels réels.

Vous devriez également consulter Cocos -2D pour iPhone

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