Partage
  • Partager sur Facebook
  • Partager sur Twitter

Affichage d'un groupe de sprites

Sujet résolu
    5 février 2014 à 16:21:23

    Bonjour à tous,

    Je travaille sur un jeu 2D avec pygame, et je suis à la recherche d'une solution pour afficher un objet en pas mal d'exemplaire (un mur).

    J'ai alors trouvé sur la doc officielle des fonctions permettant d'afficher des groupes de sprites, seulement je n'y comprends vraiment rien et j'aimerais vraiment éviter la solution du genre :

    mur_1 = pygame.image.load("mur.png")
    pos_mur_1 = mur_1.get_rect()
    pos_mur_1.move_ip(10,20)
    
    mur_2 = pygame.image.load("mur.png")
    pos_mur_2 = mur_2.get_rect()
    pos_mur_2.move_ip(20,30)
    
    

    ... qui est très redondante est lourde dans le code. 

    Est-ce qu'il y aurait moyen d'aller plus vite avec moins de code ? 

    Je n'arrive pas à comprendre les fonctions pygame à ce sujet. 

    Merci d'avance ! 



    • Partager sur Facebook
    • Partager sur Twitter
      5 février 2014 à 16:23:56

      une boucle?
      • Partager sur Facebook
      • Partager sur Twitter
      Bevet Breizh! Breizh dizalc'h! Betek an trec'h! Ha mallozh ruz d'ar c'hallaoued! Trouvez votre voie
        5 février 2014 à 16:25:15

        • Partager sur Facebook
        • Partager sur Twitter
        Bevet Breizh! Breizh dizalc'h! Betek an trec'h! Ha mallozh ruz d'ar c'hallaoued! Trouvez votre voie
          5 février 2014 à 19:44:17

          Merci pour ta réponse pythan, j'ai déja regardé la correction mais j'aurais aimé m'affranchir de ce système de case par case qui est assez contraignant, et qui ne correspond pas trop à ce que je recherche.

          Je pense avoir trouvé ce que je vais faire, merci !

          • Partager sur Facebook
          • Partager sur Twitter
            5 février 2014 à 21:37:19

            J'en profite pour rebondir sur une autre question : je rencontre une erreur assez bizarre qui me parle de lignes 365 etc... alors que mon programme ne fait que 80 lignes :o

            Voilà mon code : 

            import pygame
            from pygame.locals import *
            import sys
            
            pygame.init()
            
            #Fenêtre 
            fenetre = pygame.display.set_mode((640,480))
            
            #Fond 
            fond = pygame.image.load("background.png").convert()
            fenetre.blit(fond, (0,0))
            
            #Classe Bloc
            class Bloc: 
            	
            	def __init__(self, pos_x, pos_y):
            		self.image = pygame.image.load("bloc.png").convert()
            		self.bloc_pos = self.image.get_rect()
            		self.bloc_pos.move_ip(pos_x, pos_y)
            		self.bloc_groupe = pygame.sprite.RenderPlain(self.image)
            	
            #Classe Personnage 
            class Tank:
            
            	def __init__(self, droite, haut, bas, gauche):
            		self.droite = pygame.image.load(droite).convert_alpha()
            		self.haut = pygame.image.load(haut).convert_alpha()
            		self.bas = pygame.image.load(bas).convert_alpha()
            		self.gauche = pygame.image.load(gauche).convert_alpha()
            		self.tank_pos = self.bas.get_rect()
            		self.direction = self.droite
            		
            	def deplacement(self, direction):
            		if direction == 'droite':
            			self.tank_pos = self.tank_pos.move(2,0)
            			self.direction = self.droite
            		if direction == 'haut':
            			self.tank_pos = self.tank_pos.move(0,-2)
            			self.direction = self.haut
            		if direction == 'bas':
            			self.tank_pos = self.tank_pos.move(0,2)
            			self.direction = self.bas
            		if direction == 'gauche':
            			self.tank_pos = self.tank_pos.move(-2,0)
            			self.direction = self.gauche
            
            #Création blocs
            bloc_1 = Bloc(10,20)
            
            #Création tank
            tank = Tank("tank_droite.png", "tank_haut.png", "tank_bas.png", "tank_gauche.png")
            
            #Délai répétition clavier
            pygame.key.set_repeat(1,20)
            
            #Rafraîchissement
            pygame.display.flip()
            
            #Boucle principale
            while 1:
            	for event in pygame.event.get():
            		
            		#Quitter le jeu
            		if event.type == QUIT: 
            			sys.exit		
            			
            		#Déplacement du personnage 
            		if event.type == KEYDOWN:
            			if event.key == K_RIGHT:
            				tank.deplacement('droite')
            			if event.key == K_UP:
            				tank.deplacement('haut')
            			if event.key == K_DOWN:
            				tank.deplacement('bas')
            			if event.key == K_LEFT:
            				tank.deplacement('gauche')
            				
            	#Recollage et rafraîchissement 
            	fenetre.blit(fond, (0,0))
            	fenetre.blit(tank.direction, tank.tank_pos)
            	fenetre.blit(bloc.image, bloc.bloc_pos)
            	pygame.display.flip()

            Je pense que cela vient de la classe 'Bloc' que j'ai crée pour placer mes objets plus facilement. 

            Voila l'erreur étrange que j'ai :

            Traceback (most recent call last):
              File "C:\Program Files (x86)\lib\site-packages\pygame\sprite.py", line 365, in add
                self.add(*sprite)
            TypeError: add() argument after * must be a sequence, not pygame.Surface
            
            During handling of the above exception, another exception occurred:
            
            Traceback (most recent call last):
              File "C:\Users\Baptiste\Desktop\StarBlitz.py", line 49, in <module>
                bloc_1 = Bloc(10,20)
              File "C:\Users\Baptiste\Desktop\StarBlitz.py", line 21, in __init__
                self.bloc_groupe = pygame.sprite.RenderPlain(self.image)
              File "C:\Program Files (x86)\lib\site-packages\pygame\sprite.py", line 552, in __init__
                self.add(*sprites)
              File "C:\Program Files (x86)\lib\site-packages\pygame\sprite.py", line 378, in add
                sprite.add_internal(self)
            AttributeError: 'pygame.Surface' object has no attribute 'add_internal'

            Si quelqu'un pouvait m'aider ce serait vraiment sympa :o

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              6 février 2014 à 12:13:57

              Oui tu n'ajoutes pas un objet construit avec la classe Sprite, du coup il ne reconnaît pas l'objet.

              Il faut donc que tu crées l'objet ou les objets Sprite et les ajouter par la suite...

              >>> from pygame import sprite
              >>> group = sprite.Group() # création du groupe
              >>> sp = sprite.Sprite() # création du sprite
              >>> sp.add(group) # Ajout du sprite au groupe de sprites
              


              -
              Edité par Anonyme 6 février 2014 à 13:50:42

              • Partager sur Facebook
              • Partager sur Twitter
                6 février 2014 à 19:43:53

                Merci pour ta réponse fred1599, j'ai réécrit mon code comme ça et ça a l'air de marcher, mais j'ai juste une petite erreur me disant que le nom 'mur' que je créé n'est pas défini, mais pourtant je le défini bien comme étant un objet de la classe 'Bloc'.

                import pygame
                from pygame.locals import *
                import sys
                
                pygame.init()
                
                #Fenêtre 
                fenetre = pygame.display.set_mode((640,480))
                
                #Fond 
                fond = pygame.image.load("background.png").convert()
                fenetre.blit(fond, (0,0))
                 
                #Classe Bloc
                class Bloc(pygame.sprite.Sprite): 
                	
                	def __init__(self, image, pos_x, pos_y, nom):
                		pygame.sprite.Sprite.__init__(self)
                		self.image = pygame.image.load(image).convert()
                		self.bloc_pos = self.image.get_rect()
                		self.bloc_pos.move_ip(pos_x, pos_y)
                		self.bloc_groupe = sprite.Group()
                		self.nom = sprite.Sprite()
                		self.nom.add(bloc_groupe)
                		
                #Classe Personnage 
                class Tank:
                
                	def __init__(self, droite, haut, bas, gauche):
                		self.droite = pygame.image.load(droite).convert_alpha()
                		self.haut = pygame.image.load(haut).convert_alpha()
                		self.bas = pygame.image.load(bas).convert_alpha()
                		self.gauche = pygame.image.load(gauche).convert_alpha()
                		self.tank_pos = self.bas.get_rect()
                		self.direction = self.droite
                		
                	def deplacement(self, direction):
                		if direction == 'droite':
                			self.tank_pos = self.tank_pos.move(2,0)
                			self.direction = self.droite
                		if direction == 'haut':
                			self.tank_pos = self.tank_pos.move(0,-2)
                			self.direction = self.haut
                		if direction == 'bas':
                			self.tank_pos = self.tank_pos.move(0,2)
                			self.direction = self.bas
                		if direction == 'gauche':
                			self.tank_pos = self.tank_pos.move(-2,0)
                			self.direction = self.gauche
                
                #Création blocs
                mur = Bloc("bloc.png", 40, 40, mur)
                
                #Création tank
                tank = Tank("tank_droite.png", "tank_haut.png", "tank_bas.png", "tank_gauche.png")
                
                #Délai répétition clavier
                pygame.key.set_repeat(1,20)
                
                #Rafraîchissement
                pygame.display.flip()
                
                #Boucle principale
                while 1:
                	for event in pygame.event.get():
                		
                		#Quitter le jeu
                		if event.type == QUIT: 
                			sys.exit		
                			
                		#Déplacement du personnage 
                		if event.type == KEYDOWN:
                			if event.key == K_RIGHT:
                				tank.deplacement('droite')
                			if event.key == K_UP:
                				tank.deplacement('haut')
                			if event.key == K_DOWN:
                				tank.deplacement('bas')
                			if event.key == K_LEFT:
                				tank.deplacement('gauche')
                				
                	#Recollage et rafraîchissement 
                	fenetre.blit(fond, (0,0))
                	fenetre.blit(tank.direction, tank.tank_pos)
                	fenetre.blit(bloc.image, bloc.bloc_pos)
                	pygame.display.flip()
                

                J'avoue ne pas comprendre grand chose des fois, mais merci de m'aider même si je pose des questions assez basiques :)

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  7 février 2014 à 7:50:23

                  Ligne 52, ça ne peut pas fonctionner, tu mets en arguments une variable mur pas encore créée.

                  Tant qu'on y est la variable nom dans ta classe Bloc n'est pas utilisée, elle sert à quoi ?

                  -
                  Edité par Anonyme 7 février 2014 à 7:56:12

                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 février 2014 à 19:43:35

                    Je n'y comprends plus rien du tout... Comment puis-je déclarer l'objet 'mur' ? Puis-ce que c'est un objet, je ne vois pas comment le déclarer autrement que ça. Et puis pour la variable nom je peux la remplacer par quoi dans les lignes 23 et 24 ? Par self.image ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      7 février 2014 à 21:18:44

                      Peut-être vas-tu trop vite avec python. Tu passes à la POO alors que tu maîtrises à peine python, ça fait beaucoup.

                      Ton bloc représente un sprite, ça tient juste à ce code ci-dessous et des méthodes si tu le souhaites sur le sprite

                      class Bloc(pygame.sprite.Sprite):
                          def __init__(self, image, pos_x, pos_y):
                              pygame.sprite.Sprite.__init__(self)
                              self.image = pygame.image.load(image).convert()
                              self.bloc_pos = self.image.get_rect()
                              self.bloc_pos.move_ip(pos_x, pos_y)

                      Tu peux très bien créer un groupe de sprites par la suite

                      monBloc1 = Bloc("bloc.png", 40, 40)
                      monBloc2 = Bloc("...", ..., ...)
                      # etc...
                      mesSprites = pygame.sprite.Group(monBloc1, monBloc2, ...)




                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 février 2014 à 22:00:03

                        Ah oui d'accord merci ! 

                        Par contre pour le bliter ça pose problème => il me demande une Surface donc j'ai essayé de convertir le sprite mais sans succès. 

                        Je ne vois pas comment je peux faire sans ça, j'ai cherché mais je n'ai pas trouvé.

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          7 février 2014 à 22:16:23

                          Eh bien normalement si j'ai tout suivi, tu devrais dessiner sur ta surface ton groupe de sprites

                          mesSprites.draw(fenetre)

                          ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 février 2014 à 22:33:46

                            Ah d'accord pour le blit, je ne connaissais pas cette façon de faire (pas sur la doc officielle) mais maintenant il me dit que l'objet 'Bloc' n'a pas d'attribut 'rect'. 

                            Décidément c'est plus difficile que je ne le pensais. 

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              7 février 2014 à 22:39:27

                              Essayes voir

                              mesSprites.clear(fenetre, fond)
                              mesSprites.update()
                              mesSprites.draw(fenetre)


                              "je ne connaissais pas cette façon de faire (pas sur la doc officielle)"

                              Mais si... Regarde !

                              En même temps refais une mise à jour du code entier et indique l'erreur en faisant un copier coller exact.

                              -
                              Edité par Anonyme 7 février 2014 à 22:43:45

                              • Partager sur Facebook
                              • Partager sur Twitter
                                7 février 2014 à 22:44:16

                                Toujours le même problème, c'est vraiment bizarre... 

                                Ah ok pour la fonction ! (j'étais allé dans la rubrique draw). 

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  8 février 2014 à 9:27:38

                                  Je te laisse lire cet article, en plus d'indiquer ce qu'on a déjà fait précédemment, il te permet de travailler sur plusieurs thèmes avec tes sprites.

                                  Ça te permettra de voir ce qu'il manque dans ton code... Qui puis est, pygame c'est pas ma tasse de thé, j'en ai déjà trop fait, moi qui est horreur des jeux.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    9 février 2014 à 12:18:34

                                    Désolé de ma réponse tardive, je n'étais pas là hier. 

                                    Merci pour ton aide et ton lien qui vont bien m'aider, j'avais du mal a trouver de bons tuto sur internet mais celui-ci a l'air sympa.

                                    Sujet résolu !

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Affichage d'un groupe de sprites

                                    × 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