I’m making a RPG with Python and pygame
for a school project. In order to create the few maps, I have chosen the Tile Mapping techniques I have seen in some tutorials, using a *.txt
file.
However, I have to cut some sprites (trees, houses, …) into several pieces. The problem is that I’m running out of characters to represent them all!
I also remember that it’s possible to take several characters as one (ex : take "100"
as one an not as one "1"
and two "0"
s) and/or to put spaces between characters in the file (e.g. "170 0 2 5 12 48"
which is read as six sprites).
But I really don’t know how to adapt my program to do this way. I’m pretty sure that I need to modify the way the file is read, but how?
Here’s the reading function :
class Niveau:
def __init__(self, fichier):
self.fichier = fichier
self.structure = 0
def generer(self):
"""Méthode permettant de générer le niveau en fonction du fichier.
On crée une liste générale, contenant une liste par ligne à afficher"""
#On ouvre le fichier
with open(self.fichier, "r") as fichier:
structure_niveau = []
#On parcourt les lignes du fichier
for ligne in fichier:
ligne_niveau = []
#On parcourt les sprites (lettres) contenus dans le fichier
for sprite in ligne:
#On ignore les "n" de fin de ligne
if sprite != 'n':
#On ajoute le sprite à la liste de la ligne
ligne_niveau.append(sprite)
#On ajoute la ligne à la liste du niveau
structure_niveau.append(ligne_niveau)
#On sauvegarde cette structure
self.structure = structure_niveau
def afficher(self, fenetre):
"""Méthode permettant d'afficher le niveau en fonction
de la liste de structure renvoyée par generer()"""
#Chargement des images (seule celle d'arrivée contient de la transparence)
Rocher = pygame.image.load(image_Rocher).convert()
Buisson = pygame.image.load(image_Buisson).convert()
#On parcourt la liste du niveau
num_ligne = 0
for ligne in self.structure:
#On parcourt les listes de lignes
num_case = 0
for sprite in ligne:
#On calcule la position réelle en pixels
x = (num_case+0.5) * taille_sprite
y = (num_ligne+1) * taille_sprite
if sprite == 'R': #R = Rocher
fenetre.blit(Rocher, (x,y))
if sprite == 'B':
fenetre.blit(Buisson,(x,y))
num_case += 1
num_ligne += 1
Advertisement
Answer
I think what you want is str.split()
:
for ligne in fichier:
ligne_niveau = []
#On parcourt les sprites (lettres) contenus dans le fichier
for sprite in ligne.split(): # note split here
ligne_niveau.append(sprite) # no need to check for line end
#On ajoute la ligne à la liste du niveau
structure_niveau.append(ligne_niveau)
split
without any arguments will join all consecutive whitespace (including tabs 't'
and newlines 'n'
) into a single split. For example:
"ta 13 b t22 6en".split() == ['a', '13', 'b', '22', '6e']
Note that the “sprites” don’t have to be the same length, so there’s no need for fill characters like extra 0
s or *
s. You can also simplify using a list comprehension:
def generer(self):
with open(self.fichier) as fichier:
self.structure = [ligne.split() for ligne in fichier]
Alternatively, consider using a comma-separated value format – Python has a whole module (csv
) for that:
a,13,b,22,6e