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 !
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.
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)
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
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 ;-;
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 !
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)?
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.
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
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.
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 !
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()
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.
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)
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.