Outils pour utilisateurs

Outils du site


nsi:tds:pygame:plateforme:fichier_niveau

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Fichier pour le niveau

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.

Premier choix

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.

Deuxième choix

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.

Module de lecture de niveau

# 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.

Hybride

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.

  • La partie avant est le contenu déjà décrit avant.
  • La partie après représente une liste d'items à ajouter, avec leurs attributs. Par exemple ici :
    • 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…

nsi/tds/pygame/plateforme/fichier_niveau.txt · Dernière modification : de goupillwiki