Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème Pygame TP

    16 novembre 2010 à 19:41:52

    Bonjour,

    Je lis actuellement le cours sur pygame et j'en suis au TP. J'ai pratiquement tout coder mais j'ai une erreur bizarre quand j'essaye d'ouvrir un fichier qui s'affiche sur la console juste avant de se fermer alors j'ai réussi à prendre un screenshot juste avant qu'elle se ferme et j'ai pu lire ça : "Error: invalid file: (Surface(450x450x32 SW))"
    Voici mes fichiers :

    dklabyrinthe.py

    import pygame
    from pygame.locals import *
    
    from classes import *
    from constantes import *
    
    pygame.time.Clock().tick(30)
    
    pygame.init()
    
    fenetre = pygame.display.set_mode((cote_fenetre, cote_fenetre))
    
    icone = pygame.image.load(image_icone)
    pygame.display.set_icon(icone)
    
    pygame.display.set_caption(titre_fenetre)
    
    accueil = pygame.image.load(image_accueil)
    fond = pygame.image.load(image_fond)
    
    continuer = 1
    continuer_menu = 1
    continuer_jeu = 1
    
    while continuer:
    	while continuer_menu:
    		fenetre.blit(accueil, (0,0))
    		pygame.display.flip()
    		for event in pygame.event.get():
    			if event.type == QUIT:
    				continuer = 0
    				continuer_menu = 0
    				continuer_jeu = 0
    				
    			if event.type == KEYDOWN:
    				if event.key == K_F1:
    					fichier_niveau = "Niveau1.txt"
    					continuer_menu = 0
    				if event.key == K_F2:
    					fichier_niveau = "Niveau2.txt"
    					continuer_menu = 0
    					
    	while continuer_jeu:
    		fenetre.blit(fond, (0,0))
    		pygame.display.flip()
    		niveau = Niveau()
    		niveau.initialisation_niveau(fenetre)
    		niveau.afficher_niveau(fenetre)
    		for event in pygame.event.get():
    			if event.type == QUIT:
    				continuer = 0
    				continuer_jeu = 0
    				continuer_menu = 0
    		
    	continuer_menu = 1
    	continuer_jeu = 1
    



    classes.py

    class Niveau:
    	def __init__(self):
    		self.structure = []
    		
    	def initialisation_niveau(self, fichier):
    		with open(fichier, "r") as fichier:
    			for ligne in fichier:
    				for sprite in ligne:
    					listeSecondaire = []
    					while sprite != '/n':
    						listeSecondaire.append(sprite)
    				self.structure.append(listeSecondaire)
    			fichier.close()
    				
    	def afficher_niveau(self, fenetre):
    		i = 0
    		j = 0
    		while i < len(self.structure):
    			while j < len(self.structure[i]):
    				if self.structure[i][j] == 'd':
    					self.structure[i][j] == pygame.image.load(depart)
    					position_sprite_x = self.structure[i][j] * taille_sprite
    					position_sprite_y = self.structure[i][j] * taille_sprite
    					fenetre.blit(self.structure, (position_perso_x, position_perso_y))
    					pygame.display.flip()
    
    		
    class Perso: #je ne l'ai pas encore codé
    	def __init__(self):
    		self.position_bas = dk_bas
    		self.position_haut = dk_bas
    		self.position_droite = dk_droite
    		self.position_gauche = dk_gauche
    		self.position_actuelle = dk_bas
    



    et constantes.py

    cote_fenetre = 450
    image_icone = "dk_bas.png"
    titre_fenetre = "Labyrinth DK !"
    image_accueil = "accueil.png"
    dk_bas = "dk_bas.png"
    dk_haut = "dk_haut.png"
    dk_droite = "dk_droite.png"
    dk_gauche = "dk_gauche.png"
    depart = "depart.png"
    mur = "mur.png"
    arrivee = "arrivee.png"
    image_fond = "fond.jpg"
    taille_sprite = 30
    



    Merci de bien vouloir m'aider à régler ce problème.
    • Partager sur Facebook
    • Partager sur Twitter
      16 novembre 2010 à 19:50:49

      quelle ligne ?
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        16 novembre 2010 à 19:52:03

        Il me dit ligne 6 dans classes.py
        • Partager sur Facebook
        • Partager sur Twitter
          16 novembre 2010 à 20:41:36

          ligne 47 dans dklabyrinthe.py tu passes une surface au lieu d'un nom de fichier ...
          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

            16 novembre 2010 à 20:54:20

            J'ai confondu avec afficher_niveau. :D En tout cas merci

            Edit : J'ai un autre problème, il reconnait pas où est "Niveau1.txt" alors qu'il est bien dans le dossier de mon programme. Il me met l'erreur à la ligne 6 dans classes.py... Il me met aussi une autre erreur à la ligne 47 dans dklabyrinthe à "niveau.initialisation_niveau(fichier_niveau)"
            • Partager sur Facebook
            • Partager sur Twitter
              16 novembre 2010 à 21:42:45

              si tu es sous linux, linux est case sensitive.
              vérifies aussi le chemin du fichier.
              • Partager sur Facebook
              • Partager sur Twitter

              Python c'est bon, mangez-en. 

                17 novembre 2010 à 13:58:46

                Je ne suis pas sur Linux mais WindowsXP. J'ai bien vérifié il est dans le dossier de mon projet, puisqu'il n'y a pas de sous-dossier dedans... J'ai aussi essayer en copiant le nom du fichier et en le collant dans le contenu du fichier, ça ne fonctionne toujours pas.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  17 novembre 2010 à 18:31:01

                  Je ne sais pas si ces erreurs sont liées à ce que je vais dire mais dans tous les cas tu devrais supprimer la ligne 13 de classes.py puisque tu ouvre ton fichier avec with qui se charge lui même de refermer ton fichier une fois que tu sors de son bloc.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 novembre 2010 à 18:40:43

                    Oui j'ai vu ça dans le cours je l'ai supprimé.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 novembre 2010 à 20:28:59

                      Alors voilà, j'ai résolu beaucoup de problème sur mon TP (à chaque fois que j'en résolvais un, un autre apparaissait) mais il y en a un où je sèche vraiment : dans mon code ci-dessous, il me dis "argument 1 must be pygame.Surface, not str" à la ligne 28 dans "fenetre.blit(self.structure[i][j], (position_perso_x, position_perso_x))" dans classes.py, ce que je ne comprends pas car quelques lignes au-dessus, je le remplis avec un pygame.image.load... Voici mon code :

                      dklabyrinthe.py :

                      import pygame
                      from pygame.locals import *
                      
                      from classes import *
                      
                      pygame.time.Clock().tick(30)
                      
                      pygame.init()
                      
                      fenetre = pygame.display.set_mode((cote_fenetre, cote_fenetre))
                      
                      icone = pygame.image.load(image_icone)
                      pygame.display.set_icon(icone)
                      
                      pygame.display.set_caption(titre_fenetre)
                      
                      accueil = pygame.image.load(image_accueil)
                      fond = pygame.image.load(image_fond)
                      
                      continuer = 1
                      continuer_menu = 1
                      continuer_jeu = 1
                      
                      while continuer:
                      	while continuer_menu:
                      		fenetre.blit(accueil, (0,0))
                      		pygame.display.flip()
                      		for event in pygame.event.get():
                      			if event.type == QUIT:
                      				continuer = 0
                      				continuer_menu = 0
                      				continuer_jeu = 0
                      				
                      			if event.type == KEYDOWN:
                      				if event.key == K_F1:
                      					fichier_niveau = """d00mmmmm0m00mmm
                      0m00000m0mm0m00
                      00mm0m000m0000m
                      m000mmmm000mmmm
                      000m00000mmm00m
                      mm0mmmm0mm000mm
                      000mmm0000mmmmm
                      0m000mm0m0mm00m
                      0mm0m000m000mmm
                      mmm00mmmm0mmmmm
                      mmm0mm0m00mm00m
                      m000m00m0mm00mm
                      00mm00m00000mmm
                      mmmmm0mm0mm0mmm
                      m0000mmm00m000a"""
                      					continuer_menu = 0
                      				if event.key == K_F2:
                      					fichier_niveau = "Niveau1"
                      					continuer_menu = 0
                      					
                      	while continuer_jeu:
                      		fenetre.blit(fond, (0,0))
                      		pygame.display.flip()
                      		niveau = Niveau()
                      		niveau.initialisation_niveau(fichier_niveau)
                      		niveau.afficher_niveau(fenetre)
                      		for event in pygame.event.get():
                      			if event.type == QUIT:
                      				continuer = 0
                      				continuer_jeu = 0
                      				continuer_menu = 0
                      		
                      	continuer_menu = 1
                      	continuer_jeu = 1
                      



                      classes.py :

                      import pygame
                      from pygame.locals import *
                      from constantes import *
                      
                      class Niveau:
                      	def __init__(self):
                      		self.structure = []
                      		
                      	def initialisation_niveau(self, fichier):
                      		for ligne in fichier:
                      			for sprite in ligne:
                      				listeSecondaire = []
                      				if sprite != '/n':
                      					listeSecondaire.append(sprite)
                      			self.structure.append(listeSecondaire)
                      		
                      	def afficher_niveau(self, fenetre):
                      		i = 0
                      		j = 0
                      		position_perso_x = 0
                      		position_perso_y = 0
                      		while i < len(self.structure):
                      			while j < len(self.structure[i]):
                      				if self.structure[i][j] == 'd':
                      					self.structure[i][j] == pygame.image.load(depart)
                      					position_sprite_x = self.structure[i][j] * taille_sprite
                      					position_sprite_y = self.structure[i][j] * taille_sprite
                      					fenetre.blit(self.structure[i][j], (position_perso_x, position_perso_y))
                      					
                      				if self.structure[i][j] == 'm':
                      					self.structure[i][j] == pygame.image.load(mur)
                      					position_sprite_x = self.structure[i][j] * taille_sprite
                      					position_sprite_y = self.structure[i][j] * taille_sprite
                      					fenetre.blit(self.structure[i][j], (position_perso_x, position_perso_y))
                      					
                      				if self.structure[i][j] == 'a':
                      					self.structure[i][j] == pygame.image.load(arrivee)
                      					position_sprite_x = self.structure[i][j] * taille_sprite
                      					position_sprite_y = self.structure[i][j] * taille_sprite
                      					fenetre.blit(self.structure[i][j], (position_perso_x, position_perso_y))
                      					
                      		pygame.display.flip()
                      
                      		
                      class Perso:
                      	def __init__(self, niveau):
                      		self.position_bas = dk_bas
                      		self.position_haut = dk_bas
                      		self.position_droite = dk_droite
                      		self.position_gauche = dk_gauche
                      		self.position_actuelle = dk_bas
                      		self.niveau = niveau
                      



                      et constantes.py :

                      cote_fenetre = 450
                      image_icone = "dk_bas.png"
                      titre_fenetre = "Labyrinth DK !"
                      image_accueil = "accueil.png"
                      dk_bas = "dk_bas.png"
                      dk_haut = "dk_haut.png"
                      dk_droite = "dk_droite.png"
                      dk_gauche = "dk_gauche.png"
                      depart = "depart.png"
                      mur = "mur.png"
                      arrivee = "arrivee.png"
                      image_fond = "fond.jpg"
                      taille_sprite = 30
                      

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 novembre 2010 à 21:52:19

                        Up. (ça devrait être marqué quand on édite dans la liste des sujets >.<")

                        Edit: alors là j'avoue que c'était un peu stupide... mettre deux égale alors qu'on est pas dans une condition ou dans une boucle... :D
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Problème Pygame TP

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown