Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de detection de collision

module Arcade et logiciel Tiled map Editor

Sujet résolu
    16 septembre 2023 à 19:57:17

    Bonjour,

    Je me suis lancé dans la création d'un jeu open-world à l'aide du module arcade et de maps créées avec Tiled Map Editor. Je suis déjà un petit peu avancé mais je rencontre un problème. J'ai chercher partout sur internet mais n'ai trouvé nul part... Voici mon problème : le personnage se déplace avec les touches flèches, le sol de la map se divise en deux catégories : l'herbe et les chemins (pour l'instant), et le personnage détecte sur quel sol il est et s'il est sur un chemin il avance deux fois plus vite. Mais il se trouve que si vous êtes sur un chemin et que vous allez vers de l'herbe, sa vitesse ne va pas changer une fois sur l'herbe. Autrement dit : le personnage ne détecte le sol ou il se trouve que lorsque l'on relâche la touche et la réappuie. Si vous pouviez m'aider, ce serait super !

    import arcade
    
    class MyGame(arcade.Window):
        def __init__(self):
            ###
    
        def setup(self):
            ###
        def on_draw(self):
            ###
    
        def on_key_press(self, key, modifiers):
            if key == arcade.key.UP:
                self.player_sprite.change_y = self.speed
                self.player_sprite.change_x = 0
                self.player_sprite.texture = arcade.load_texture(self.texture_paths["up"])
            if key == arcade.key.DOWN:
                self.player_sprite.change_x = 0
                self.player_sprite.change_y = -self.speed
                self.player_sprite.texture = arcade.load_texture(self.texture_paths["down"])
            if key == arcade.key.LEFT:
                self.player_sprite.change_y = 0
                self.player_sprite.change_x = -self.speed
                self.player_sprite.texture = arcade.load_texture(self.texture_paths["left"])
            if key == arcade.key.RIGHT:
                self.player_sprite.change_y = 0
                self.player_sprite.change_x = self.speed
                self.player_sprite.texture = arcade.load_texture(self.texture_paths["right"])
    
        def on_key_release(self, key, modifiers):
            if key == arcade.key.UPorkey == arcade.key.DOWN:
                self.player_sprite.change_y = 0
            if key == arcade.key.LEFTorkey == arcade.key.RIGHT:
                self.player_sprite.change_x = 0
    
        def center_camera_to_player(self):
            ###
    
        def update(self, deltatime):
           ways_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.scene[LAYER_NAME_WAYS])
    
           if ways_hit_list:
               self.speed = 2
           else:
               self.speed = 1
           
           ###
    
    def main():
        window = MyGame()
        window.setup()
        arcade.run()
    
    if __name__ == "__main__":
        main()

    -
    Edité par Molinus 20 septembre 2023 à 20:38:56

    • Partager sur Facebook
    • Partager sur Twitter
      17 septembre 2023 à 11:07:38

      Bonjour,

      En soit la problématique de détecter et modifier une vitesse n'est pas complexe, je te fais confiance sur le fait de savoir résoudre cela.

      Je pense que tu devrais utiliser un debugger tel pdb par exemple et qui te permettra d'y placer un point d'arrêt pour vérifier qu'au moment où ton personnage se déplace d'un endroit à un autre, tu rentres bien dans la fonction ou la méthode te permettant de modifier la vitesse.

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        17 septembre 2023 à 18:25:30

        fred1599 a écrit:

        Bonjour,

        En soit la problématique de détecter et modifier une vitesse n'est pas complexe, je te fais confiance sur le fait de savoir résoudre cela.

        Je pense que tu devrais utiliser un debugger tel pdb par exemple et qui te permettra d'y placer un point d'arrêt pour vérifier qu'au moment où ton personnage se déplace d'un endroit à un autre, tu rentres bien dans la fonction ou la méthode te permettant de modifier la vitesse.


        Oula😅... un petit pas compliqué tout ça non ? Je n'ai pas tout compris mais je vais faire quelques recherches sur "pdb"... Merci en out cas pour ta réponse :)
        • Partager sur Facebook
        • Partager sur Twitter
          18 septembre 2023 à 9:58:40

          Salut,

          Quel éditeur de texte utilises-tu avec python ?

          Déjà si tu mettais des prints pour savoir si tu passes bien par ta méthode et quelle valeur prend ta variable:

          def center_camera_to_player(self):
                 print("Ok")
                 ways_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.scene[LAYER_NAME_WAYS])
            
                 print(ways_hit_list)
                 if ways_hit_list:
                     self.speed = 2
                 else:
                     self.speed = 1



          -
          Edité par Garkam 18 septembre 2023 à 10:34:14

          • Partager sur Facebook
          • Partager sur Twitter
            18 septembre 2023 à 16:46:18

            Garkam a écrit:

            Salut,

            Quel éditeur de texte utilises-tu avec python ?

            Déjà si tu mettais des prints pour savoir si tu passes bien par ta méthode et quelle valeur prend ta variable:

            def center_camera_to_player(self):
                   print("Ok")
                   ways_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.scene[LAYER_NAME_WAYS])
              
                   print(ways_hit_list)
                   if ways_hit_list:
                       self.speed = 2
                   else:
                       self.speed = 1

            Bonjour,

            J'ai fait plein de tests comme celui-ci, et j'ai trouvé quelque chose : la vitesse se modifie bien en fonction du sol où le personnage se trouve. Le problème change donc : maintenant c'est que lorsque j'appuie sur une touche pour se déplacer, la vitesse pris en compte pour tout le déplacement jusqu'au relâchement de la touche, est celle captée juste au moment d'enfoncer la touche... Là j'ai bloqué, j'ai essayé de déplacé la fonction de place, de créer une nouvelle fonction pour l'appel de la détection de vitesse, rien n'y fait... J'en peut plus ;-;

            • Partager sur Facebook
            • Partager sur Twitter
              18 septembre 2023 à 16:55:52

              La doc étant imbuvable , juste une idée comme ça , self.player_sprite.speed au lieu de self.speed peut-être.
              • Partager sur Facebook
              • Partager sur Twitter

              Python c'est bon, mangez-en. 

                18 septembre 2023 à 18:28:01

                josmiley a écrit:

                La doc étant imbuvable , juste une idée comme ça , self.player_sprite.speed au lieu de self.speed peut-être.


                Excusez-moi pour "l'imbuvabilité" de mon code, mais je ne pouvais pas mettre l'entièreté de celui-ci pour cause de ces 500 lignes et quelques : je ne voulais pas remplir la page de lignes inutiles. A part ça c'aurait pu être une bonne idée mais le problème ne vient pas de cet origine, 
                self.player_sprite.speed

                et

                self.speed

                sont deux variables distinctes et c'est fait exprès, je ne l'ai pas fait au hasard. La première est la vitesse actuelle du personnage en temps réel et l'autre est la distance à parcourir lors de l'appui sur les touches de déplacement.

                Si quelqu'un a une autre idée telle quelle soit, n'hésitez pas !

                -
                Edité par Molinus 18 septembre 2023 à 18:29:32

                • Partager sur Facebook
                • Partager sur Twitter
                  18 septembre 2023 à 19:17:31

                  Est-ce que le code que tu nous montres dans camera_center_to_player, ne devrait pas être fait lors de l'appui des touches (à la sortie des if par exemple)?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 septembre 2023 à 19:42:33

                    C'est pas ton code qui est imbuvable , c'est la doc de la lib arcade.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Python c'est bon, mangez-en. 

                      18 septembre 2023 à 21:55:52

                      Première idée :

                      La méthode 

                      arcade.check_for_collision_with_list()

                      retourne une liste des éléments en collision avec ton sprite, si tu es en collision avec le chemin, elle retourne un élément, idem avec l'herbe, donc ta condition n'est pas bonne, il faut l'affiner.

                      Deuxième idée :

                      appeler ta méthode

                      center_camera_to_player()


                      dans

                      on_key_press()



                      -
                      Edité par Garkam 18 septembre 2023 à 22:00:53

                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 septembre 2023 à 20:43:22

                        Bonjour,

                        Tout d'abord merci de ta réponse.

                        Ensuite ta 1e idée pourrait marcher si la méthode arcade.check_for_collision_with_list() ne renvoyait pas [] quand le perso touche de l'herbe :p

                        Ta 2e idée pourrait marcher mais la fonction update où est inclue la condition pour la detection du sol est déjà appelée tout les 1/60 secondes, donc je pense que c'est suffisant... et j'ai fait des test (avec point d'arrets et print()) pour vérifier si l'update se faisait bien lors du deplacement du personnage.

                        Merci encore !

                        Garkam a écrit:

                        Première idée :

                        La méthode 

                        arcade.check_for_collision_with_list()

                        retourne une liste des éléments en collision avec ton sprite, si tu es en collision avec le chemin, elle retourne un élément, idem avec l'herbe, donc ta condition n'est pas bonne, il faut l'affiner.

                        Deuxième idée :

                        appeler ta méthode

                        center_camera_to_player()


                        dans

                        on_key_press()





                        -
                        Edité par Molinus 20 septembre 2023 à 20:44:52

                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 octobre 2023 à 8:47:47

                          Bonjour,

                          Je ressort ce sujet pour vous dire que j'ai trouvé une solution ailleurs. Merci encore de m'avoir fourni des pistes. Le sujet est clos ! Bonne continuation à tous !

                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 octobre 2023 à 9:09:09

                            Bonjour, Il serait intéressant pour les futures visiteurs de ce sujet de connaitre la solution que vous avez trouvée. Pourriez vous la poster? Merci. 

                            Sujet résolu

                            Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

                            -
                            Edité par AbcAbc6 4 octobre 2023 à 9:09:28

                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 octobre 2023 à 17:02:32

                              Bonjour,

                              La solution était d'appeler a chaque fois qu'une touche était pressée, une fonction qui permettait de détecter le type de sol. Une fonction qui n'était pas la update() car elle n'était appelée qu'a l'entrée de la touche et a sa sortie...

                                  def update_player_speed(self):
                                      self.player_sprite.change_x = 0
                                      self.player_sprite.change_y = 0
                              
                                      ways_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.scene[LAYER_NAME_WAYS])
                                 
                                      if ways_hit_list:
                                          self.speed = 2
                                      else:
                                          self.speed = 1
                              
                                      if self.up_pressed and not self.down_pressed:
                                          self.player_sprite.change_y = self.speed
                                      elif self.down_pressed and not self.up_pressed:
                                          self.player_sprite.change_y = -self.speed
                                      if self.left_pressed and not self.right_pressed:
                                          self.player_sprite.change_x = -self.speed
                                      elif self.right_pressed and not self.left_pressed:
                                          self.player_sprite.change_x = self.speed
                              
                              
                                  def on_key_press(self, key, modifiers):
                                      if key == arcade.key.UP:
                                          self.up_pressed = True
                                          self.update_player_speed()
                                          self.player_sprite.texture = arcade.load_texture(self.texture_paths["up"])
                                      if key == arcade.key.DOWN:
                                          self.down_pressed = True
                                          self.update_player_speed()
                                          self.player_sprite.texture = arcade.load_texture(self.texture_paths["down"])
                                      if key == arcade.key.LEFT:
                                          self.left_pressed = True
                                          self.update_player_speed()
                                          self.player_sprite.texture = arcade.load_texture(self.texture_paths["left"])
                                      if key == arcade.key.RIGHT:
                                          self.right_pressed = True
                                          self.update_player_speed()
                                          self.player_sprite.texture = arcade.load_texture(self.texture_paths["right"])
                              
                                  def on_key_release(self, key, modifiers):
                                      if key == arcade.key.UP:
                                          self.up_pressed = False
                                          self.update_player_speed()
                                      elif key == arcade.key.DOWN:
                                          self.down_pressed = False
                                          self.update_player_speed()
                                      elif key == arcade.key.LEFT:
                                          self.left_pressed = False
                                          self.update_player_speed()
                                      elif key == arcade.key.RIGHT:
                                          self.right_pressed = False
                                          self.update_player_speed()



                              • Partager sur Facebook
                              • Partager sur Twitter

                              Problème de detection de collision

                              × 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