Åvygeil Chercheur
Nombre de messages : 5 Age : 38 Projet Principal : Going Berserk ! Surnom : Trve Scriptevr ov Steel Date d'inscription : 20/04/2007
| Sujet: Pathfinding : "trouver un chemin vers" Sam 21 Avr - 11:12 | |
| Bonjour Voici une petit fonction qui permet d'appeler en event la fonction "trouver un chemin vers" qui n'existe pas dans RPG Maker XP Il vous suffit d'ajouter un commentaire avec trouver un chemin vers "Event" et l'event va trouver le chemin le plus court vers "Event" et l'emprunter. Vous pouvez remplacer "Event" par - joueur, pour se rendre si possible vers le joueur - le nom d'un event Avant tout il vous faut installer le script suivanthttps://lodm.forumactif.com/Groupe-pour-Scripts-f4/Outils-pour-Event-Maker-f7/-p105.htm#105 Ajouter un script et appelez le "Pathfinding" - Code:
-
#=============================================================================== # ■ Pathfinding #------------------------------------------------------------------------------- # Auteur : Åvygeil # Version : 1.2 # Date : 20/04/2007 #------------------------------------------------------------------------------- # Ce script contient une panoplie de fonctionnalités qui permettent au joueur # et aux évènements de trouver automatiquement un chemin. #------------------------------------------------------------------------------- # Utilisation : # # # Event Makers : # # - Inserer un commentaire dans un event et taper : trouver un chemin vers x # # - Remplacer x par # joueur si vous voulez que votre event se déplace vers le joueur # ou # le nom de l'event vers lequel vous voulez vous déplacer # # # Scripteurs : # # - Game_Character#find_path_to(x,y) : permet au joueur et aux évènements # de se rendre si possible aux coordonnées (x,y) de la carte. # # - Game_Character#find_path_to_event("nom") : permet au joueur et aux # évènements de se rendre si possible auprès de l'évènement dont # le nom est "nom". # # - Game_Event#find_path_to_player : permet aux évènements de se rendre # si possible auprès du joueur. #===============================================================================
#=============================================================================== # ▼ Interpreter #=============================================================================== class Interpreter #============================================================================= # ● command_108 #----------------------------------------------------------------------------- # Permet d'ajouter une fonction de pathfinding en commentaire dans un event. #============================================================================= alias pathfinding_command108 command_108 def command_108 # Commande non valide if not @parameters[0].split.size < 5 # Commande valide if @parameters[0].upcase[/TROUVER UN CHEMIN VERS/]=="TROUVER UN CHEMIN VERS" #---------------------- # Recupère le nom de l'event event_nom = @parameters[0].split[4] #---------------------- # se diriger vers le joueur if event_nom.upcase == "JOUEUR" $game_map.events[@event_id].find_path_to_player return true end #---------------------- # Cherche l'event vers qui se diriger $game_map.events[@event_id].find_path_to_event(event_nom) return true end end pathfinding_command108 end
end
#=============================================================================== # ▼ Pathfinding #------------------------------------------------------------------------------- # Le module principal contenant les éléments de l'algorithme. #=============================================================================== module Pathfinding @@x_to_go = 0 # l'abscisse de la destination @@y_to_go = 0 # l'ordonnée de la destination def Pathfinding.x_to_go return @@x_to_go end def Pathfinding.y_to_go return @@y_to_go end #============================================================================= # ▼ Square #----------------------------------------------------------------------------- # Une classe utilisée dans l'algorithme A* de recherche d'un chemin. #============================================================================= class Square attr_reader :x, :y # coordonnées du carreau attr_reader :parent # carreau parent attr_reader :g_score # coût de déplacement à partir du parent attr_reader :h_score # coût de la distance restante à parcourir attr_reader :f_score # coût total #=========================================================================== # ● initialize # x : abscisse du carreau # y : ordonnée du carreau # parent : carreau parent #--------------------------------------------------------------------------- # Méthode d'initialisation du carreau. #=========================================================================== def initialize(x, y, parent) @x = x @y = y @parent = parent calculate_scores(parent) end #=========================================================================== # ● id #--------------------------------------------------------------------------- # Méthode qui renvoie l'identifiant du carreau : "x-y". #=========================================================================== def id return "#{@x}-#{@y}" end #=========================================================================== # ● calculate_scores # parent : Square parent #--------------------------------------------------------------------------- # Méthode qui recalcule les divers coûts nécessaires à A*, # en fonction du noeud parent. #=========================================================================== def calculate_scores(parent) if parent == nil @g_score = 0 elsif @g_score == nil or @g_score > parent.g_score + 1 @g_score = parent.g_score + 1 @parent = parent end @h_score = remaining_distance @f_score = @g_score + @h_score end #=========================================================================== # ● distance_to # x : abscisse à atteindre # y : ordonnée à atteindre #--------------------------------------------------------------------------- # Méthode qui calcule la distance de Manhattan entre le carreau # et les coordonnées (x,y). #=========================================================================== def remaining_distance return (@x - Pathfinding.x_to_go).abs + (@y - Pathfinding.y_to_go).abs end #=========================================================================== # ● to_movecommand #--------------------------------------------------------------------------- # Méthode qui renvoie un objet RPG::MoveCommand en fonction du mouvement # nécessaire vers le carreau, à partir de son parent. #=========================================================================== def to_movecommand return nil if parent == nil mc = RPG::MoveCommand.new if self.x < parent.x mc.code = 2 elsif self.x > parent.x mc.code = 3 elsif self.y < parent.y mc.code = 4 elsif self.y > parent.y mc.code = 1 end return mc end end #============================================================================= # ● create_path_to # x_end : abscisse à atteindre # y_end : ordonnée à atteindre #----------------------------------------------------------------------------- # Méthode qui renvoie un objet MoveRoute, chemin vers les # coordonnées (x_end,y_end). #============================================================================= def create_path_to(x_end, y_end) @@x_to_go = x_end @@y_to_go = y_end open_list = {} closed_list = {} # On ajoute le carré du début à la liste ouverte. current_square = Square.new(@x,@y,nil) open_list[current_square.id] = current_square # Tant que le but n'est pas dans la liste fermée # et que la liste ouverte n'est pas vide while not closed_list.has_key?("#{x_end}-#{y_end}") and not open_list.empty? # on cherche dans la liste ouverte le carré dont le f est minimum current_square = open_list.values.min {|s1,s2| s1.f_score <=> s2.f_score} # on le supprime de la liste ouverte et on le met dans la liste fermée open_list.delete(current_square.id) closed_list[current_square.id] = current_square # Pour les 4 directions (down, left, right, up) # si le carré est infranchissable ou si il fait partie de la liste fermée, # il est ignoré. # Sinon si il ne fait pas partie de la liste ouverte, on l'y ajoute, # sinon on recalcule ses scores et son parent en fonction du carré courant current_x = current_square.x current_y = current_square.y # down id = "#{current_x}-#{current_y + 1}" if passable?(current_square.x, current_square.y, 2) and not closed_list.has_key?(id) if not open_list.has_key?(id) open_list[id] = Square.new(current_x, current_y + 1, current_square) else open_list[id].calculate_scores(current_square) end end # left id = "#{current_x - 1}-#{current_y}" if passable?(current_square.x, current_square.y, 4) and not closed_list.has_key?(id) if not open_list.has_key?(id) open_list[id] = Square.new(current_x - 1, current_y, current_square) else open_list[id].calculate_scores(current_square) end end # right id = "#{current_x + 1}-#{current_y}" if passable?(current_square.x, current_square.y, 6) and not closed_list.has_key?(id) if not open_list.has_key?(id) open_list[id] = Square.new(current_x + 1, current_y, current_square) else open_list[id].calculate_scores(current_square) end end # up id = "#{current_x}-#{current_y - 1}" if passable?(current_square.x, current_square.y, 8) and not closed_list.has_key?(id) if not open_list.has_key?(id) open_list[id] = Square.new(current_x, current_y - 1, current_square) else open_list[id].calculate_scores(current_square) end end end # On construit la route de déplacement en remontant # de parent en parent à partir du but. move_route = RPG::MoveRoute.new move_route.repeat = false move_route.skippable = true if closed_list.has_key?("#{x_end}-#{y_end}") current_square = closed_list["#{x_end}-#{y_end}"] while current_square != nil move_command = current_square.to_movecommand if move_command != nil move_route.list = [move_command] + move_route.list end current_square = current_square.parent end end return move_route end end #=============================================================================== # ▼ Game_Character #------------------------------------------------------------------------------- # On ajoute à la classe Game_Character les méthodes de recherche d'un chemin # vers des coordonnées précises ou vers un évènement. #=============================================================================== class Game_Character include Pathfinding attr_writer :through # traversable ou pas #============================================================================= # ● find_path_to # x : abscisse à atteindre # y : ordonnée à atteindre #----------------------------------------------------------------------------- # Méthode qui fait se déplacer vers les coordonnées (x,y). #============================================================================= def find_path_to(x,y) move_route = create_path_to(x,y) force_move_route(move_route) end #============================================================================= # ● find_path_to_event # event_name : nom de l'évènement à atteindre #----------------------------------------------------------------------------- # Méthode qui fait se déplacer vers l'évènement dont le nom et event_name. #============================================================================= def find_path_to_event(event_name) event = $game_map.events.values.find{|e| e.name == event_name} event.through = true move_route = create_path_to(event.x, event.y) event.through = false force_move_route(move_route) end end
#=============================================================================== # ▼ Game_Event #------------------------------------------------------------------------------- # On ajoute à la classe Game_Event la méthode de recherche d'un chemin # vers le joueur. #=============================================================================== class Game_Event < Game_Character #============================================================================= # ● find_path_to_player #----------------------------------------------------------------------------- # Méthode qui fait se déplacer vers le joueur. #============================================================================= def find_path_to_player $game_player.through = true move_route = create_path_to($game_player.x, $game_player.y) $game_player.through = false force_move_route(move_route) end end
Dernière édition par le Mar 12 Juin - 8:21, édité 9 fois | |
|
Roys Guide
Nombre de messages : 111 Age : 52 Projet Principal : Le Crépuscule des Dieux Aide Recherchée pour : des chara aRPG Surnom : Scripteur Monomaniaque Date d'inscription : 24/02/2007
| Sujet: Re: Pathfinding : "trouver un chemin vers" Jeu 17 Mai - 1:37 | |
| Salut Avy Un petit syntax error ligne 124 return "[email]#{@x}-#{@y[/email]}" | |
|
Åvygeil Chercheur
Nombre de messages : 5 Age : 38 Projet Principal : Going Berserk ! Surnom : Trve Scriptevr ov Steel Date d'inscription : 20/04/2007
| Sujet: Re: Pathfinding : "trouver un chemin vers" Jeu 17 Mai - 14:13 | |
| Rhaaa je ne sais pas pourquoi, mais des bornes BB [email/] se sont glissées (peut-être dû à cause des @ ?) J'édite de suite enlever ses cochonneries, en espérant e pas perdre le formatage. Sinon j'ai vu que tu as retouché le mini parser d'events. Ca fait plus propre d'un coup =) | |
|
dams999
Nombre de messages : 12 Date d'inscription : 12/05/2007
| Sujet: Re: Pathfinding : "trouver un chemin vers" Sam 19 Mai - 2:25 | |
| Ligne 68 du script il y a encore un rapport d'erreur lorsque je change de map: "pathfinding_command108" Entre tout les "end".
Edit: ? une image c'est glissé dans le message ?
Dernière édition par le Sam 19 Mai - 7:54, édité 1 fois | |
|
Åvygeil Chercheur
Nombre de messages : 5 Age : 38 Projet Principal : Going Berserk ! Surnom : Trve Scriptevr ov Steel Date d'inscription : 20/04/2007
| Sujet: Re: Pathfinding : "trouver un chemin vers" Sam 19 Mai - 5:43 | |
| Heu... si tu uploades pas ton image, je risque pas de voir l'erreur =) Jusqu'à preuve du contraire, j'ai pas accès à ton disque E:... [edit] Bon je viens de faire un copier/coller à partir du script à partir du forum et mes doutes sur les bugs du forum sont bien fondés... J'ai des "1" qui sont apparus, des "+" qui ont disparus... Je vais récupérer une bonne version chez moi, et e vais éditer le 1er post sous Firefox. Surement une histoire d'incompatibilité avec Internet Explorer. Jusqu'à nouvel ordre, personne ne doit prendre ce script complètement buggé. [/edit] | |
|
Åvygeil Chercheur
Nombre de messages : 5 Age : 38 Projet Principal : Going Berserk ! Surnom : Trve Scriptevr ov Steel Date d'inscription : 20/04/2007
| Sujet: Re: Pathfinding : "trouver un chemin vers" Mar 12 Juin - 8:29 | |
| Je viens de faire un edit du script sous Firefox en ayant enlever tous les bugs. Je viens de tester en reprenant le script à partir du forum, à priori ca marche. Dans un prochaine version quand j'aurais un peu plus de temps, je modifierais pour qu'on puisse utiliser cette commande sur le joueur et pas que sur un event. | |
|
Roys Guide
Nombre de messages : 111 Age : 52 Projet Principal : Le Crépuscule des Dieux Aide Recherchée pour : des chara aRPG Surnom : Scripteur Monomaniaque Date d'inscription : 24/02/2007
| Sujet: Re: Pathfinding : "trouver un chemin vers" Mar 12 Juin - 12:17 | |
| Un grand merci Avy et LOL car j ai fait la meme modif (avec joueur) pour les autres scripts, donc yep ca serait cool d avoir le meme principe pour le joueur. Dans ce cas j ai elargi le nom de la commande dans le genre Un pas event1 vers event2 "event1" ou "event2" pouvant etre "joueur" | |
|
dani_nouvel_star Chercheur
Nombre de messages : 18 Age : 43 Surnom : dani Date d'inscription : 29/03/2007
| Sujet: Re: Pathfinding : "trouver un chemin vers" Mar 12 Juin - 16:26 | |
| J'ai scripté une méthode du même genre "se diriger vers un game_character" et j'ai aussi rajouter un autre argument : une distance d'approche. Un game_character se dirige vers un autre game_character si la distance entre lui et sa cible dépasse une certaine distance. Ca m'a permis de faire suivre des pnjs vers le game_player en gardant une certaines distances entre eux comme fait le script chenille mais là ça s'applique aussi pour du pix par pix. Voilà c'est juste pour donner des idées d'améliorations pour les commandes d'events si ce n'est pas déjà fait lol et si ça se trouve le script d'Âvygeil le fait déjà et dans ce cas là ignorez tous ce que je viens d'écrire et moi out en silence | |
|
Contenu sponsorisé
| Sujet: Re: Pathfinding : "trouver un chemin vers" | |
| |
|