Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pygame

    25 mars 2015 à 18:22:27

    Bonjour a tous je m'essai a pygame et j'ai suivi le tuto proposé sur ce site mais j'ai un problème quand j'essai de bouger une image avec ce code :

    continuer = 1

    while continuer:

        for event in pygame.event.get():

            if event.type == QUIT:

                continuer = 0

            if event.type == KEYDOWN:

                if event.key == K_DOWN:

                    pos_roib = pos_roib.move(240,160)

                    fenetre.blit(fond, (0,0))

                    fenetre.blit(roib, pos_roib)

                    pygame.display.flip()

    l'erreur qui m'est affichée est : "AttributeError: 'tuple' object has no attribute 'move'" mais je comprends pas pourquoi si quelqu'un pourrait m'aider je lui en serait reconaissant ! 

    Merci d'avance

    -
    Edité par TPEROBOT 25 mars 2015 à 18:27:28

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      25 mars 2015 à 18:26:30

      pos_roib étant certainement un tuple, au contraire si on connaît un peu python, on sait très bien qu'il n'a pas d'attribut move, une simulation rapide sur l'interpréteur (utilises le beaucoup, énormement, sans limite) démontre cela

      >>> a = (1,)
      >>> type(a)
      <class 'tuple'>
      >>> a.move(240, 160)
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      AttributeError: 'tuple' object has no attribute 'move'
      

      Bref pos_roib n'est pas l'objet adéquate pour ce type d'attribut, je pense plus à un objet Rect

      • Partager sur Facebook
      • Partager sur Twitter
        25 mars 2015 à 18:29:25

        Je comprends ce que tu me dit mais j'ai pas réussi a mettre pos_roib autre part qu'en (0,0) en utilisant rect
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          25 mars 2015 à 18:32:27

          Il faut créer cet objet Rect, c'est sans doute non fait

          rect = pygame.Rect(0, 0, 100, 100)
          rect = rect.move(..., ...)



          • Partager sur Facebook
          • Partager sur Twitter
            25 mars 2015 à 18:34:09

            Je ne comprends pas comment je peux définir la postion de mon image grâce a ça...
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              25 mars 2015 à 18:36:37

              roib est un objet de quel type ?
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                25 mars 2015 à 18:38:19

                Non, montres son initialisation, je veux les termes pygame, soit un objet Surface, soit une Rect
                • Partager sur Facebook
                • Partager sur Twitter
                  25 mars 2015 à 18:40:21

                  voila :

                  roib = pygame.image.load("roib.png").convert()

                  roib.set_colorkey((255,255,255))

                  pos_roib = (240,0)

                  fenetre.blit(roib, pos_roib)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    25 mars 2015 à 18:45:20

                    C'est donc une Surface, c'est pourtant indiquer dans la documentation pygame

                    Tu veux déplacer roib, dans ce cas, tu peux utiliser la méthode scroll

                    roib.scroll(20, 0) # déplace de 20 pixels vers la droite

                    EDIT:

                    On peut aussi aller à une position précise, pour connaître la position actuelle et aller à la position souhaitée

                    x, y = roib.get_offset()
                    roib.scroll(240-x, y)



                    -
                    Edité par Anonyme 25 mars 2015 à 18:48:53

                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 mars 2015 à 18:48:35

                      J'ai la même erreur d'affichée...

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        25 mars 2015 à 18:50:57

                        J'ai la même erreur d'affichée

                        Donnes toujours le message d'erreur donné par l'interpréteur, j'ai peur que tu es mis pos_roib, plutôt que roib

                        -
                        Edité par Anonyme 25 mars 2015 à 18:51:21

                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 mars 2015 à 18:54:40

                          pos_roib = pos_roib.scroll(240,160)
                          AttributeError: 'tuple' object has no attribute 'scroll'
                          En effet j'ai mis pos_roib mais pourquoi j'aurais du mettre roib ? roib n'est qu'une surface je ne comprends pas...
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            25 mars 2015 à 18:56:51

                            roib en effet est une surface, normal de la bouger, il faut comprendre pygame, en loadant une image, tu crées une Surface, représentant la surface de l'image, on peut la déplacer.

                            pos_roib n'est qu'un tuple, c'est un objet python, qui ne sait même pas qu'on utilise le module pygame, difficile pour lui de deviner ce que tu souhaites faire.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 mars 2015 à 19:03:23

                              Ah oui en effet..... je n'y avais pas pensé... merci beaucoup pour votre aide.

                              J'ai réussi a résoudre mon problème juste en donnant une nouvelle valeur a pos_roib, j'arrive bien a déplacer l'image mais toutes les autres surfaces présentes sur mon fond disparaissent, je suis obligé de les "bliter" a chaque fois que mes surfaces font un mouvement ?

                              EDIT : J'ai réussi il fallait juste que je "blit" pas le fond mais maintenant roib est a son ancienne position et a la nouvelle est-ce qu'il y a une manière simple pour régler ce problème ?

                              -
                              Edité par TPEROBOT 25 mars 2015 à 19:11:14

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                25 mars 2015 à 19:11:48

                                Créer peut-être une fonction update qui blittera tout cela, non?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 mars 2015 à 19:15:42

                                  Je ne sais pas faire....
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    25 mars 2015 à 19:29:12

                                    def update(screen, *surfaces):
                                        for surface in surfaces:
                                            screen.blit(surface, surface.get_offset())
                                    
                                    

                                    update(fenetre, roib, ...)

                                    Bon comme pygame est pas ma tasse de thé, je peux guère t'aider plus, il faut lire la documentation et des exemples.

                                    -
                                    Edité par Anonyme 25 mars 2015 à 19:30:05

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      25 mars 2015 à 20:35:42

                                      roib_pos doit être un rectangle pour utiliser move
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Python c'est bon, mangez-en. 

                                      Anonyme
                                        25 mars 2015 à 20:43:26

                                        Ça a déjà été dit ici

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          25 mars 2015 à 20:43:46

                                          josmiley : Si c'est un carré ça ne marche pas ?

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            25 mars 2015 à 20:44:10

                                            Merci beaucoup oldProgrammer
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Anonyme
                                              25 mars 2015 à 20:45:44

                                              @TPEROBOT,

                                              Pour transformer une Surface en Rect, il faut utiliser la méthode get_rect

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                26 mars 2015 à 18:36:38

                                                oldProgrammer a écrit:

                                                @TPEROBOT,

                                                Pour transformer une Surface en Rect, il faut utiliser la méthode get_rect

                                                Donc pour transformer ma surface en rect et la positioner a l'endroit voulu j'utilise ça : "get_rect(center=(100,100)"

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Anonyme
                                                  26 mars 2015 à 19:48:00

                                                  Eh bien essaie, non?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    28 mars 2015 à 9:52:01

                                                    Il faut utiliser get_rect(topleft=(x,Y)) pour mettre l'image a la position désirée si c'est le centre de l'image qui est a la position (x,y)
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Anonyme
                                                      28 mars 2015 à 10:37:30

                                                      je vois que tu te chier pour rien la dedans.

                                                      un tuple est un objet non mutable, on ne peux donc pas le modifier (enfin si mais c'est assez relou) item par item (genre a = 1, 1 ; a[0] += 1)

                                                      utilise plutot x et y. c'est ce que je fais pour mon jeu, et ca marche parfaitement.

                                                      exemple:

                                                      import pygame
                                                      from pygame.locals import *
                                                      
                                                      x, y = 0, 0
                                                      taille_sprite = 32
                                                      
                                                      def update(ecran, *surfaces):
                                                          for i in surfaces:
                                                              ecran.blit(i[0], i[1])
                                                      
                                                      while True:
                                                          for event in pygame.event.get():
                                                              if event.type == KEYDOWN:
                                                                  if event.key == K_LEFT:
                                                                      x -= taille_sprite
                                                                  elif event.key == K_RIGHT:
                                                                      x += taille_sprite
                                                          update(ecran, (personnage, (x, y)))
                                                      
                                                          pygame.display.flip()

                                                      j'ai pas defini ecran et personnage ici, a toi de la faire.

                                                      perso je prefere me baser la dessus, on envoie la surface ET la position dans un tuple.

                                                      par contre !! attention, avec ce code, l'ordre des arguments non nommés que l'on envoie a update est primordiale !!

                                                      envoie en premier ton fond, et en dernier ton personnage !

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        28 mars 2015 à 18:36:51

                                                        Est ce que ça te permet de blit toutes tes autres images par dessus ton fond a chaque mouvment ?
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Anonyme
                                                          28 mars 2015 à 19:15:17

                                                          oui !

                                                          relit mon message, ca depend de l'ordre dans lequel tu enverras tes images.

                                                          et pis, par la meme occas', au lieu de demander, test !

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Pygame

                                                          × 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