Aide-mémoire pygame
Dernière mise à jour
Installation et boucle de jeu
Tout programme pygame ouvre une fenêtre, puis répète une boucle jusqu'à ce que le joueur quitte.
| Opération | Code |
|---|---|
| Installer pygame-ce | python3 -m pip install pygame-ce |
| Importer et démarrer pygame | import pygame
pygame.init() |
| Ouvrir une fenêtre | screen = pygame.display.set_mode((640, 480)) |
| Définir le titre de la fenêtre | pygame.display.set_caption("My Game") |
| Créer une horloge | clock = pygame.time.Clock() |
| La boucle de jeu | running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill("black")
pygame.display.flip()
clock.tick(60) |
| Tout fermer après la boucle | pygame.quit() |
Affichage
L'écran est une Surface ; rien n'apparaît tant que vous n'appelez pas flip.
| Opération | Code |
|---|---|
| Afficher la frame terminée | pygame.display.flip() |
| N'afficher que certaines zones | pygame.display.update([rect1, rect2]) |
| Effacer l'écran | screen.fill((30, 30, 46)) |
| Taille de la fenêtre | screen.get_size(), screen.get_width() |
| L'écran sous forme de Rect | screen.get_rect() |
| Fenêtre redimensionnable | pygame.display.set_mode((640, 480), pygame.RESIZABLE) |
| Plein écran à la taille du bureau | pygame.display.set_mode((0, 0), pygame.FULLSCREEN) |
Couleurs et dessin
Les fonctions de pygame.draw prennent une surface, une couleur et une position. width=0 remplit.
| Opération | Code |
|---|---|
| Couleur en RVB | (255, 140, 0) |
| Couleur par nom ou en hexadécimal | "tomato", "#ff8c00", pygame.Color("gold") |
| Rectangle | pygame.draw.rect(screen, "red", (x, y, w, h)) |
| Contour et coins arrondis | pygame.draw.rect(screen, "red", rect, width=2, border_radius=8) |
| Cercle (par son centre) | pygame.draw.circle(screen, "blue", (cx, cy), radius) |
| Ligne | pygame.draw.line(screen, "white", (x1, y1), (x2, y2), 3) |
| Polygone | pygame.draw.polygon(screen, "green", [(0, 0), (40, 0), (20, 30)]) |
| Ellipse dans un rectangle | pygame.draw.ellipse(screen, "purple", (x, y, w, h)) |
Rect
Un Rect stocke une position et une taille en nombres entiers.
| Opération | Code |
|---|---|
| Créer un Rect | player = pygame.Rect(x, y, width, height) |
| Placer par n'importe quel point | player.center = (320, 240), player.bottom = 400 |
| Bords et coins | left, right, top, bottom, topleft, midbottom |
| Déplacer sur place | player.move_ip(dx, dy) |
| Copie déplacée | moved = player.move(dx, dy) |
| Garder dans l'écran | player.clamp_ip(screen.get_rect()) |
| Agrandir autour du centre | bigger = player.inflate(20, 20) |
| Positions décimales (pygame-ce) | pygame.FRect(10.5, 20.25, 40, 40) |
Images, Surfaces et blit
Chargez les images une seule fois, avant la boucle, puis faites-en un blit à chaque frame.
| Opération | Code |
|---|---|
| Charger une image avec transparence | img = pygame.image.load("player.png").convert_alpha() |
| Charger une image opaque | bg = pygame.image.load("sky.png").convert() |
| Dessiner une image | screen.blit(img, (x, y)) |
| Dessiner centré | screen.blit(img, img.get_rect(center=(320, 240))) |
| Nouvelle Surface vide | panel = pygame.Surface((200, 100)) |
| Surface transparente | layer = pygame.Surface((200, 100), pygame.SRCALPHA) |
| Rendre toute une Surface translucide | img.set_alpha(128) |
| Découper une frame dans une planche de sprites | frame = sheet.subsurface((0, 0, 32, 32)) |
| Enregistrer une capture d'écran | pygame.image.save(screen, "shot.png") |
Transformations
Chaque fonction renvoie une nouvelle Surface ; transformez l'original, pas le dernier résultat.
| Opération | Code |
|---|---|
| Redimensionner | pygame.transform.scale(img, (64, 64)) |
| Mettre à l'échelle par un facteur | pygame.transform.scale_by(img, 2) |
| Redimensionner en lissant | pygame.transform.smoothscale(img, (64, 64)) |
| Faire pivoter (sens antihoraire, en degrés) | pygame.transform.rotate(img, 45) |
| Faire pivoter autour du centre | rotated = pygame.transform.rotate(original, angle)
rect = rotated.get_rect(center=rect.center) |
| Retourner horizontalement | pygame.transform.flip(img, True, False) |
Événements et clavier
Utilisez les événements pour un appui unique et get_pressed() pour les touches maintenues.
| Opération | Code |
|---|---|
| Lire les événements de la frame | for event in pygame.event.get(): |
| Fenêtre fermée | event.type == pygame.QUIT |
| Une touche a été enfoncée | event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE |
| Une touche a été relâchée | event.type == pygame.KEYUP |
| Caractère saisi | event.unicode |
| Touches maintenues en ce moment | keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= 5 |
| Direction à partir de deux touches | dx = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] |
| Touches enfoncées pendant cette frame (pygame-ce) | pygame.key.get_just_pressed()[pygame.K_SPACE] |
| Constantes des touches | K_a...K_z, K_0...K_9, K_UP, K_RETURN, K_ESCAPE, K_LSHIFT |
| Nom d'une touche | pygame.key.name(event.key) |
| Événement personnalisé | HIT = pygame.event.custom_type()
pygame.event.post(pygame.event.Event(HIT)) |
Souris
Boutons : 1 gauche, 2 milieu, 3 droit.
| Opération | Code |
|---|---|
| Un bouton a été enfoncé | event.type == pygame.MOUSEBUTTONDOWN and event.button == 1 |
| Où il a été enfoncé | event.pos |
| Position actuelle du pointeur | x, y = pygame.mouse.get_pos() |
| Boutons maintenus en ce moment | left, middle, right = pygame.mouse.get_pressed() |
| La souris a bougé | event.type == pygame.MOUSEMOTION, event.rel |
| La molette a tourné | event.type == pygame.MOUSEWHEEL, event.y |
| Clic dans un bouton | button_rect.collidepoint(event.pos) |
| Masquer le pointeur | pygame.mouse.set_visible(False) |
Sprites et groupes
Un sprite garde une image et un rect ; un groupe en met à jour et en dessine plusieurs.
| Opération | Code |
|---|---|
| Classe de sprite | class Coin(pygame.sprite.Sprite):
def __init__(self, pos):
super().__init__()
self.image = coin_img
self.rect = self.image.get_rect(center=pos) |
| Créer un groupe | coins = pygame.sprite.Group() |
| Ajouter à un groupe | coins.add(Coin((100, 50))) |
| Mettre à jour tous les sprites | coins.update() |
| Dessiner tous les sprites | coins.draw(screen) |
| Retirer un sprite de tous ses groupes | coin.kill() |
| Groupe d'un seul sprite | player = pygame.sprite.GroupSingle(Player()) |
Collisions
Deux Rect entrent en collision quand ils se chevauchent ; des bords simplement en contact ne comptent pas.
| Opération | Code |
|---|---|
| Deux rectangles | a.colliderect(b) |
| Point à l'intérieur | rect.collidepoint(x, y) |
| Le premier d'une liste | rect.collidelist(walls) # index or -1 |
| Sprite contre un groupe | hits = pygame.sprite.spritecollide(player, coins, True) |
| Au moins une collision | pygame.sprite.spritecollideany(player, enemies) |
| Groupe contre groupe | pygame.sprite.groupcollide(bullets, enemies, True, True) |
| Au pixel près | pygame.sprite.spritecollide(a, group, False, pygame.sprite.collide_mask) |
| Cercles | pygame.Vector2(a).distance_to(b) < r1 + r2 |
Texte et polices
Faites le rendu du texte sur une Surface, puis un blit.
| Opération | Code |
|---|---|
| Police par défaut | font = pygame.font.Font(None, 36) |
| Police système | font = pygame.font.SysFont("arial", 24) |
| Fichier de police | font = pygame.font.Font("pixel.ttf", 32) |
| Rendre du texte | text = font.render("Score: 10", True, "white") |
| L'afficher centré | screen.blit(text, text.get_rect(center=(320, 40))) |
| Retour à la ligne automatique (pygame-ce) | font.render(story, True, "white", None, 400) |
| Taille sans rendu | font.size("Hello") |
| Polices installées | pygame.font.get_fonts() |
Son et musique
Chargez les sons une seule fois. La musique lit une piste en streaming depuis son fichier.
| Opération | Code |
|---|---|
| Charger un son | jump = pygame.mixer.Sound("jump.ogg") |
| Le jouer | jump.play() |
| Volume du son | jump.set_volume(0.5) |
| Charger une musique | pygame.mixer.music.load("theme.ogg") |
| Musique en boucle infinie | pygame.mixer.music.play(-1) |
| Pause et reprise | pygame.mixer.music.pause(), pygame.mixer.music.unpause() |
| Arrêter la musique | pygame.mixer.music.stop() |
Temps et timers
Les ticks sont en millisecondes.
| Opération | Code |
|---|---|
| Limiter le nombre d'images par seconde | clock.tick(60) |
| Delta time en secondes | dt = clock.tick(60) / 1000 |
| Images par seconde actuelles | clock.get_fps() |
| Millisecondes depuis init | pygame.time.get_ticks() |
| Événement de timer répété | SPAWN = pygame.event.custom_type()
pygame.time.set_timer(SPAWN, 1000) |
| Timer à usage unique | pygame.time.set_timer(SPAWN, 2000, loops=1) |
| Arrêter un timer | pygame.time.set_timer(SPAWN, 0) |
Vector2
Des nombres décimaux pour les positions et les vitesses.
| Opération | Code |
|---|---|
| Créer un vecteur | pos = pygame.Vector2(100, 200) |
| Déplacer selon une vitesse | pos += velocity * dt |
| Longueur | velocity.length() |
| Même vitesse en diagonale | if direction.length() > 0:
direction = direction.normalize() |
| Distance entre deux points | pos.distance_to(target) |
| Faire pivoter | velocity.rotate(90) |
| Avancer vers un point (pygame-ce) | pos.move_towards_ip(target, 5) |
Le code pygame dont vous avez besoin pour créer un jeu 2D en Python, classé par tâche : la boucle de jeu, l'affichage, les couleurs et le dessin, Rect, les images et blit, la mise à l'échelle et la rotation, le clavier et la souris, les sprites et les groupes, les collisions, le texte, le son, les timers et Vector2. Chaque ligne est un court extrait à copier, à côté de ce qu'il fait.
Tout est écrit pour pygame-ce 2.5, l'édition communautaire de pygame, qui s'importe toujours avec import pygame. Les lignes marquées pygame-ce utilisent ses ajouts ; toutes les autres fonctionnent aussi avec le pygame original. Testez n'importe quel extrait dans le playground pygame, qui exécute pygame dans votre navigateur sans rien installer. Vous débutez en Python ? Commencez par l'aide-mémoire Python.
FAQ sur l'aide-mémoire pygame
Cet aide-mémoire pygame est-il gratuit ?
Oui. Il est gratuit et sans inscription. Ajoutez-le à vos favoris ou imprimez-le en PDF depuis votre navigateur, et revenez dès que vous avez besoin de l'appel exact pour un groupe de sprites, un son ou un test de collision.
Cet aide-mémoire fonctionne-t-il avec pygame et pygame-ce ?
import pygame et partagent presque toute l'API. Les lignes marquées pygame-ce (FRect, scale_by, get_just_pressed, le retour à la ligne du texte et move_towards_ip) nécessitent pygame-ce, et tout le reste fonctionne avec l'un ou l'autre.Pourquoi ma fenêtre pygame ne répond-elle pas ?
pygame.event.get() une fois à chaque frame, même si vous ignorez les événements, et terminez chaque frame par pygame.display.flip() et clock.tick(60).Faut-il utiliser les événements ou key.get_pressed() pour les entrées ?
KEYDOWN pour les actions qui se produisent une fois par appui, comme sauter ou ouvrir un menu. Utilisez pygame.key.get_pressed() pour les actions qui durent tant qu'une touche est maintenue, comme marcher.