LODM (L'Oasis des Makers)
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

LODM (L'Oasis des Makers)

Forum d'étude sur le Making RMXP
 
AccueilPortailRechercherDernières imagesS'enregistrerConnexion
-28%
Le deal à ne pas rater :
Brandt LVE127J – Lave-vaisselle encastrable 12 couverts – L60cm
279.99 € 390.99 €
Voir le deal

 

 Pathfinding : "trouver un chemin vers"

Aller en bas 
4 participants
AuteurMessage
Åvygeil
Chercheur



Nombre de messages : 5
Age : 38
Projet Principal : Going Berserk !
Surnom : Trve Scriptevr ov Steel
Date d'inscription : 20/04/2007

Pathfinding : "trouver un chemin vers" Empty
MessageSujet: Pathfinding : "trouver un chemin vers"   Pathfinding : "trouver un chemin vers" Icon_minitimeSam 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 suivant
https://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
Revenir en haut Aller en bas
Roys
Guide
Guide
Roys


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

Pathfinding : "trouver un chemin vers" Empty
MessageSujet: Re: Pathfinding : "trouver un chemin vers"   Pathfinding : "trouver un chemin vers" Icon_minitimeJeu 17 Mai - 1:37

Salut Avy
Un petit syntax error ligne 124
return "[email]#{@x}-#{@y[/email]}"
Revenir en haut Aller en bas
https://lodm.forumactif.com
Åvygeil
Chercheur



Nombre de messages : 5
Age : 38
Projet Principal : Going Berserk !
Surnom : Trve Scriptevr ov Steel
Date d'inscription : 20/04/2007

Pathfinding : "trouver un chemin vers" Empty
MessageSujet: Re: Pathfinding : "trouver un chemin vers"   Pathfinding : "trouver un chemin vers" Icon_minitimeJeu 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 =)
Revenir en haut Aller en bas
dams999




Nombre de messages : 12
Date d'inscription : 12/05/2007

Pathfinding : "trouver un chemin vers" Empty
MessageSujet: Re: Pathfinding : "trouver un chemin vers"   Pathfinding : "trouver un chemin vers" Icon_minitimeSam 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
Revenir en haut Aller en bas
Åvygeil
Chercheur



Nombre de messages : 5
Age : 38
Projet Principal : Going Berserk !
Surnom : Trve Scriptevr ov Steel
Date d'inscription : 20/04/2007

Pathfinding : "trouver un chemin vers" Empty
MessageSujet: Re: Pathfinding : "trouver un chemin vers"   Pathfinding : "trouver un chemin vers" Icon_minitimeSam 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]
Revenir en haut Aller en bas
Åvygeil
Chercheur



Nombre de messages : 5
Age : 38
Projet Principal : Going Berserk !
Surnom : Trve Scriptevr ov Steel
Date d'inscription : 20/04/2007

Pathfinding : "trouver un chemin vers" Empty
MessageSujet: Re: Pathfinding : "trouver un chemin vers"   Pathfinding : "trouver un chemin vers" Icon_minitimeMar 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.
Revenir en haut Aller en bas
Roys
Guide
Guide
Roys


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

Pathfinding : "trouver un chemin vers" Empty
MessageSujet: Re: Pathfinding : "trouver un chemin vers"   Pathfinding : "trouver un chemin vers" Icon_minitimeMar 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"
Revenir en haut Aller en bas
https://lodm.forumactif.com
dani_nouvel_star
Chercheur
dani_nouvel_star


Nombre de messages : 18
Age : 43
Surnom : dani
Date d'inscription : 29/03/2007

Pathfinding : "trouver un chemin vers" Empty
MessageSujet: Re: Pathfinding : "trouver un chemin vers"   Pathfinding : "trouver un chemin vers" Icon_minitimeMar 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 geek
Revenir en haut Aller en bas
Contenu sponsorisé





Pathfinding : "trouver un chemin vers" Empty
MessageSujet: Re: Pathfinding : "trouver un chemin vers"   Pathfinding : "trouver un chemin vers" Icon_minitime

Revenir en haut Aller en bas
 
Pathfinding : "trouver un chemin vers"
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» "Au contact de" Demarre si touche un event
» "un pas loin" Eloigne un event d'un autre
» Deplace l'event/Joueur vers un autre event

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
LODM (L'Oasis des Makers) :: Groupe pour Scripts :: Outils pour Event-Maker-
Sauter vers:  
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser