2012-11-30 5 views
0

Il s'agit d'une question d'algorithme/structure de données sur la réalisation de différentes animations en même temps. Par exemple, une balle tombe d'un pixel en une milliseconde, une balle se déplace de 5 pixels en ms, et un homme se déplace d'un pixel en 20 millisecondes. Et pense qu'il y en a des centaines ensemble. Quel est le meilleur moyen de rassembler toutes les animations, de déplacer ce que nous avons besoin de déplacer dans un appel de fonction et de supprimer celles dont l'animation est terminée? Je ne veux pas créer un fil pour chacun. Ce que je veux faire est de créer un fil déplaçant tous les objets et dormant jusqu'à ce qu'un objet ait besoin d'être déplacé.Quelle est la meilleure façon de faire des animations simultanées?

Remarque: J'utilise Java/Swing pour imprimer des objets et des images dans JPanel.

+0

Cela dépend entièrement de la plate-forme. Par exemple, l'utilisation d'une animation objet basée sur une matrice de transformation vous permettra de combiner certaines animations en une seule (traduction + mise à l'échelle, etc.). – Till

+0

Tout ce que je fais est d'utiliser la méthode de peinture et de peindre différents objets et images différents endroits dans Java, Swing. – sedran

Répondre

1

J'ai récemment fait quelque chose de similaire en Python. Je ne sais pas si c'est la meilleure méthode, mais voici ce que j'ai fait.

Créer une classe abstraite Event avec l'interface publique suivante:

  • tick - calcule le temps écoulé depuis la dernière tique. Effectuer un travail proportionnel à cette durée. Cela devrait être appelé fréquemment pour créer l'illusion d'un mouvement fluide; peut-être seize fois par seconde ou plus.
  • isDone - retourne vrai lorsque l'événement est terminé.

Créez une sous-classe de Event pour tout ce qui prend plus d'une image à terminer. Rotation, mise à l'échelle, changement de couleur, etc. Vous pouvez créer une sous-classe TweenEvent d'un événement si vous souhaitez déplacer une image d'une partie de l'écran à une autre. Pendant chaque tick, retracer l'image dans une position plus éloignée de la position d'origine, et plus loin vers la position de destination.

Vous pouvez exécuter de nombreux événements en même temps, comme ceci:

Array<Event> events = new Array<Event>(); 

//add a bunch of TweenEvents here - one for a bullet, one for a ball, etc. 

while(True){ 
    Sleep(1/16); 
    for(Event e in events){ 
     e.tick(); 
     if (e.isDone()){events.remove(e);} 
    } 
} 
+0

Merci pour la réponse, j'utilise une méthode similaire et je la trouve un peu complexe. Peut-être que nous pouvons trouver un meilleur moyen ici :) – sedran

Questions connexes