Problème avec python (pysfml et le xml)

Fermé
Trameur - Modifié par Trameur le 23/06/2011 à 20:04
 Trameur - 25 juin 2011 à 18:33
Bonjour,

Alors voici mon problème :

Depuis quelques jours j'apprend le langage python, je suis passé au pysfml récemment .
La je suis en train de faire un mini jeu, avant, mon code (la partie level) ressemblait à ceci :

level_width = 27
level_height = 17

tiles = [
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,
1,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
1,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,2,0,1,
1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,2,0,0,0,1,
1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,
1,0,0,0,0,1,1,0,0,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,3,0,1,
1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,0,1,0,1,
1,1,2,0,2,2,1,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,4,3,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,4,0,0,0,1,1,
1,1,1,1,1,1,1,3,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,2,0,0,2,0,0,0,0,0,0,1,1,1,0,1,1,4,0,0,0,0,2,1,
1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,1,0,2,0,1,1,
1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,3,0,1,1
]

Mais maintenant j'aimerais faire comme ceci :

class Level:

def __init__( self, filename ):
# ouvrir le fichier
# lire le contenu dans une chaîne
# passer la chaîne à ElementTree.fromstring() pour créer l'arbre XMl
# récupérer largeur & hauteur dans self.width & self.height
# récupérer le contenu du niveau, le découper à coup de split('\n') et split(',')
# mettre tout ça dans self.tiles
#
# on a un niveau

J'ai avant cela créé le niveau avec un logiciel qui ressemble a ceci (sur une autre page bien sur) :

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" width="80" height="30" tilewidth="50" tileheight="50">
<tileset firstgid="1" name="tileset" tilewidth="50" tileheight="50">
<image source="../images/tileset.png" width="500" height="500"/>
</tileset>
<layer name="Calque 1" width="80" height="30">
<data encoding="csv">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[...],0,0,0,0,0,0,0,0,0,0,0,0,0,0
</data>
</layer>
</map>

Sauf qu'il n'existe aucun tuto la dessus et je ne comprend pas trop comment utiliser la bibliothèque dispo ici : http://docs.python.org/library/xml.etree.elementtree.html
surtout que c'est en anglais et je comprend pas grand chose.

Merci d'avance de bien vouloir m'éclaircir sur la démarche a suivre pour arriver a charger mon niveau.

EDIT : j'ai un deuxième problème :

Sur le PC que j'utilise actuellement, le pysfml ne marche pas a 100%, enfin le code si mais la page de mon programme ne s'affiche pas correctement, je vois l'onglet "mon programme" en bas mais en cliquant dessus rien ne se passe.
J'aimerais savoir comment faire pour visualiser ma page merci :)
A voir également:

2 réponses

Bon j'ai corrigé mon problème maintenant ça marche :)
Voici le code :

class Level:
	def __init__( self, filename ):	
		
		# ouvrir le fichier	
		if niveau == 1:
			level_file = open( "levels/level01.tmx" )
		elif niveau == 2:
			level_file = open( "levels/level02.tmx" )
		elif niveau == 3:
			level_file = open( "levels/level03.tmx" )
		# lire le contenu dans une chaine
		level_data = level_file.read()
		# passer la chaine a ElementTree.fromstring() pour creer l'arbre XMl
		level_tree = ElementTree.fromstring(level_data)
		# recuperer largeur & hauteur dans self.width & self.height
		self.width = int(level_tree.attrib["width"])
		self.height = int(level_tree.attrib["height"])
		# recuperer le contenu du niveau, le decouper a coup de split('\n') et split(',')
		level_content = level_tree.find("layer").find("data").text
		
		# mettre tout ca dans self.tiles
		self.tiles = []
		for row in level_content.split('\n'):
			cols = row.split(',')
			
			for col in cols:
				if col != "":
					self.tiles.append( int(col) )
	
	def Draw( self, window ):
		for y in range( self.height ):
			for x in range( self.width ):
				tile_value = self.tiles[ y * self.width + x ]
				
				if tile_value == 0:
					pass
				elif tile_value == 1:
					mur_sprite.SetPosition( x * tile_size - camera.x, y * tile_size - camera.y )
					window.Draw( mur_sprite )
				elif tile_value == 2:
					coin_sprite.SetPosition( x * tile_size - camera.x, y * tile_size - camera.y )
					window.Draw( coin_sprite )	
				elif tile_value == 3:
					bloc_ralentisseur_sprite.SetPosition( x * tile_size - camera.x, y * tile_size - camera.y )
					window.Draw( bloc_ralentisseur_sprite )	
				elif tile_value == 4:
					bloc_tueur_sprite.SetPosition( x * tile_size - camera.x, y * tile_size - camera.y )
					window.Draw( bloc_tueur_sprite )	
				elif tile_value == 5:
					bloc_fin_sprite.SetPosition( x * tile_size - camera.x, y * tile_size - camera.y )
					window.Draw( bloc_fin_sprite )						
	
	def GetTileAt( self, tile_x, tile_y ): # anciennement get_level_at
		if tile_x < 0 or tile_x >= self.width:
			return 1
		
		if tile_y < 0 or tile_y >= self.height:
			return 0
			
		return self.tiles[ tile_y * self.width + tile_x ]

	def SetLevelAt( self, tileX, tileY, tileValue ):
		self.tiles[ tileY * self.width + tileX ] = tileValue	
		
	def GetTileAtPosition( self, x, y ):
		return self.GetTileAt( int( x / tile_size ), int( y / tile_size ) )

	def SetTileAtPosition( self, x, y, tileValue ):
		self.SetLevelAt( int( x / tile_size ), int( y / tile_size ), tileValue )
	
current_level = Level( "levels/level01.tmx" )

collidable_tiles = [ 1, 3, 4 ]


Mais il reste mon deuxième problème :

Sur le PC que j'utilise actuellement, le pysfml ne marche pas a 100%, enfin le code si mais la page de mon programme ne s'affiche pas correctement, je vois l'onglet "mon programme" en bas mais en cliquant dessus rien ne se passe.
J'aimerais savoir comment faire pour visualiser ma page merci :)
0
Bon je fais un nouveau sujet pour ce dernier problème comme le titre n'est pas bon et que le problème principal est résolu
0