On souhaite pouvoir stoker le niveau dans un fichier texte. Le contenu du niveau est défini par la position des plateformes et des récompenses.
On pourrait donc adopter ce choix :
PLATEFORME,0,10,800,50 PLATEFORME,100,60,200,10 PLATEFORME,250,110,200,10 PLATEFORME,440,160,200,10 COIN,300,20,dollar COIN,150,70,dollar
C'est un simple fichier csv. On convient qu'une ligne dont le premier élément est PLATEFORME décrit une plateforme et que les 4 nombres suivants doivent décrire la position de la plateforme.
Par exemple : PLATEFORME,100,60,200,10 indique une plateforme avec le bord gauche à 100 pixels du bord gauche du niveau ; le bord bas à 60 pixels du bas ; une largeur de 200 et une hauteur de 10.
Principe identique pour les récompenses.
Cette façon de procéder est très souple mais elle a un gros défaut : on a beaucoup de mal à se représenter ce que sera le niveau…
Je propose donc une 2e solution plus imagée.
On produit un fichier texte dont chaque caractère représente un élément à l'écran.
D D
D D D D D D D
PPPPPPPPPPPPPP PPPPPPPPPPPPPP
D D D
PPPP PPPP PPPPPP PPPPPPPPP PPPP
D D
PPPPPP PPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
Dans ce code un P représente une plateforme, un D un dollar.
Cette façon de faire est beaucoup moins souple que la précédente. On n'est pas libre de mettre une plateforme exactement où on veut. Si on veut des plateformes de types différents, il faudra utiliser des lettres différentes, ce qui complique… En revanche, c'est très rapide de faire un niveau.
Rien n'empêche de mélanger les deux approches.
# level.py
import pygame
from rectangle import Rectangle
from coin import Coin
# taille d'un carré de base
SIZE = 30
def load(filename:str):
with open(filename, 'r', encoding='utf8') as file:
lines = file.read().split('\n')
plateformes = pygame.sprite.Group()
coins = pygame.sprite.Group()
for i_line, line in enumerate(lines):
y = i_line * SIZE
for i_col, car in enumerate(line):
x = i_col * SIZE
if car == 'P':
s = Rectangle(x, y, SIZE, SIZE, (255, 0, 0))
plateformes.add(s)
elif car == 'D':
s = Coin(x, y, 'dollar')
coins.add(s)
return plateformes, coins
Le code est assez simple : il s'agit de parcourir le fichier et d'ajouter une plateforme chaque fois que l'on voit un P et un dollar chaque fois que l'on voit un D.
La constante SIZE permet de régler la taille d'un carré à l'écran.
Dans le main, on modifie la création des groupes de plateformes et de pièces :
...
import level.py
...
platesformes, coins = level.load('level1.txt')
Et le fichier level1.txt contient le niveau.
Supposons que l'on veuille représenter le niveau suivant la méthode précédente mais que l'on veuille de plus ajouter des items supplémentaires comme des monstres qui peuvent se déplacer. On aurait dû mal à indiquer les informations sur le mouvement des monstres dans le fichier où chaque caractère représente un item.
On peut faire une solution hybride.
D D
D D D D D D D
PPPPPPPPPPPPPP PPPPPPPPPPPPPP
D D D
PPPP PPPP PPPPPP PPPPPPPPP PPPP
D D
PPPPPP PPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
---
MOB,1,9,15,20,15
MOB,2,40,3,40,12,35,12
On convient alors que la ligne --- permet de séparer le fichier en deux parties.
MOB,1,9,15,20,15 pourrait représenter un monstre de type 1, se déplaçant de la case en (9,15) à la case en (20,15).MOB,2,40,3,40,12 pourrait représenter un monstre de type 2, se déplaçant selon les cases (40,3), (40,12), (35,12)On pourra ajouter ainsi tout ce que l'on veut : des éléments de décors supplémentaires, des monstres, des récompenses, la fin du niveau…