Les sprites animés à partir de quelques images
J'ai été la recherche de quelques bonnes tutoriel sur simple sprite animation à partir de quelques images en Python à l'aide de Pygame. Je n'ai toujours pas trouvé ce que je cherche.
Ma question est simple: comment faire une animation de sprite à partir de quelques images (pour un exemple: faire quelques images de l'explosion avec des dimensions 20x20px pour ne faire plus qu'un, mais animés)
Toutes les bonnes idées?
Vous voulez un spritesheet. Vous pouvez soit charger à partir de plusieurs images, ou un seul avec source
Rect
s lorsque vous le blit. Voici un autre exemple: pygame.org/wiki/Spritesheet?parent=CookBookOriginalL'auteur lbartolic | 2012-12-26
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer de modifier votre sprite de sorte qu'il permute son image pour un article différent à l'intérieur de
update
. De cette manière, lorsque le sprite est rendu, il va chercher d'animation.Modifier:
Voici un petit exemple que j'ai dessiné:
Il suppose que vous avez deux images appelées
image1.png
etimage2.png
à l'intérieur du même dossier que le code est en.Ce que vous pourriez essayer de faire est d'ajouter
self.counter = 0
à l'intérieur de__init__
. Puis, à l'intérieurupdate
, incrémenterself.counter
. Si elle est égale à haut nombre (peut-être 99), puis le remettre à zéro, et l'incrément deself.index
par un. De cette façon, l'animation sera mise à jour qu'une fois tous les 100 tiques. Je suis sûr qu'il ya de meilleures façons, mais ce moyen est assez simple et probablement le travail pour vous.Fin de commentaire, mais la façon dont je le fais, c'est d'utiliser
self.image = self.images[math.floor(self.index)]
et puis incrémenterself.index
par 0.08.OriginalL'auteur Michael0x2a
Il y a deux types d'animation: cadre dépendante de et dépendant du temps. Les deux fonctionnent de manière similaire.
Avant la boucle principale
index
, qui garde une trace sur l'index actuel de la liste d'images.current_time
oucurrent_frame
qui conserve la trace de l'heure ou de l'image en cours depuis la dernière mise à l'index de la substitution.animation_time
ouanimation_frames
que définir le nombre de secondes ou cadres devraient passer avant de changer d'image.Au cours de la boucle principale
current_time
par le nombre de secondes écoulées depuis la dernière fois que nous l'incrémentée, ou de l'incrémentcurrent_frame
par 1.current_time >= animation_time
oucurrent_frame >= animation_frame
. Si la valeur est true continuer avec 3-5.current_time = 0
oucurrent_frame = 0
.index = 0
.Travail exemple
Quand a choisi
Dépendant du temps animation vous permet de jouer l'animation à la même vitesse, peu importe comment lent/rapide que la cadence est lente ou rapide de votre ordinateur. Cela permet à votre programme de modifier librement le framerate sans affecter l'animation et il va également être compatibles, même si l'ordinateur ne peut pas suivre la cadence. Si le programme accuse l'animation va rattraper son retard à l'etat, il aurait été comme si aucun décalage qui s'était passé.
Bien, il pourrait arriver que le cycle d'animation n'est pas synchronisé avec la fréquence d'images, faisant de l'animation du cycle semble irrégulière. Par exemple, disons que nous avons les images de la mise à jour tous les 0.05 seconde et l'animation de l'interrupteur de l'image chaque 0.075 deuxième, puis le cycle serait:
Et ainsi de suite...
Cadre dépendante de pouvez regarder plus lisse si votre ordinateur peut gérer la vitesse constante. Si le décalage se passe, c'vais mettre en pause dans son état actuel et redémarrer lorsque le gal s'arrête, ce qui rend le décalage de plus en plus perceptibles. Cette solution est un peu plus facile à mettre en œuvre car vous avez juste besoin d'incrémenter
current_frame
avec 1 à chaque appel, au lieu de traiter avec le temps delta (dt
) et en passant à chaque objet.Sprites
Résultat
pygame.sprite.Sprite
classe.Ouais, j'y ai pensé, mais n'était pas sûr, parce que ce serait rendre la réponse plus en plus difficile pour les débutants à comprendre car elle permettrait de créer de l'héritage et les groupes de sprite. Pourrait changer mon esprit et de mettre en œuvre plus tard, quand j'ai le temps.
Si rien d'autre, je pense que vous devriez changer le nom de la classe de sorte qu'il n'est pas identique à celui dans pygame—qui je pense pourrait être particulièrement déroutant pour les gens dans le processus de commencer à apprendre à ce sujet.
C'est un bon point. J'ai changé le nom et ajouté dans les groupes de sprite. Il semble être assez simple encore.
Cela n'a pas fonctionné pour moi parce que
clock.tick(FPS) / 1000
rendements toujours 0 (entier). Au lieu de cela, j'ai utilisédt = clock.tick(FPS) / 1000.0
pour forcer l'utilisation de la virgule flottante.OriginalL'auteur Ted Klein Bergman
Vous devriez avoir tous vos sprite animations sur une grande "toile", donc pour 3 20x20 explosion sprite images, vous aurez 60x20 image. Maintenant, vous pouvez obtenir le droit de cadres par le chargement d'une zone de l'image.
À l'intérieur de votre classe sprite, probablement à la méthode de mise à jour, vous devriez avoir quelque chose comme ceci (codé en dur pour des raisons de simplicité, je préfère avoir séparé la classe à être responsable pour le choix de la bonne image d'animation).
self.f = 0
sur__init__
.OriginalL'auteur Ruslan Osipov