Animer avec le temps
Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 27 sur 36.
Un compteur d’images lie l’animation à la fréquence d’images. Sur un ordinateur qui ne gère que 30 images par seconde, les ailes du scarabée battent à la moitié de leur vitesse. Faites plutôt dépendre l’animation du temps.
pygame.time.get_ticks() correspond au nombre de millisecondes écoulées depuis pygame.init(). Divisez cette valeur par la durée d’affichage de chaque image pour obtenir le nombre d’images écoulées ; % transforme ce nombre en indice :
frame_index = pygame.time.get_ticks() // 120 % len(frames)De 0 à 119 ms, il s’agit de l’image 0 ; de 120 à 239 ms, de l’image 1, puis de l’image 2, et enfin à nouveau de l’image 0. Pas de compteur à conserver et à réinitialiser : une seule ligne, recalculée à chaque image. Si le jeu ralentit, l’animation saute une image au lieu de ralentir avec lui.
// effectue une division et supprime le reste : 250 // 120 vaut 2. La troisième rangée de cette feuille contient un scarabée en vol dans trois poses, dans les colonnes 6 à 8, déjà découpées dans frames.
Défi
Moyen- Supprimez
timeret le compteur. - À chaque image, définissez
frame_indexà partir depygame.time.get_ticks()afin que chacune des trois images s’affiche pendant 120 millisecondes, dans l’ordre.
Essayez vous-même
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Flying Bug")
clock = pygame.time.Clock()
sheet = pygame.image.load("assets/sheets/platformer_characters.png").convert_alpha()
frames = []
for col in (6, 7, 8):
frame = sheet.subsurface((col * 24, 48, 24, 24))
frames.append(pygame.transform.scale_by(frame, 3))
frame_index = 0
timer = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
timer += 1
if timer == 10:
timer = 0
frame_index = (frame_index + 1) % len(frames)
screen.fill((20, 22, 40))
image = frames[frame_index]
screen.blit(image, image.get_rect(center=(320, 240)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Toutes les leçons de Sprites et images
1Charger des images
Charger une imageLa placer avec un rectangleDéplacer l’imageRépéter un arrière-planPixels transparents2Tourner, retourner, redimensionner
Faire pivoter autour du centreRegarder dans la direction du volRedimensionner une imagePivoter à partir de l’original5Collisions au pixel près
Les rectangles semblent injustesMasquesSprites au pixel prèsZones de collision circulaires3Les classes pour les objets du jeu
Votre première classeLes méthodesSelf est l’objetUne liste d’objetsDes objets avec des imagesUne sous-classe6Animation à partir de feuilles de sprites
Découper une feuille de spritesUn compteur de framesAnimer avec le tempsUne explosion à déclenchement uniqueEntraînez-vous par vous-même : Playground Pygame