[Ace] – Map Zoom Ace Addon

Ceci est un add-on au script Map Zoom Ace, permettant de zoomer sur une position précise de la carte, ou sur un évènement.
 
Installation :
Cet add-on nécessite le script Map Zoom Ace en V.1.1, placé
directement au-dessus de ce script.
 
Utilisation :
Deux commandes en script sont utilisables :

  • Zoom sur une position de la carte :
    MGC.zoom_on_position(abscisse, ordonnée, nouvelle valeur de zoom, durée de la transition)
    L’abscisse (coordonnée horizontale) et l’ordonnée (coordonnée verticale) sont exprimées en carreaux (tiles)
  • Zoom sur un évènement dans la carte :
    MGC.zoom_on_event(identifiant de l'évènement, nouvelle valeur de zoom, durée de la transition)

La commande existante MGC.to_map_zoom(nouvelle valeur de zoom, durée de la transition) recentre systématiquement la carte sur le joueur.
 
Script :

#====================================================================
# Map Zoom Ace Addon
# v.1.0
# Auteur : MGC
#
# Permet de zoomer sur une position de la carte, ou sur un évènement.
#
# Nécessite :
# - le script "Map Zoom Ace" du même auteur en V.1.1, placé
#   directement au-dessus de ce script
#
# Utilisation :
# - au sujet de commande existante :
#   MGC.to_map_zoom(nouvelle valeur de zoom, durée de la transition)
#   Cette commande centre systématiquement la vue sur le joueur.
# - nouvelle commande pour zoomer sur une position de la carte
#   MGC.zoom_on_position(abscisse, ordonnée, nouvelle valeur de zoom, durée de la transition)
#   L'abscisse (x) et l'ordonnée (y) sont exprimées en tiles.
# - nouvelle commande pour zoomer sur un évènement
#   MGC.zoom_on_event(identifiant de l'évènement, nouvelle valeur de zoom, durée de la transition)
#====================================================================
module MGC
  #--------------------------------------------------------------------------
  # * Pour zoomer sur une position (valeurs en tiles)
  #--------------------------------------------------------------------------
  def self.zoom_on_position(pos_x, pos_y, new_zoom, duration)
    @pos_x = pos_x
    @pos_y = pos_y
    @free_camera = true
    self.process_to_map_zoom(new_zoom, duration)
  end
  #--------------------------------------------------------------------------
  # * Pour zoomer sur un évènement
  #--------------------------------------------------------------------------
  def self.zoom_on_event(event_id, new_zoom, duration)
    event = $game_map.events[event_id]
    @pos_x = event.x
    @pos_y = event.y
    @free_camera = true
    self.process_to_map_zoom(new_zoom, duration)
  end
  #--------------------------------------------------------------------------
  # * Pour aller progressivement vers une nouvelle valeur de zoom
  #--------------------------------------------------------------------------
  def self.to_map_zoom(new_zoom, duration)
    if @free_camera
      @free_camera = false
      if map_zoom == new_zoom
        $game_player.center($game_player.x, $game_player.y)
        @force_map_update = true
      end
    end
    self.process_to_map_zoom(new_zoom, duration)
  end
  #--------------------------------------------------------------------------
  # * Setter pour l'attribut zoom
  #--------------------------------------------------------------------------
  def self.map_zoom=(zoom_value)
    unless map_zoom == zoom_value
      if zoom_value < 0.125 || zoom_value > 8.0 then return end
      @zoom = zoom_value
      $game_system.map_zoom = @zoom
      if @free_camera
        $game_map.set_display_pos(@pos_x - (Graphics.width / 32 - 1) / 2.0,
        @pos_y - (Graphics.height / 32 - 1) / 2.0)
      else
        $game_player.center($game_player.x, $game_player.y)
      end
    end
  end 
  #--------------------------------------------------------------------------
  # * Pour aller progressivement vers une nouvelle valeur de zoom,
  # sans centrage automatique sur le joueur
  #--------------------------------------------------------------------------
  def self.process_to_map_zoom(new_zoom, duration)
    unless map_zoom == new_zoom
      if new_zoom < 0.125 || new_zoom > 8.0 then return end
      @map_zoom_duration = duration
      target_zoom_incr = Math.log(new_zoom) / Math.log(2)
      @map_zoom_step = (target_zoom_incr - @map_zoom_incr) / duration
      @target_map_zoom = new_zoom
    end
  end
  #--------------------------------------------------------------------------
  # * Setter pour l'attribut force_map_update
  #--------------------------------------------------------------------------
  def self.force_map_update=(flag)
    @force_map_update = flag
  end
  #--------------------------------------------------------------------------
  # * Getter pour l'attribut force_map_update
  #--------------------------------------------------------------------------
  def self.force_map_update
    return @force_map_update
  end
  #--------------------------------------------------------------------------
  # ** Tilemap
  #--------------------------------------------------------------------------
  class Tilemap
    #--------------------------------------------------------------------------
    # * Aliased methods
    #--------------------------------------------------------------------------
    unless @already_aliased_mgc_zoom_addon
      alias update_map_zoom_addon update
      @already_aliased_mgc_zoom_addon = true
    end
    #--------------------------------------------------------------------------
    # * Mise à jour, appelée normalement à chaque frame
    #--------------------------------------------------------------------------
    def update
      if @visible && MGC.force_map_update
        @need_refresh = true
        @refresh_all = true
        MGC.force_map_update = false
      end
      update_map_zoom_addon
    end
  end
end