PyCgame
gamedev engine with python
Install / Use
/learn @Baptistegrn/PyCgameREADME
🎮 PyCgame
PyCgame est un module Python pour créer facilement des jeux 2D avec :
- 🖼️ Gestion des images
- 🔊 Gestion des sons
- ⌨️ Gestion du clavier/souris
- 🎮 Support des manettes/joysticks
- 🧮 Fonctions mathématiques intégrées
👉 Compatible avec Windows et Linux.
<img src="https://raw.githubusercontent.com/Baptistegrn/PyCgame/refs/heads/main/demo.gif" width="500">
⚡ Installation
📦 Depuis PyPI
pip install PyCgame
🐍 Importation dans votre projet
from PyCgame import PyCgame
⚠️ Important :
L’import doit être exactement :from PyCgame import PyCgameToute autre forme d’import peut empêcher la bibliothèque de localiser correctement ses dépendances internes.
⚙️ Compilation automatique
Si votre système d’exploitation n’est pas directement compatible,
la compilation de la bibliothèque native sera automatiquement effectuée via xmake.
Assurez-vous que :
- la librairie compilée se trouve bien dans
dist/(ex :PyCgame/dist/), - et que
xmakeest correctement installé et accessible dans votre terminal.
🧱 Génération d’un exécutable
Pour compiler votre projet en exécutable autonome :
pycgame_app nom_du_fichier
Détails :
- Le fichier
.exe(ou équivalent selon l’OS) sera généré dans le dossier/dist. - PyInstaller est requis pour cette étape.
- L’exécutable généré est spécifique à l’OS sur lequel la compilation a été faite.
💡 Astuce :
Si vous avez recompilé la librairie viaxmake, l’exécutable obtenu ne sera pas forcément portable entre distributions Linux différentes.
Il est donc recommandé de compiler sur une distribution largement utilisée (ex. Ubuntu, Debian, Fedora).
🚀 Initialisation d'un jeu
PyCgame.init(
largeur=160, # largeur virtuelle
hauteur=90, # hauteur virtuelle
fps=60, # nombre d'images par seconde
coeff=3, # facteur de mise à l'échelle
chemin_image="./assets", # dossier images
chemin_son="./assets", # dossier sons
dessiner=True, # dessiner le fond ?
bande_noir=True, # bandes noires si ratio différent ?
r=0, g=0, b=0, # couleur de fond
update_func=Update, # fonction d'update
nom_fenetre="MonJeu", # nom de la fenêtre
debug=False # on écrit les logs dans erreurs.log ?
)
PyCgame.stopper_jeu()
🔄 Boucle de mise à jour
def Update():
if PyCgame.touche_presser("Espace"):
print("Espace pressée !")
📊 Propriétés globales
| Propriété | Description |
| -------------------- | ----------------------------------- |
| PyCgame.largeur | largeur virtuelle |
| PyCgame.hauteur | hauteur virtuelle |
| PyCgame.dt | delta time entre frames |
| PyCgame.fps | FPS actuel |
| PyCgame.time | temps écoulé |
| PyCgame.run | bool : le jeu tourne ? |
| PyCgame.decalage_x | décalage en x du jeu en plein écran |
| PyCgame.decalage_y | décalage en y du jeu en plein écran |
🖱️ Gestion de la souris
PyCgame.mouse_x
PyCgame.mouse_y
PyCgame.mouse_presse
PyCgame.mouse_juste_presse
PyCgame.mouse_droit_presse
PyCgame.mouse_droit_juste_presse
⌨️ Gestion du clavier
Vérification des touches
PyCgame.touche_presser("A")
PyCgame.touche_enfoncee("A")
Liste complète des touches supportées
Lettres :
A … Z (majuscules ou minuscules acceptées)
Chiffres :
0 … 9
Touches spéciales :
espaceentrer/returnechap/escapetabmaj/shiftctrl/controlaltaltgrcapslock/verrmajverrnum/numlock
Navigation :
haut/upbas/downgauche/leftdroite/rightinsertsuppr/deletehomeendpageup/precedentpagedown/suivant
Système :
menu/contextprintscreen/imprscrolllockpause/break
Pavé numérique :
kp0…kp9kp+kp-kp*kp/kp.kpentrer/kpreturn
Fonctions :
F1…F12
🎮 Gestion des manettes
PyCgame.init_mannette(0)
if PyCgame.touche_mannette_juste_presse("X"):
PyCgame.pause_son("./assets/test.wav")
if PyCgame.touche_mannette_juste_presse("Y"):
PyCgame.reprendre_son("./assets/test.wav")
if PyCgame.touche_mannette_enfoncee("A"):
print("A maintenu")
# Lecture des joysticks
axes = PyCgame.renvoie_joysticks()
if axes:
x_gauche, y_gauche, x_droit, y_droit, lt, rt = axes
print("Stick gauche :", x_gauche, y_gauche)
print("Stick droit :", x_droit, y_droit)
print("Triggers :", lt, rt)
PyCgame.fermer_controller()
Boutons supportés
Boutons principaux :
a,b,x,y
Système :
start,back,select,guide,home,share,capture
Sticks cliquables :
leftstick,l3rightstick,r3
Bumpers :
lb,l1,leftshoulderrb,r1,rightshoulder
Triggers :
lt,l2rt,r2
Croix directionnelle (D-Pad) :
haut/upbas/downgauche/leftdroite/right
Additionnels :
paddle1,paddle2,paddle3,paddle4touchpad
🎮 Joysticks analogiques
PyCgame.renvoie_joysticks(dead_zone=0.1)
Retourne un tableau de 6 valeurs flottantes entre -1 et 1 :
- axe horizontal du stick gauche
- axe vertical du stick gauche
- axe horizontal du stick droit
- axe vertical du stick droit
- gâchette gauche (trigger L2 / LT)
- gâchette droite (trigger R2 / RT)
⚠️ Dead zone : ignore les petites variations au repos (par défaut 0.1)
🖼️ Images et texte
Le système de rendu utilise l'ordre de dessin : les éléments sont affichés dans l'ordre où ils sont ajoutés. Pour placer une image au premier plan, il faut retirer les éléments qui la précèdent puis les rajouter après (coût négligeable).
# Dessiner une image
PyCgame.dessiner_image("./assets/perso.png", x=10, y=20, w=32, h=32, sens=0, rotation=0)
# Dessiner plusieurs images en batch (plus performant)
PyCgame.dessiner_image_batch(
ids=["./assets/tile.png", "./assets/tile.png", "./assets/enemy.png"],
xs=[0, 32, 64],
ys=[0, 0, 16],
ws=[32, 32, 48],
hs=[32, 32, 48],
sens=[0, 0, 1], # optionnel (par défaut : 0)
rotations=[0, 0, 90] # optionnel (par défaut : 0)
)
# Dessiner du texte
PyCgame.dessiner_mot(
lien="./assets/police", # chemin vers la police de caractères
mot="Hello World",
x=50, y=50,
coeff=1, # facteur de taille
ecart=1, # espacement entre les caractères
sens=0, # orientation (0=normal, 1=miroir horizontal)
rotation=0 # rotation en degrés
)
# Écrire dans la console de debug
PyCgame.ecrire_console("Message de debug")
Paramètres de dessin
- lien/ids : chemin vers l'image ou la police de caractères
- x, y : position en pixels (coordonnées virtuelles)
- w, h : largeur et hauteur en pixels
- sens : orientation (0 = normal, 1 = miroir horizontal)
- rotation : rotation en degrés (0-360)
- coeff : facteur d'échelle pour le texte
- ecart : espacement entre les caractères du texte
🔊 Sons
# Jouer un son
PyCgame.jouer_son("./assets/son.wav", boucle=1, canal=3)
# Arrêter un son spécifique
PyCgame.arreter_son("./assets/son.wav")
# Arrêter un canal
PyCgame.arreter_canal(3)
# Pause/Reprendre par canal
PyCgame.pause_canal(3)
PyCgame.reprendre_canal(3)
# Pause/Reprendre par son
PyCgame.pause_son("./assets/son.wav")
PyCgame.reprendre_son("./assets/son.wav")
Paramètres audio
- boucle : nombre de répétitions (-1 = infini, 0 = une fois, 1+ = répétitions)
- canal : canal audio à utiliser (-1 = automatique, 0-31 = canal spécifique)
🧮 Fonctions mathématiques
PyCgame.abs_val(-5)
PyCgame.clamp(10, 0, 5)
PyCgame.pow(2, 3)
PyCgame.sqrt(16)
PyCgame.sin(3.14)
PyCgame.atan2(1, 1)
Inclus aussi : cos, tan, log, exp, floor, ceil, round, trunc, fmod, hypot, etc.
🖥️ Redimensionnement
PyCgame.redimensionner_fenetre()
🎨 Colorier fond
PyCgame.colorier(r, g, b)
🎲 Fonction random
PyCgame.random(min, max)
📂 Exemple minimal
from PyCgame import PyCgame
def update():
# Dessiner une image chaque frame
PyCgame.dessiner_image("./assets/player.png", 10, 10, 32, 32)
if PyCgame.touche_presser("Espace"):
print("Espace pressée !")
PyCgame.init(largeur=160, hauteur=90, fps=60, update_func=update)
✅ Notes importantes
- Les chemins des fichiers sont relatifs au projet.
- Les images sont dessinées dans l'ordre d'ajout - l'ordre définit la profondeur de rendu.
update_funcdoit être une fonction callable.- Utilisez
dessiner_image_batch()pour optimiser le rendu de multiples images similaires. - Pour les manettes : toujours appeler
PyCgame.init_mannette()aprèsPyCgame.init()et fermer avecPyCgame.fermer_controller()avant de quitter.
📬 Support
Pour signaler un bug ou proposer une amélioration :
📧 Baptiste.guerin34@gmail.com
Related Skills
node-connect
344.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
96.8kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
344.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
344.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
