Sprites et rendu
Pyxen effectue le rendu de votre jeu à l’aide d’un moteur 2D basé sur Metal. Tout ce qui est visible à l’écran est une entity possédant un component Sprite.
Sprites
Un sprite indique au moteur ce qu’il doit dessiner pour une entity. Vous en créez un en référençant une image de votre projet :
player = world.spawn(sprite=Sprite("hero"))
La chaîne "hero" fait référence à une image nommée hero dans les assets de votre projet.
Feuilles de tiles
La plupart des jeux utilisent des feuilles de tiles (tile sheets) — une image unique contenant plusieurs frames ou tiles arrangées en grille. Vous sélectionnez une région de l’image avec le paramètre tile :
Sprite("characters", tile=(0, 0, 16, 16)) # première tile
Sprite("characters", tile=(16, 0, 16, 16)) # deuxième tile
Sprite("characters", tile=(0, 16, 16, 16)) # tile sur la deuxième ligne
Les quatre valeurs sont (x, y, largeur, hauteur) en pixels, mesurées depuis le coin supérieur gauche de l’image.
Animations de sprites
Si vous créez des animations nommées dans l’éditeur de sprites, vous pouvez les jouer directement :
player = world.spawn(
sprite=Sprite("hero", animation="walk"),
x=100, y=50
)
Le moteur lit la séquence de frames et le FPS depuis les métadonnées du sprite et avance les frames automatiquement. Pour changer d’animation, assignez un nouveau sprite :
player.sprite = Sprite("hero", animation="jump")
Pour les animations à lecture unique (comme une attaque ou une mort), définissez loop=False et vérifiez quand elle se termine :
player.sprite = Sprite("hero", animation="attack", loop=False)
def update():
if player.animation and player.animation.finished:
player.sprite = Sprite("hero", animation="idle")
Le composant e.animation vous donne un accès en lecture seule à l’état courant : .name, .frame, .playing, .finished. Consultez la référence Entity pour plus de détails.
Vous pouvez aussi animer manuellement en changeant la tile à chaque frame :
def update():
frame = time.frame % 4
player.sprite = Sprite("hero", tile=(frame * 16, 0, 16, 16))
Point de pivot
Par défaut, un sprite est dessiné depuis son coin supérieur gauche. Vous pouvez modifier le point de pivot pour contrôler où le sprite est ancré :
Sprite("hero", tile=(0, 0, 16, 16), pivot=(8, 8))
Cela centre le sprite sur la position de l’entity. Le pivot est exprimé en coordonnées pixel relatives à la tile. Placer le pivot au centre de la tile est le choix le plus courant — cela rend la rotation et la mise à l’échelle intuitives.
Teinte de couleur
Vous pouvez teinter le sprite de n’importe quelle entity en définissant sa couleur :
player.color = (1.0, 0.5, 0.5, 1.0) # teinte rougeâtre
La couleur est un tuple RGBA avec des valeurs de 0.0 à 1.0. Le blanc (1, 1, 1, 1) signifie aucune teinte. Vous pouvez utiliser le canal alpha pour la transparence :
ghost.color = (1, 1, 1, 0.5) # 50% transparent
Vous pouvez aussi animer la couleur et l’alpha avec des tweens :
ghost.tween("alpha", to=0, duration=0.5, ease="out_quad") # fondu
Caméra
La caméra contrôle quelle partie du monde est visible. Créez-en une en générant une entity avec un component Camera :
cam = world.spawn(camera=Camera(), x=160, y=90)
Déplacez la caméra pour suivre le joueur :
def update():
cam.x = player.x
cam.y = player.y
La caméra prend en charge le zoom :
cam.camera.zoom = 2.0 # zoom x2
Vous pouvez animer le zoom avec un tween :
cam.tween("zoom", to=2.0, duration=0.5, ease="out_quad")
Résolution
Les jeux Pyxen s’exécutent à une résolution par défaut de 320x180 pixels. C’est un choix délibéré — la basse résolution rend le pixel art net et le rendu rapide. Le moteur adapte la sortie pour remplir l’écran.
Ordre de dessin
Les entités sont dessinées dans cet ordre :
- Layer — les layers inférieures sont dessinées en premier (layer 0 derrière layer 1)
- Profondeur — au sein d’une layer, déterminée par la position dans le scene graph
- Les entités sans sprite ne sont pas dessinées mais existent toujours dans le monde
Consultez Scene Graph pour en savoir plus sur les layers et la profondeur.