Publier avec pygbag

Tu as fait un jeu sympa et maintenant tu veux le partager avec le reste du monde. Avec pygbag, tu transformes ton jeu Pygame en une page web que tout le monde peut jouer dans le navigateur. Pas d’installation, pas d’embêtements. Tu envoies un lien et c’est tout !

Qu’est-ce que pygbag ?

Pygbag compile ton code Python en WebAssembly et l’emballe avec un petit runtime Pygame qui tourne dans le navigateur. Le joueur n’a rien à installer : il ouvre la page et il joue. C’est donc parfait pour partager ton jeu avec tes amis, ta famille ou sur itch.io.

Limitations

Pygbag ne fonctionne pas avec Pgzero (la bibliothèque simplifiée des premières sessions). Il te faut du vrai Pygame, donc c’est disponible à partir de la session 4 et après.

En plus, quelques choses ne marchent pas dans le navigateur :

  • Pas d’accès au disque : tu ne peux pas lire ni écrire de fichiers depuis le jeu.
  • Pas de threads : n’utilise pas threading ni multiprocessing.
  • Pas d’appels bloquants : tout doit se passer en asynchrone (voir ci-dessous).

Installation

Dans un projet uv :

uv add pygbag

Ou dans Thonny via le gestionnaire de paquets :

pip install pygbag

Préparer ton projet

Pygbag exige que ta boucle principale soit asynchrone. Ça veut dire : ta fonction main devient async def main(), et à chaque itération de frame tu ajoutes await asyncio.sleep(0). Cette seule ligne donne au navigateur la chance de respirer entre les frames.

Ci-dessous, tu trouves une structure de base prête à l’emploi : structure de main.py prête pour pygbag :

import asyncio
import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()

async def main():
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        screen.fill((30, 30, 60))
        pygame.display.flip()
        clock.tick(60)
        await asyncio.sleep(0)  # requis pour pygbag

asyncio.run(main())

Adapte le code de ton propre jeu pour que tout se trouve dans async def main(), et n’oublie pas await asyncio.sleep(0) en bas de la boucle while.

Compiler

Dans ton terminal, va dans le dossier avec main.py et lance :

uv run python -m pygbag --build main.py

Le résultat apparaît dans le dossier build/web/. Ce dossier contient tout ce qu’il faut pour héberger ton jeu.

Tester en local

Tu veux d’abord voir si ça marche avant de publier ? Utilise la même commande sans --build :

uv run python -m pygbag main.py

Pygbag démarre un serveur web local sur http://localhost:8000. Ouvre ce lien dans ton navigateur et tu joues à ton propre jeu, exactement comme les autres le verront.

Publier

Si tout fonctionne, il y a deux façons de partager ton jeu :

  1. Via le coach : zippe le dossier build/web/ et donne le fichier zip à ton coach. C’est lui qui s’occupe de l’hébergement.
  2. Via itch.io : crée un compte gratuit sur itch.io, crée un nouveau projet en jeu HTML et téléverse le zip de build/web/. En quelques minutes, ton jeu a sa propre page que tout le monde peut visiter !

Félicitations ! Tu viens de publier un vrai jeu web. 🎮