Des objets avec des images
Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 14 sur 36.
Les ennemis sont des images qui se déplacent sur des Rect, et le code de départ gère à la main trois Rect et trois blits. Une classe peut regrouper une image et son Rect :
class Enemy:
def __init__(self, image, x, y):
self.image = image
self.rect = image.get_rect(center=(x, y))
self.speed = 2
def update(self):
self.rect.y += self.speed
if self.rect.top > 480:
self.rect.bottom = 0
def draw(self, screen):
screen.blit(self.image, self.rect)L’image est passée en argument, elle n’est pas chargée dans __init__. Charge chaque fichier une seule fois au début et transmets la même Surface à chaque ennemi qui l’utilise : dix ennemis rouges partagent la même image rouge. Cependant, chaque ennemi a son propre Rect, et se déplace donc indépendamment.
Déplacer l’ennemi, c’est déplacer son Rect, et le dessiner, c’est afficher son image à l’emplacement du Rect : les deux attributs que possède chaque objet de jeu dans cette section.
Défi
Moyen- Écris la classe
Enemyavec__init__(self, image, x, y),update(self)etdraw(self, screen), comme ci-dessus : le Rect centré en (x, y), qui descend de 2 pixels par image, puis revient au-dessus du bord supérieur une fois qu’il se trouve sous la fenêtre. - Crée
enemies, une liste de trois éléments : le rouge centré en (160, 100), le vert en (320, 100) et le jaune en (480, 100). - Mets à jour et dessine chaque ennemi de la liste ; supprime les trois Rects.
Essayez vous-même
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Enemy Rain")
clock = pygame.time.Clock()
red = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
green = pygame.image.load("assets/images/enemy_green.png").convert_alpha()
yellow = pygame.image.load("assets/images/enemy_yellow.png").convert_alpha()
red_rect = red.get_rect(center=(160, 100))
green_rect = green.get_rect(center=(320, 100))
yellow_rect = yellow.get_rect(center=(480, 100))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
for rect in (red_rect, green_rect, yellow_rect):
rect.y += 2
if rect.top > 480:
rect.bottom = 0
screen.fill((20, 22, 40))
screen.blit(red, red_rect)
screen.blit(green, green_rect)
screen.blit(yellow, yellow_rect)
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