Aller en bas
vincentmhd
vincentmhd
Membre

Nombre de messages : 9
Age : 37
Localisation : Amiens
Distinction : aucune
Date d'inscription : 06/03/2009
http://vincentmhdmaker.canalblog.com/

Mouvements aléatoires restreints Empty Mouvements aléatoires restreints

Dim 18 Oct 2009 - 18:59
Mouvements aléatoires restreints




-Description


Ce script permet de laisser un event libre de ses mouvements, tout en le gardant dans une zone confinée. Parfois par logique ou seulement par nécéssité, il normal de vouloir éviter qu'un event vienne s'incruster dans un endroit inapproprié de la map. Ou juste pour faire moins désordre.


-Le script


Code:
#==============================================================================
#
#
#                            Mvt Aléa Limité.v2
#
#
#===============================================================================
#
#By Vincentmhd
#http://vincentmhdmaker.canalblog.com/
#
#01/09/2009
#25/09/2009 .v2 ajout des zones relatives...
#
#
#
#=====================================NOTE======================================
#
#
#-------------------------------------------------------------------------------
#
#Ce script permet de mettre un event en déplacement aléatoire sans pour autant
#le lâcher sur toute la carte, il est limité à un rectangle sur la map défini
#par vos soins.
#Pour le faire, il y a 2 méthodes: par coordonnées absolues et par relatives
#
#Pour les absolues c'est simple: il suffit d'inserer:
#move_random_in(bottom, left, right, top)
#Les arguments correspondent directement aux coordonnées de l'espace marchage
#sur la map.
#
#Pour les relatives: il faut d'inserer:
#-move_random_around(bottom, left, right, top)
#Les arguments correspondent directement aux coordonnées de l'espace marchable
#par rapport à la position "initiale". Celle-ci peut être réinitialisée,
#manuellement, et automatiquement.
#La méthode manuelle est la suivante: Set_center( x, y)
#La méthode automatique est activée par défaut, elle s'active et se désactive
#comme ceci:
#Set_follow(bool)
#Automatisme consiste à appeler Set_center(), dès que l'event est déplacé
#artifitiellement.
#===============================================================================
class Game_Character

  attr_accessor :init_x, :init_y, :init_move
 
  alias alea_initialize initialize
  def initialize
    @init_move = true
    alea_initialize
    @init_x = 0
    @init_y = 0
  end
   
 
  #--------------------------------------------------------------------------
  # * Move at Random in map coord
  #--------------------------------------------------------------------------
  def move_random_in(bottom, left, right, top)
    case rand(4)
    when 0
      if !(@y+1 > bottom)
        move_down(false)
      end
    when 1 
      if !(@x-1 < left)
        move_left(false)
      end
    when 2
      if !(@x+1 > right)
        move_right(false)
      end
    when 3
      if !(@y-1 < top)
        move_up(false)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Move at Random in relative rect centre sur l'event
  #--------------------------------------------------------------------------
  #Cette méthode est variante de la première elle permet de
  #délimiter le rectangle relativement.
  #Ce rectangle est centré sur la position initiale du perso.
  def move_random_around(bottom, left, right, top)
    if (@init_move!= nil)&&(@init_move == true)
      Set_center()
      @init_move = false
    end
    case rand(4)
    when 0
      if !(@y+1 > (@init_y + bottom))
        move_down(false)
      end
    when 1 
      if !(@x-1 < (@init_x - left))
        move_left(false)
      end
    when 2
      if !(@x+1 > (@init_x + right))
        move_right(false)
      end
    when 3
      if !(@y-1 < (@init_y - top))
        move_up(false)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Change the center of the square
  #--------------------------------------------------------------------------
  #Cette méthode permet de modifier le centre du rectangle.
  def Set_center( x =@x, y =@y)
      @init_x = x
      @init_y = y
      if @init_move != nil
        @init_move = false
      end
  end
  #--------------------------------------------------------------------------
  # * Move Type : Custom
  #--------------------------------------------------------------------------
  #Permet de faire suivre le rect si le perso est déplacé artificiellement
  alias alea_move_type_custom move_type_custom
  def move_type_custom
    if stopping?
      command = @move_route.list[@move_route_index] 
      @move_failed = false
      if command.code != 0
        if (command.code < 14)&&(@init_move != nil)
          @init_move = true
        end
      end
      alea_move_type_custom
    end
  end
  #--------------------------------------------------------------------------
  #
  #--------------------------------------------------------------------------
  #Permet de faire dire si le rect doit suivre le perso si il est déplacé
  #artifitiellement
  def Set_follow(bool)
    if bool
      @init_move = true
    else
      @init_move = nil
    end
  end
end


class Game_Event
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    map_id : map ID
  #    event  : event (RPG::Event)
  #--------------------------------------------------------------------------
  alias alea_event_initialize initialize
  def initialize(map_id, event)
    alea_event_initialize(map_id, event)
    Set_center()
  end
end




-Installation

Ce script n'échappe pas à la régle du "copiez en dessous de material".
Il n'a pas de nécéssité particulière.
Compatibilité optimale, puis que ce n'est que l'ajout d'une méthode...

-Utilisation

Tout les appels de script qui suivent se font dans la commande "déplacer un événement/ un héros".
Il y a 2 méthodes: la méthode utilisant les coordonnées absolues, et l'autre les relatives.

Coordonnées Absolues
Il suffit d'appeler un script dans la trajectoire à définir par votre personnage:
-move_random_in(bottom, left, right, top)
La zone est rectangulaire. Bottom, left, right, top correspondent aux coordonnées sur la map des côtés du rectangle, respectivement, le bas, la gauche, la droite, puis le haut.

Un screen:

Mouvements aléatoires restreints 43521258


Coordonnées Relatives
il faut d'inserer comme pour la méthode absolue:
-move_random_around(bottom, left, right, top)
Les arguments correspondent aux coordonnées de l'espace marchable par rapport à la position "initiale" de l'event.
Elle prend que des entiers positifs.
Par exemple move_random_around(1, 1, 1, 1)
Laissera un event libre dans un carré de 3 côtés par rapport à sa position initiale.
Celle-ci peut être réinitialisée, manuellement, et automatiquement, au cas où vous avez besoin de déplacer l'event.
La méthode manuelle est la suivante: Set_center( x, y)
La méthode automatique est activée par défaut, elle s'active et se désactive comme ceci: Set_follow(bool)
L'automatisme consiste à appeler Set_center(), dès que l'event est déplacé. (Pour résumer la zone de liberté suit le personnage si vous le déplacez autrement que par le script.


-Démo

Une toute petite démo: Démo
ancienne version avec seulement la méthode absolue.

-Crédit: Vincentmhd
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum