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

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)

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)

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)

Le sprite est collé sur le fond noir de la fenêtre avec la méthode blt()



Pour se faire plaisir, la suite : un snake