Moteur 2D pour Python (Pygame Web)

Salut, pour la Pycon DE 2022 j’avais envisagé de faire tourner Pygame directement dans les navigateurs internet ( via WebAssembly, sans installation, ni serveur web dynamique* ).

Ayant réussi à temps, j’ai ultérieurement créé un petit outil d’aide à la publication pour que tout le monde en profite ( même sans linux ni compilateur, juste python 3.8+ ):

l’outil est là : pygbag · PyPI

le jeu de référence (injouable trop dur!) : Stuntcat by pmp-p publié en moins d’une minute sur itch.io .

Quelques tech démos içi : https://pmp-p.github.io/pygame-wasm/
qui ont servi pour
Christian Heimes: Python 3.11 in the Web Browser - A Journey (Keynote) - YouTube ( les sous titres Fr sont potables ).

Mieux comprendre la technologie mais en Anglais :

NB: un problème de son est à prévoir sur le navigateur web Brave. C’est surement temporaire il y a une issue déjà ouverte.

* katasdk ferait en gros la meme chose pour du code pygame mais avec le serveur proprio Kata.games.

2 « J'aime »

Impressionant.
Je suis curieux de savoir combien pèse la VM Python en format web ?

dans les 21 MiB sans compression ( stdlib minimum, asyncio, cffi, ctypes, pygame+pymunk), 5.2 MiB en lzma

1 « J'aime »

Et vous pouvez tenter votre chance sur une jam FR, comme Construct French Game Jam 10 (#CFGJ10) - itch.io.

Je suis dispo pour aider tout participant potentiel voulant release avec pygbag ( avec pyinstaller qui est souvent flag en virus, personne n’a plus trop envie de tester des .exe sur itch ).

Le discord de la jam est marqué ici FrenchJam #1 - itch.io je serais dessus !

1 « J'aime »

re, juste pour signaler que les problèmes de sons ont été fixés

et que maintenant pygbag peut générer des “scripts” autonomes qui fonctionnent aussi bien sur le web que localement avec “python -x page.html” ( en remettant au goût du jour un vieux hack pour MS-DOS inclu dans CPython )

exemple pygame avec des fichiers png inclus :
https://pygame-web.github.io/showroom/pygame-scripts/org.space.shooter.html

( plus d’infos ici When to use pygame script ? | pygame-web.github.io )

exemple 3D + compliqué avec des shaders inclus:
https://pmp-p.github.io/harfang3d/harfang-test.html?cpython3.10#debug

( et si vous ne connaissez pas Harfang c’est par là Moteur 3D pour Python (HARFANG 3D) - #6 par astrofra )

1 « J'aime »

Je ne me rends pas bien compte de ce que ça représente comme travail à faire tout ça : tu adaptes la lib pour la rendre compatible avec un compilateur Python→JS ? (ou WASM ?)

Ce serait une « recette » applicable à d’autres bibliothèques graphiques par exemple (je pense notamment à pyglet) ?

alors impossible de prévoir si un module va accepter wasm sans poser de problème : il faut essayer et espérer qu’il n’y aura pas une cascade de mésaventures. C’est pour ça que je ne porte que des gros modules bien liés à cpython depuis longtemps et multiplateforme.

Ce n’est pas vers JS mais bien vers WASM qui est un cpu à part entière ( et emscripten ou wasi les OS posix qui “tournent” dessus ). C’est donc un peu comme ajouter un module sur kivy/android

Des fois un simple /opt/python-wasm-sdk/python3-wasm setup.py bdist_wheel fera l’affaire, des fois c’est une cascade d’incompatibilités avec la cross-compilation ( eg Pillow ) à cause d’un setup.py inadapté.

le sdk c’est içi

Donc oui la recette est applicable partout, mais déjà par exemple pyglet par défaut fait de l’OpenGL alors que le web n’autorise que GLES donc à tester …

1 « J'aime »

Et maintenant des roues sont dispo pour pygame, numpy, matplotlib, Harfang3D et bien d’autres, et encore + à venir.

Les roues sont stockées là archives/repo/pkg at main · pygame-web/archives · GitHub même si j’aimerais vraiment plutôt les voir chez AFPY que sur github.

On peut les importer depuis le REPL ou depuis pygame-script

nb: tous les imports de roues doivent être fait dans le __main__
Car les imports d’un fichier importé ne seront pas détectés : le chargeur “devine” les roues à importer par parsing du code du point d’entrée.

Bonjour,
Super package ! Merci et bravo !

J’ai une question, (je ne suis pas sur de la poser au bon endroit…) .
J’ai fais un jeu dans un style “streetfighter” avec pygame. Le jeu se lance bien dans le navigateur, mais la vitesse du jeu semble limitée. Elle semble notamment décorrélée de la définition des FPS donnée dans python (qui lui marche normalement quand on le compile).

Je n’ai pas les connaissances me permettant de trouver la solution à ce problème, qui es peut être lié à la partie HTML…
En vous remerciant

Salut, pour les réponses approfondies il y a le discord de afpy avec les sections “hors sujet” ou “entraide” qui font tres bien l’affaire. Sinon coté FPS c’est simple ce n’est pas python qui décide du tout ni même pygame : c’est le fabriquant du périphérique qui fixe le nombre d’image par secondes des navigateurs ( sur PC ça devrait etre 50 ou 60 ips pour la plupart des écrans ). Et donc il faut adapter les animations en fonction du delta T qui est fixé ( il peut etre nécessaire de faire de l’interpolation linéaire mais en prenant 30 images par seconde comme base d’animation on arrive à s’en tirer assez facilement)

1 « J'aime »

L’adoption de Python pour le navigateur web commence à décoller !

Deux collections itch à explorer :

2D

3D

1 « J'aime »