Utiliser la bibliothèque PYXEL
La bibliothèque Pyxel est une alternative à Pygame qui permet de créer des jeux et apps de type "rétro".
Le site officiel est ici pyxel .
Installer Pyxel
Pré-requis : python3 + un éditeur python
(voir
page python).
Installer le paquet pyxel via pip en ligne de commande :
Sous linux (Debian/Ubuntu) :
D'abord installer le paquet SDL2.
sudo apt update
sudo apt install libsdl2-dev
python3 -m pip install pyxel
Si besoin, mettre à jour le module pip :
python3 -m pip install --upgrade pip
Sous Mac :
python3 -m pip install -U pyxel
Sous Windows :
pip install -U pyxel
sudo apt update
sudo apt install libsdl2-dev
python3 -m pip install pyxel
sudo apt install libsdl2-dev
python3 -m pip install pyxel
python3 -m pip install -U pyxel
pip install -U pyxel
Apprendre à programmer
Ressources
La documentation officielle est ici documentation pyxel .
Par ailleurs, sur le site de la Nuit du C0de, il y a plein de tutos pour apprendre.
L'ensemble des commandes est donné ici : mémo_commandes.
Pour récupérer une grande quatité d'exemples, on peut saisir dans un terminal :
pyxel copy_examples
Structure d'un jeu pyxel
Un jeu pyxel est composé de deux fichiers : un code exemple.py et un fichier de ressources
mes_sprites.pyxres.
Ce dernier permet d'éditer, de créer et de modifier les données graphiques et musicales du jeu. Il contient :
- Les sprites pixellisés, découpés en tuiles
- Les maps (ou tilemaps) pixellisées
- Les pistes de musique
1er exemple : un carré clignotant !
1er_exemple.py
Ce code va afficher un rectangle qui change de couleur à chaque seconde. Dans un code pyxel il y aura
toujours :
- Une fonction update qui correspond aux mises à jour des éléments.
- Une fonction draw qui créer une des images du jeu
- Un pyxel.run(update, draw) à la fin du code, pour démarrer ces fonctions
import pyxel
pyxel.init(160, 120) # création de la fenêtre
# déclaration des variables globales
COULEUR = 8
def update(): # update à 30 images/s par défaut
global COULEUR
# touche Q pour quitter
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit()
# frame_count contient le numéro de l'image en cours :
# si multiple de 30 (donc 1s), change la couleur
if pyxel.frame_count % 30 ==0:
if COULEUR == 8:
COULEUR = 11
else:
COULEUR = 8
def draw():
global COULEUR
pyxel.cls(0) # fond noir
pyxel.rect(10, 10, 20, 20, COULEUR) # rectangle (x, y) (cote_a, cote_b)
pyxel.run(update, draw)
import pyxel
pyxel.init(160, 120) # création de la fenêtre
# déclaration des variables globales
COULEUR = 8
def update(): # update à 30 images/s par défaut
global COULEUR
# touche Q pour quitter
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit()
# frame_count contient le numéro de l'image en cours :
# si multiple de 30 (donc 1s), change la couleur
if pyxel.frame_count % 30 ==0:
if COULEUR == 8:
COULEUR = 11
else:
COULEUR = 8
def draw():
global COULEUR
pyxel.cls(0) # fond noir
pyxel.rect(10, 10, 20, 20, COULEUR) # rectangle (x, y) (cote_a, cote_b)
pyxel.run(update, draw)

2nd exemple : un carré qui se déplace !
2nd_exemple.py
Ce code va afficher un carré qui se déplace et qui tire, un prototype de Space Invaders !
(tiré du tutoriel de base de la
nuit du c0de)
import pyxel
pyxel.init(128, 128, title="Carré en déplacement")
vaisseau_x = 60 # position initiale du vaisseau
vaisseau_y = 60
tirs_liste = [] # initialisation des tirs
def vaisseau_deplacement(x, y):
"""déplacement avec les touches de directions"""
if pyxel.btn(pyxel.KEY_RIGHT):
if (x < 120) :
x = x + 1
if pyxel.btn(pyxel.KEY_LEFT):
if (x > 0) :
x = x - 1
if pyxel.btn(pyxel.KEY_DOWN):
if (y < 120) :
y = y + 1
if pyxel.btn(pyxel.KEY_UP):
if (y > 0) :
y = y - 1
return x, y
def tirs_creation(x, y, tirs_liste):
"""création d'un tir avec la barre d'espace"""
if pyxel.btnr(pyxel.KEY_SPACE):
tirs_liste.append([x+4, y-4]) # +4/-4 pour éviter les tirs multiples
return tirs_liste
def tirs_deplacement(tirs_liste):
"""déplacement des tirs vers le haut et suppression s'ils sortent du cadre"""
for tir in tirs_liste:
tir[1] -= 1
if tir[1]<-8:
tirs_liste.remove(tir)
return tirs_liste
def update():
global vaisseau_x, vaisseau_y, tirs_liste
# mise à jour de la position du vaisseau
vaisseau_x, vaisseau_y = vaisseau_deplacement(vaisseau_x, vaisseau_y)
# creation des tirs en fonction de la position du vaisseau
tirs_liste = tirs_creation(vaisseau_x, vaisseau_y, tirs_liste)
# mise a jour des positions des tirs
tirs_liste = tirs_deplacement(tirs_liste)
def draw():
pyxel.cls(0) # vide la fenêtre, fond noir
pyxel.rect(vaisseau_x, vaisseau_y, 8, 8, 1) # crée un vaisseau carré
# tirs
for tir in tirs_liste:
pyxel.rect(tir[0], tir[1], 1, 4, 10)
pyxel.run(update, draw)
import pyxel
pyxel.init(128, 128, title="Carré en déplacement")
vaisseau_x = 60 # position initiale du vaisseau
vaisseau_y = 60
tirs_liste = [] # initialisation des tirs
def vaisseau_deplacement(x, y):
"""déplacement avec les touches de directions"""
if pyxel.btn(pyxel.KEY_RIGHT):
if (x < 120) :
x = x + 1
if pyxel.btn(pyxel.KEY_LEFT):
if (x > 0) :
x = x - 1
if pyxel.btn(pyxel.KEY_DOWN):
if (y < 120) :
y = y + 1
if pyxel.btn(pyxel.KEY_UP):
if (y > 0) :
y = y - 1
return x, y
def tirs_creation(x, y, tirs_liste):
"""création d'un tir avec la barre d'espace"""
if pyxel.btnr(pyxel.KEY_SPACE):
tirs_liste.append([x+4, y-4]) # +4/-4 pour éviter les tirs multiples
return tirs_liste
def tirs_deplacement(tirs_liste):
"""déplacement des tirs vers le haut et suppression s'ils sortent du cadre"""
for tir in tirs_liste:
tir[1] -= 1
if tir[1]<-8:
tirs_liste.remove(tir)
return tirs_liste
def update():
global vaisseau_x, vaisseau_y, tirs_liste
# mise à jour de la position du vaisseau
vaisseau_x, vaisseau_y = vaisseau_deplacement(vaisseau_x, vaisseau_y)
# creation des tirs en fonction de la position du vaisseau
tirs_liste = tirs_creation(vaisseau_x, vaisseau_y, tirs_liste)
# mise a jour des positions des tirs
tirs_liste = tirs_deplacement(tirs_liste)
def draw():
pyxel.cls(0) # vide la fenêtre, fond noir
pyxel.rect(vaisseau_x, vaisseau_y, 8, 8, 1) # crée un vaisseau carré
# tirs
for tir in tirs_liste:
pyxel.rect(tir[0], tir[1], 1, 4, 10)
pyxel.run(update, draw)

3ème exemple : un sprite qui se déplace
3eme_exemple.py
Ce code va afficher cette fois-ci un sprite qui se déplace en utilisant le fichier ressources sprites.pyxres
Pour éditer les ressources, on saisit dans un terminal :
pyxel edit sprites.pyxres

import pyxel
pyxel.init(128, 128, title="Carré en déplacement")
vaisseau_x = 60
vaisseau_y = 60
pyxel.load("sprites.pyxres") # chargement de l'image
pyxel.image(0).rect(16, 16, 8, 8, 0)
def vaisseau_deplacement(x, y):
"""déplacement avec les touches de directions"""
if pyxel.btn(pyxel.KEY_RIGHT):
if (x < 120) :
x = x + 1
if pyxel.btn(pyxel.KEY_LEFT):
if (x > 0) :
x = x - 1
if pyxel.btn(pyxel.KEY_DOWN):
if (y < 120) :
y = y + 1
if pyxel.btn(pyxel.KEY_UP):
if (y > 0) :
y = y - 1
return x, y
def update():
global vaisseau_x, vaisseau_y, tirs_liste
vaisseau_x, vaisseau_y = vaisseau_deplacement(vaisseau_x, vaisseau_y)
def draw():
pyxel.cls(0)
# image du vaisseau
pyxel.blt(vaisseau_x, vaisseau_y, 0, 0, 8, 8, 8, 0)
pyxel.run(update, draw)
import pyxel
pyxel.init(128, 128, title="Carré en déplacement")
vaisseau_x = 60
vaisseau_y = 60
pyxel.load("sprites.pyxres") # chargement de l'image
pyxel.image(0).rect(16, 16, 8, 8, 0)
def vaisseau_deplacement(x, y):
"""déplacement avec les touches de directions"""
if pyxel.btn(pyxel.KEY_RIGHT):
if (x < 120) :
x = x + 1
if pyxel.btn(pyxel.KEY_LEFT):
if (x > 0) :
x = x - 1
if pyxel.btn(pyxel.KEY_DOWN):
if (y < 120) :
y = y + 1
if pyxel.btn(pyxel.KEY_UP):
if (y > 0) :
y = y - 1
return x, y
def update():
global vaisseau_x, vaisseau_y, tirs_liste
vaisseau_x, vaisseau_y = vaisseau_deplacement(vaisseau_x, vaisseau_y)
def draw():
pyxel.cls(0)
# image du vaisseau
pyxel.blt(vaisseau_x, vaisseau_y, 0, 0, 8, 8, 8, 0)
pyxel.run(update, draw)
Le sprite est collé sur le fond noir de la fenêtre avec la méthode blt()

