Aller au contenu

VIII) Le module Pyxel

1) Présentation de Pyxel


a) Pourquoi Pyxel

Le module pyxel a été conçu pour permettre de programmer des jeux rétro.

Volontairement, on a choisi de rendre minimales les possibilités graphiques. Il y a ainsi uniquement 16 couleurs, ainsi qu'une zone graphique petite. On veut se mettre dans les mêmes conditions matérielles qu'à l'époque des premiers jeux : Tetris, Pong, Pacman, ...

Vous pouvez consulter la documentation du module pyxel.

b) Comment l'installer

  • Depuis Thonny, se rendre dans "Outils ---> Gérer les paquets".
  • Rechercher le paquet "pyxel" et installer le.

c) L'utiliser en ligne

  • Sans aucune installation, le site pyxelstudio.net vous permettra de créer des projets, de les exécuter et de les partager.
  • Vous pouvez aussi découvrir des projets existants.

2) Quelques repères pour débuter


a) Les couleurs

Il n'y a a que 16 couleurs par défaut.

Palette de couleurs

Ainsi, l'instruction pyxel.cls(0) remplira l'écran de la couleur 0, c'est-à-dire de noir.

b) Se positionner

Le système de coordonnées (x,y) dans Pyxel a :

  • pour centre : le coin en haut à gauche de la fenêtre ;
  • pour axe des abscisses : le bord haut de la fenêtre ;
  • pour axe des ordonnées : le bord gauche de la fenêtre, cet axe étant dirigé vers le bas.

Ainsi, voici les cordonnées des 4 angles de la fenêtre :

  • en haut à gauche : (0,0) ;
  • en haut à droite : (width,0) ;
  • en bas à gauche : (0,height) ;
  • en bas à droite : (width,height).

De même, l'instruction pyxel.rect(x, y, w, h, col) utilise le point (x,y) comme le coin haut gauche du rectangle à tracer.

c) Utiliser des variables globales

Il est important de déclarer des variables globales pour ensuite pouvoir y accéder dans toutes les fonctions, sans oublier le mot-clef global.

3) Utiliser les dictionnaires

En terminale, vous allez utiliser la programmation objet. Mais pour l'instant, l'usage des dictionnaires peut faciliter la compréhension et l'utilisation de votre code.

L'idée est de regrouper dans un dictionnaire les différentes informations d'un "objet" de votre programme.

a) Un exemple de programme sans dictionnaires

Dans ce code, le vaisseau n'a pas d'existence propre dans la programmation. Il y a bien les variables vaisseau_x et vaisseau_y mais elles ne sont pas reliées entre elles.

import pyxel

# taille de la fenetre 128x128 pixels
# ne pas modifier
pyxel.init(128, 128, title="Nuit du c0de")

# position initiale du vaisseau
# (origine des positions : coin haut gauche)
vaisseau_x = 60
vaisseau_y = 60

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


# =========================================================
# == UPDATE
# =========================================================
def update():
    """mise à jour des variables (30 fois par seconde)"""

    global vaisseau_x, vaisseau_y

    # mise à jour de la position du vaisseau
    vaisseau_x, vaisseau_y = vaisseau_deplacement(vaisseau_x, vaisseau_y)


# =========================================================
# == DRAW
# =========================================================
def draw():
    """création des objets (30 fois par seconde)"""

    # vide la fenetre
    pyxel.cls(0)

    # vaisseau (carre 8x8)
    pyxel.rect(vaisseau_x, vaisseau_y, 8, 8, 2)


pyxel.run(update, draw)

b) Sa traduction avec les dictionnaires

Cette fois-ci, le dictionnaire vaisseau est créé et peut contenir autant d'informations que l'on veut, bien concentrées à un seul endroit.

import pyxel

# taille de la fenetre 128x128 pixels
# ne pas modifier
pyxel.init(128, 128, title="Nuit du c0de")

# une seule variable globale de type dict pour tout stocker sur le vaisseau
vaisseau = dict()
vaisseau["x"] = 60
vaisseau["y"] = 60
vaisseau["largeur"] = 8
vaisseau["hauteur"] = 8
vaisseau["couleur"] = 2



def maj_vaisseau(v) :
    """déplacement avec les touches de directions"""

    x = v["x"]
    y = v["y"]

    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

    v["x"] = x
    v["y"] = y


def dessiner_vaisseau(v) :
    """ dessine le vaisseau """
    pyxel.rect(v["x"], v["y"], v["largeur"], v["hauteur"], v["couleur"])


# =========================================================
# == UPDATE
# =========================================================
def update():
    """mise à jour des variables (30 fois par seconde)"""

    maj_vaisseau(vaisseau)


# =========================================================
# == DRAW
# =========================================================
def draw():
    """création des objets (30 fois par seconde)"""

    # vide la fenetre
    pyxel.cls(0)

    dessiner_vaisseau(vaisseau)


pyxel.run(update, draw)