[ English | 中文 | Deutsch | Español | Français | Italiano | 日本語 | 한국어 | Português | Русский | Türkçe | Українська ]
Pyxel est un moteur de jeu vidéo rétro pour Python.
Grâce à ses spécifications simples inspirées par les consoles rétro, comme le fait que seulement 16 couleurs peuvent être affichées et que seulement 4 sons peuvent être lus en même temps, vous pouvez vous sentir libre de créer des jeux vidéo dans le style pixel art.
La motivation pour le développement de Pyxel est le feedback des utilisateurs. Veuillez donner une étoile à Pyxel sur GitHub !
Les spécifications et les API de Pyxel sont inspirées de PICO-8 et TIC-80.
Pyxel est un logiciel libre sous la licence MIT et son utilisation est gratuite. Commençons à faire un jeu vidéo rétro avec Pyxel !
- Fonctionne sur Windows, Mac, Linux et Web
- Programmation en Python
- Palette de 16 couleurs
- 3 banques d'images de taille 256x256
- 8 cartes de tuiles de taille 256x256
- 4 canaux avec 64 sons définissables
- 8 pistes musicales pouvant combiner n'importe quels sons
- Entrées par clavier, souris et manette de jeu
- Éditeur d'images et de sons
- Extension des couleurs, canaux et banques par l'utilisateur
Après avoir installé Python3 (version 3.8 ou plus), lancez la commande suivante :
pip install -U pyxel
Si vous installez Python à l'aide de l'installateur officiel, veuillez cocher la case Add Python 3.x to PATH
pour activer la commande pyxel
.
Après avoir installé Homebrew, exécutez les commandes suivantes :
brew install pipx
pipx ensurepath
pipx install pyxel
Pour mettre à jour la version après avoir installé Pyxel, exécutez pipx upgrade pyxel
.
Après avoir installé le paquet SDL2 (libsdl2-dev
pour Ubuntu), Python3 (version 3.8 ou plus), et python3-pip
, lancez la commande suivante :
sudo pip3 install -U pyxel
Si ce qui précède ne fonctionne pas, essayez l'autoconstruction en suivant les instructions de Makefile.
La version web de Pyxel ne nécessite pas d'installation de Python ou de Pyxel et fonctionne aussi bien sur les PC que sur les smartphones et tablettes avec des navigateurs web pris en charge.
Pour des instructions spécifiques, veuillez vous référer à cette page.
Après l’installation de Pyxel, les exemples de Pyxel seront copiés dans le répertoire courant avec la commande suivante :
pyxel copy_examples
Les exemples copiés sont les suivants :
01_hello_pyxel.py | Application simple | Demo | Code |
02_jump_game.py | Jeu de saut avec les fichiers de ressources Pyxel | Demo | Code |
03_draw_api.py | Démonstration de l’API de dessin | Demo | Code |
04_sound_api.py | Démonstration de l’API de son | Demo | Code |
05_color_palette.py | Liste des couleurs de la palette | Demo | Code |
06_click_game.py | Jeu de type pointer et cliquer | Demo | Code |
07_snake.py | Jeu du Snake avec une bande son | Demo | Code |
08_triangle_api.py | Démonstration de l’API de dessin de triangle | Demo | Code |
09_shooter.py | Jeu de shoot'em up avec changement d’écran | Demo | Code |
10_platformer.py | Jeu de plateforme avec défilement horizontal et une carte | Demo | Code |
11_offscreen.py | Rendu hors écran avec la classe Image | Demo | Code |
12_perlin_noise.py | Animation du bruit de Perlin | Demo | Code |
13_bitmap_font.py | Dessiner une police bitmap | Demo | Code |
14_synthesizer.py | Synthétiseur utilisant des fonctions d'expansion audio | Demo | Code |
15_tiled_map_file.py | Chargement et dessin d'un fichier de carte carrelée (.tmx) | Demo | Code |
16_transform.py | Rotation et mise à l'échelle de l'image | Demo | Code |
99_flip_animation.py | Animation avec la fonction flip (plateformes non-web uniquement) | Demo | Code |
30sec_of_daylight.pyxapp | 1er jeu gagnant du Pyxel Jam par Adam | Demo | Code |
megaball.pyxapp | Jeu physique de balles d'arcade par Adam | Demo | Code |
8bit-bgm-gen.pyxapp | Générateur de musique de fond fait par frenchbread | Demo | Code |
Les exemples peuvent être lancés avec les commandes suivantes :
cd pyxel_examples
pyxel run 01_hello_pyxel.py
pyxel play 30sec_of_daylight.pyxapp
Après avoir importé le module Pyxel dans votre script Python, spécifiez d’abord la taille de la fenêtre avec la fonction init
, puis lancez l’application Pyxel avec la fonction run
.
import pyxel
pyxel.init(160, 120)
def update():
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit()
def draw():
pyxel.cls(0)
pyxel.rect(10, 10, 20, 20, 11)
pyxel.run(update, draw)
Les arguments de la fonction run
sont la fonction update
pour mettre à jour chaque frame et la fonction draw
pour dessiner sur l’écran quand c’est nécessaire.
Dans une vraie application, il est recommandé de mettre le code Pyxel dans une classe comme ci-dessous :
import pyxel
class App:
def __init__(self):
pyxel.init(160, 120)
self.x = 0
pyxel.run(self.update, self.draw)
def update(self):
self.x = (self.x + 1) % pyxel.width
def draw(self):
pyxel.cls(0)
pyxel.rect(self.x, 0, 8, 8, 9)
App()
Lors de la création de graphiques simples sans animation, la fonction show
peut être utilisée pour rendre le code plus concis.
import pyxel
pyxel.init(120, 120)
pyxel.cls(1)
pyxel.circb(60, 60, 40, 7)
pyxel.show()
Un script Python créé peut être exécuté à l'aide de la commande python
:
python PYTHON_SCRIPT_FILE
Il peut également être exécuté avec la commande pyxel run
:
pyxel run PYTHON_SCRIPT_FILE
De plus, la commande pyxel watch
permet de surveiller les changements dans un répertoire spécifié, et de relancer automatiquement le programme lorsque des changements sont détectés :
pyxel watch WATCH_DIR PYTHON_SCRIPT_FILE
La surveillance des répertoires peut être arrêtée en appuyant sur Ctrl(Command)+C
.
Les contrôles spéciaux suivants peuvent être lancés pendant qu’une application Pyxel tourne :
Esc
Quitte l’applicationAlt(Option)+1
Sauvegarde la capture d’écran sur le bureauAlt(Option)+2
Réinitialise le temps de départ de la capture vidéoAlt(Option)+3
Sauvegarde la capture d’écran sur le bureau (jusqu’à 10 secondes)Alt(Option)+9
Passer d'un mode d'écran à l'autre (Crisp, Smooth, Retro)Alt(Option)+0
Bascule vers le moniteur de performance (fps, temps de mise à jour et temps de dessin)Alt(Option)+Enter
Met en plein écranShift+Alt(Option)+1/2/3
Enregistrer la banque d'images correspondante sur le bureauShift+Alt(Option)+0
Enregistrer la palette de couleurs actuelle sur le bureau
L’éditeur Pyxel peut créer des images et des sons utilisables dans des applications Pyxel.
Il se lance avec la commande suivante :
pyxel edit PYXEL_RESOURCE_FILE
Si le fichier de ressource Pyxel (.pyxres) existe déjà, le fichier est chargé, sinon, un nouveau fichier avec le nom indiqué est créé. Si le fichier de ressource n’est pas spécifié, le nom est my_resource.pyxres
.
Après avoir lancé l’éditeur Pyxel, le fichier peut être changé en glissant-dépossant un autre fichier de ressource.
La ressource créée peut être chargée avec la fonction load
.
L’éditeur Pyxel a les modes suivants.
**Éditeur d’images **
Mode pour éditer les banques d’images.
Glisser-déposer un fichier image (PNG/GIF/JPEG) dans l'éditeur d'images pour charger l'image dans la banque d'images actuellement sélectionnée.
**Éditeur de tilemap **
Mode pour éditer les tilemaps, dans lesquelles les images des banques d’images sont ordonnées en motifs de tuiles.
Glisser-déposer un fichier TMX (Tiled Map File) dans l'éditeur de mosaïques pour charger sa couche dans l'ordre de dessin correspondant au numéro de la mosaïque sélectionnée.
**Éditeur de sons **
Mode pour éditer les sons.
**Éditeur de musiques **
Mode pour éditer les musiques dans lesquelles les sons sont ordonnés par ordre de lecture.
Les images et tilemaps Pyxel peuvent être aussi créées avec les méthodes suivantes :
- Créer une image depuis une liste de chaînes de caractères avec la fonction
Image.set
ou la fonctionTilemap.set
- Charger une image (PNG/GIF/JPEG) dans la palette Pyxel avec la fonction
Image.load
Les sons Pyxel peuvent aussi être créés avec la méthode suivante :
- Créer un son à partir d’une chaîne de caractères avec la fonction
Sound.set
ou la fonctionMusic.set
Référez vous à la documentation de l’API pour l’utilisation de ces fonctions.
Pyxels a un format de fichier spécifique (fichier d’application Pyxel) qui fonctionne sur les différentes plateformes.
Créez le fichier d'application Pyxel (.pyxapp) avec la commande pyxel package
:
pyxel package APP_DIR STARTUP_SCRIPT_FILE
Si l'application doit inclure des ressources ou des modules supplémentaires, placez-les dans le répertoire de l'application.
Les métadonnées peuvent être affichées au moment de l'exécution en les spécifiant dans le format suivant dans le script de démarrage. Les champs autres que title
et author
peuvent être omis.
# title: Pyxel Platformer
# author: Takashi Kitao
# desc: A Pyxel platformer example
# site: https://github.com/kitao/pyxel
# license: MIT
# version: 1.0
Le fichier d'application créé peut être exécuté avec la commande pyxel play
:
pyxel play PYXEL_APP_FILE
Le fichier d'application Pyxel peut aussi être converti en un exécutable ou un fichier HTML avec les commandes pyxel app2exe
ou pyxel app2html
.
-
width
,height
La largeur et la hauteur de l’écran -
frame_count
Le nombre de frames passées -
init(width, height, [title], [fps], [quit_key], [display_scale], [capture_scale], [capture_sec])
Initialise l’application Pyxel avec un écran de taille (width
,height
). Il est possible de passer comme options : le titre de la fenêtre avectitle
, le nombre d’images par seconde avecfps
, la touche pour quitter l’application avecquit_key
, l'échelle de l'affichage avecdisplay_scale
, l’échelle des captures d’écran aveccapture_scale
, et le temps maximum d’enregistrement vidéo aveccapture_sec
.
Par exemple :pyxel.init(160, 120, title="My Pyxel App", fps=60, quit_key=pyxel.KEY_NONE, capture_scale=3, capture_sec=0)
-
run(update, draw)
Lance l’application Pyxel et appelle la fonctionupdate
et la fonctiondraw
. -
show()
Affiche l’écran jusqu’à ce que la toucheEsc
soit appuyée. -
flip()
Rafraîchit l'écran d'une image. L'application se termine lorsque la toucheEsc
est pressée. Cette fonction ne fonctionne pas dans la version web. -
quit()
Quitte l’application Pyxel.
load(filename, [excl_images], [excl_tilemaps], [excl_sounds], [excl_musics])
Charge la ressource (.pyxres). Si une option estTrue
, la ressource ne sera pas chargée. Si un fichier de palette (.pyxpal) du même nom existe au même endroit que le fichier de ressource, la couleur d'affichage de la palette sera également modifiée. Le fichier de palette est une entrée hexadécimale des couleurs d'affichage (par exemple1100FF
), séparée par des nouvelles lignes. Le fichier de palette peut également être utilisé pour changer les couleurs affichées dans l'éditeur Pyxel.
-
mouse_x
,mouse_y
La position actuelle du curseur de la souris -
mouse_wheel
La valeur actuelle de la molette de la souris -
btn(key)
RenvoieTrue
si la touchekey
est appuyée, sinon renvoieFalse
. (liste des touches) -
btnp(key, [hold], [repeat])
RenvoieTrue
si la touchekey
est appuyée à cette frame, sinon renvoieFalse
. Quandhold
etrepeat
sont spécifiés,True
sera renvoyé à l’intervalle de framerepeat
quand la touchekey
est appuyée pendant plus dehold
frames. -
btnr(key)
RenvoieTrue
si la touchekey
est relâchée à cette frame, sinon renvoieFalse
-
mouse(visible)
Sivisible
estTrue
, affiche le curseur de la souris. SiFalse
, le curseur est caché. Même si le curseur n’est pas affiché, sa position est actualisée.
-
colors
Liste les couleurs de la palette. Les couleurs sont spécifiées avec une valeur 24-bit. Vous pouvez utilisercolors.from_list
etcolors.to_list
pour directement donner et recevoir une liste Python.
Par exempleold_colors = pyxel.colors.to_list(); pyxel.colors.from_list([0x111111, 0x222222, 0x333333]); pyxel.colors[15] = 0x112233
-
images
Liste des banques d'images (0-2). (Voir la classe Image)
Par exemplepyxel.images[0].load(0, 0, "title.png")
-
tilemaps
Liste des cartes de tuiles (0-7). (voir la classe Tilemap) -
clip(x, y, w, h)
Défini la zone de dessin (x
,y
) avec une largeurw
et une hauteurh
. Réinitialiser la zone de dessin au plein écran avecclip()
-
camera(x, y)
Change the upper left corner coordinates of the screen to (x
,y
). Reset the upper left corner coordinates to (0
,0
) withcamera()
. -
pal(col1, col2)
Remplace la couleurcol1
aveccol2
au dessin.pal()
pour réinitialiser la palette de couleurs. -
dither(alpha)
Applique le tramage (pseudo-transparence) au dessin. Fixealpha
dans l'intervalle0.0
-1.0
, où0.0
est transparent et1.0
est opaque. -
cls(col)
Efface l’écran avec la couleurcol
-
pget(x, y)
Renvoie la couleur au pixel (x
,y
). -
pset(x, y, col)
Dessine un pixel de couleurcol
à (x
,y
). -
line(x1, y1, x2, y2, col)
Dessine une ligne de couleurcol
de (x1
,y1
) à (x2
,y2
). -
rect(x, y, w, h, col)
Dessine un rectangle de largeurw
, de hauteurh
et de couleurcol
à partir de (x
,y
). -
rectb(x, y, w, h, col)
Dessine les contours d’un rectangle de largeurw
, de hauteurh
et de couleurcol
à partir de (x
,y
). -
circ(x, y, r, col)
Dessine un cercle de rayonr
et de couleurcol
à (x
,y
). -
circb(x, y, r, col)
Dessine le contour d’un cercle de rayonr
et de couleurcol
à (x
,y
). -
elli(x, y, w, h, col)
Dessinez une ellipse de largeurw
, de hauteurh
et de couleurcol
à partir de (x
,y
). -
ellib(x, y, w, h, col)
Dessinez le contour d'une ellipse de largeurw
, de hauteurh
et de couleurcol
à partir de (x
,y
). -
tri(x1, y1, x2, y2, x3, y3, col)
Dessine un triangle avec les sommets (x1
,y1
), (x2
,y2
), (x3
,y3
) et de couleurcol
-
trib(x1, y1, x2, y2, x3, y3, col)
Dessine les contours d’un triangle avec les sommets (x1
,y1
), (x2
,y2
), (x3
,y3
) et de couleurcol
-
fill(x, y, col)
Dessine une ellipse de largeurw
, de hauteurh
et de couleurcol
à partir de (x
,y
). -
blt(x, y, img, u, v, w, h, [colkey], [rotate], [scale])
Copie la région de taille (w
,h
) de (u
,v
) de la banque d’imageimg
(0-2) à (x
,y
). Si une valeur négative est mise pourw
(ouh
), la copie sera inversée horizontalement (ou verticalement). Sicolkey
est spécifiée, elle sera traitée comme une couleur transparente. Sirotate
(en degrés),scale
(1.0=100%), ou les deux sont spécifiés, la transformation correspondante sera appliquée.
bltm(x, y, tm, u, v, w, h, [colkey], [rotate], [scale])
Copie la région de taille (w
,h
) de (u
,v
) de la tilemaptm
(0-7) à (x
,y
). Si une valeur négative est mise pourw
(ouh
), la copie sera inversée horizontalement (ou verticalement). Sicolkey
est spécifiée, elle sera traitée comme une couleur transparente. Sirotate
(en degrés),scale
(1.0=100%), ou les deux sont spécifiés, la transformation correspondante sera appliquée. La taille d’une tuile est 8x8 pixels et elle est storée dans une tilemap en tant que paire(tile_x, tile_y)
.
text(x, y, s, col)
Dessine une chaîne de caractèress
de couleurcol
à (x
,y
).
-
sounds
Liste des sons (0-63). (voir la classe Sound)
par exemple :pyxel.sounds[0].speed = 60
-
musics
Liste des musiques (0-7). (voir la classe Music) -
play(ch, snd, [tick], [loop], [resume])
Joue le sonsnd
(0-63) sur le canalch
(0-3). Sisnd
est une liste, les sons seront joués dans l’ordre. La position de début de lecture peut être spécifiée partick
(1 tick = 1/120 secondes). Siloop
est àTrue
, le son est joué en boucle. Pour reprendre le son précédent après la fin de la lecture, définissezresume
surTrue
. -
playm(msc, [tick], [loop])
Joue la musiquemsc
(0-7). La position de début de lecture peut être spécifiée partick
(1 tick = 1/120 secondes). Siloop
est mis àTrue
, la musique est joué en boucle. -
stop([ch])
Arrête le son du canal spécifiéch
(0-3).stop()
arrête tous les canaux. -
play_pos(ch)
Récupère la position du son du canalch
(0-3) comme un tuple(sound_no, note_no)
. RenvoieNone
quand le son est arrêté.
-
ceil(x)
Renvoie le plus petit nombre entier supérieur ou égal àx
. -
floor(x)
Renvoie le plus grand nombre entier inférieur ou égal àx
. -
sgn(x)
Renvoie1
lorsquex
est positif,0
lorsqu'il est0
et-1
lorsqu'il est négatif. -
sqrt(x)
Renvoie la racine carrée dex
. -
sin(deg)
Renvoie le sinus dedeg
degrés. -
cos(deg)
Renvoie le cosinus dedeg
degrés. -
atan2(y, x)
Retourne l'arctangente dey
/x
en degrés. -
rseed(seed)
Définit la graine du générateur de nombres aléatoires. -
rndi(a, b)
Renvoie un nombre entier aléatoire supérieur ou égal àa
et inférieur ou égal àb
. -
rndf(a, b)
Renvoie une décimale aléatoire supérieure ou égale àa
et inférieure ou égale àb
. -
nseed(seed)
Définit la graine du bruit de Perlin. -
noise(x, [y], [z])
Renvoie la valeur du bruit de Perlin pour les coordonnées spécifiées.
-
width
,height
La largeur et la hauteur d’une image -
set(x, y, data)
Met la valeur de l’image à (x
,y
) suivant une liste de chaînes.
Par exemplepyxel.images[0].set(10, 10, ["0123", "4567", "89ab", "cdef"])
-
load(x, y, filename)
Charge l’image (PNG/GIF/JPEG) à (x
,y
). -
pget(x, y)
Renvoie la couleur au pixel (x
,y
). -
pset(x, y, col)
Dessine un pixel de couleurcol
à (x
,y
).
-
width
,height
La largeur et la hauteur de la tilemap -
imgsrc
La banque d’image (0-2) référencée par la tilemap -
set(x, y, data)
Met la tilemap à (x
,y
) suivant une liste de chaînes.
Par exemplepyxel.tilemap(0).set(0, 0, ["0000 0100 a0b0", "0001 0101 a1b1"])
-
load(x, y, filename, layer)
Chargez la couche dans l'ordre de dessincouche
(0-) à partir du fichier TMX (Tiled Map File) à (x
,y
). -
pget(x, y)
Renvoie la tile à (x
,y
). Une tile est un tuple(tile_x, tile_y)
. -
pset(x, y, tile)
Dessine unetile
à (x
,y
). Une tile est un tuple(tile_x, tile_y)
.
-
notes
Liste des notes (0-127). Plus le nombre est haut, plus la note est haute, et à33
ça devient 'A2' (440Hz). Le reste est à-1
. -
tones
Liste les tons (0:Triangle / 1:Square / 2:Pulse / 3:Noise) -
volumes
Liste les volumes (0-7) -
effects
Liste les effets (0:None / 1:Slide / 2:Vibrato / 3:FadeOut / 4:Half-FadeOut / 5:Quarter-FadeOut) -
speed
Vitesse de lecture. 1 est le plus rapide, et plus le nombre est grand, plus la vitesse est lente. à 120, la longueur d’une note est de 1 second. -
set(notes, tones, volumes, effects, speed)
Met les valeurs de notes, tones, volumes et effects avec une chaîne. Si les tons, volumes et effets sont plus courts que les notes, ils sont répétés depuis le début. -
set_notes(notes)
Met les notes avec une chaîne de 'CDEFGAB'+'#-'+'01234' ou 'R'. Insensible à la casse et les espaces sont ignorés.
Par exemplepyxel.sounds[0].set_notes("G2B-2D3R RF3F3F3")
-
set_tones(tones)
Met les tons avec une chaîne de 'TSPN'. Insensible à la casse et les espaces sont ignorés.
Par exemplepyxel.sounds[0].set_tones("TTSS PPPN")
-
set_volumes(volumes)
Met les volumes avec une chaîne de '01234567'. Insensible à la casse et les espaces sont ignorés.
Par exemplepyxel.sounds[0].set_volumes("7777 7531")
-
set_effects(effects)
Met les effets avec une chaîne de 'NSVFHQ'. Insensible à la casse et les espaces sont ignorés.
Par exemplepyxel.sounds[0].set_effects("NFNF NVVS")
-
seqs
Liste bidimensionnelle de sons (0-63) avec le nombre de canaux -
set(seq0, seq1, seq2, ...)
Régler les listes de sons (0-63) des canaux. Si une liste vide est passée, ce canal n’est pas utilisé.
Par exemplepyxel.musics[0].set([0, 1], [], [3])
Pyxel a une "API avancée" qui n’est pas présentée ici car elle peut porter à confusion ou qu’elle nécessite des connaissances spécifiques pour être utilisée.
Si vous savez ce que vous faîtes, essayez de créer des applications incroyables avec ceci comme indice !
Utilisez l’outil de suivi de tickets pour signaler des bugs et demander des nouvelles fonctionnalités ou des améliorations. Avant d’ouvrir un nouveau ticket, regardez si un similaire n’a pas déjà été ouvert.
Toutes les personnes testant le code et rapportant des bugs ou des suggestions d’améliorations dans l’outil de suivi de tickets sont les bienvenues!
Les correctifs sont acceptés sous forme de pull requests (PRs). Faites attention à ce que le ticket que la pull request corrige soit toujours ouvert.
La demande de tirage soumise est réputée acceptée pour publication sous la Licence MIT.
Pyxel est sous Licence MIT. Il peut être réutilisé dans un logiciel propriétaire, à condition que toutes les copies du logiciel ou de ses parties substantielles incluent une copie des termes de la licence MIT ainsi qu'un avis de droit d'auteur.
Pyxel recherche des sponsors sur GitHub Sponsors. Envisagez de parrainer Pyxel pour une maintenance continue et des ajouts de fonctionnalités. Les sponsors peuvent consulter sur Pyxel comme un avantage. Veuillez voir ici pour plus de détails.