Publiceren met pygbag

Je hebt een gaaf spel gemaakt en nu wil je het delen met de rest van de wereld. Met pygbag zet je jouw Pygame-spel om in een webpagina die iedereen in de browser kan spelen. Geen installatie, geen gedoe. Gewoon een link sturen en klaar!

Wat is pygbag?

Pygbag compileert je Python-code naar WebAssembly en verpakt het met een kleine Pygame-runtime die in de browser draait. De speler hoeft niks te installeren: gewoon de pagina openen en spelen. Dat maakt het perfect om je spel te delen met vrienden, familie of op itch.io.

Beperkingen

Pygbag werkt niet met Pgzero (de vereenvoudigde bibliotheek van de eerste sessies). Je hebt echte Pygame nodig, dus dit is beschikbaar vanaf sessie 4 en later.

Verder zijn er een paar dingen die niet werken in de browser:

  • Geen schijftoegang: je kunt geen bestanden lezen of schrijven vanuit het spel.
  • Geen threads: gebruik geen threading of multiprocessing.
  • Geen blocking calls: alles moet asynchroon verlopen (zie hieronder).

Installeren

In een uv-project:

uv add pygbag

Of in Thonny via de pakketbeheerder:

pip install pygbag

Project klaarmaken

Pygbag vereist dat je hoofdlus asynchroon is. Dat betekent: je main-functie wordt async def main(), en in elke frame-iteratie voeg je await asyncio.sleep(0) toe. Die ene regel geeft de browser de kans om te ademen tussen frames.

Hieronder vind je een kant-en-klare basisstructuur: Pygbag-klare structuur voor main.py:

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)  # required for pygbag

asyncio.run(main())

Pas je eigen spelcode aan zodat alles binnen async def main() zit, en vergeet await asyncio.sleep(0) onderaan de while-lus niet.

Bouwen

Navigeer in je terminal naar de map met main.py en voer uit:

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

De output verschijnt in de map build/web/. Die map bevat alles wat nodig is om je spel te hosten.

Lokaal testen

Wil je eerst zien of het werkt voordat je publiceert? Gebruik hetzelfde commando zonder --build:

uv run python -m pygbag main.py

Pygbag start een lokale webserver op http://localhost:8000. Open die link in je browser en je speelt je eigen spel, precies zoals anderen het zullen zien.

Publiceren

Als alles werkt, zijn er twee manieren om je spel te delen:

  1. Via de coach: zip de map build/web/ en geef het zipbestand aan je coach. Die zorgt voor de hosting.
  2. Via itch.io: maak een gratis account op itch.io, maak een nieuw project aan als HTML-game, en upload de zip van build/web/. Binnen een paar minuten heeft je spel een eigen pagina die iedereen kan bezoeken!

Gefeliciteerd! Je hebt zojuist een echt webspel gepubliceerd. 🎮