Partagez
Aller en bas
Erwill
Erwill
Membre

Nombre de messages : 4
Age : 20
Localisation : France
Distinction : aucune
Date d'inscription : 11/02/2012

RPG Maker XP Afficher partiellement des images

le Dim 25 Fév 2018 - 23:53
Affichage partiel des images

Ce script permet de créer une zone de l'image qui sera visible, un peu comme les spritesheets ou les autres types de bitmap de rpg maker. (Les characters, les animations, les autotiles, etc.)

À la base je l'ai créé que pour mon projet, mais j'ai décidé de le partager pour d'autres utilisateurs.

Quel est l'utilité de ce script ?

Par exemple, si vous utilisez les images pour afficher les facesets sur XP, au lieu d'avoir 50 fichiers pour 50 facesets, vous pouvez tous les réunir dans un seul et même fichier.
Vous pouvez également utiliser ce script pour en faire des planches de sprite un peu comme les dernières versions de RPG Maker 2003.


Les commandes :

Le script ajoute deux commandes pour les images.

Code:
$game_screen.pictures[ID].rect(x, y, width, height)
Elle permet de créer et de paramétrer la zone d'affichage de l'image.
- ID = l'id de l'image.
- X = La position X de la zone d'affichage sur l'image.
La position 0 de X est sur le bord gauche de l'image.
- Y = La position Y de la zone d'affichage sur l'image.
La position 0 de Y est sur le bord haut de l'image.
- width = La longueur de la zone d'affichage.
- height = La hauteur de la zone d'affichage.


Code:
$game_screen.pictures[ID].rectchange(duration, x, y, width, height)
Elle permet de modifier la zone d'affichage de l'image.
- ID = l'id de l'image.
- Duration = La durée de la modification en frame.
- X = La position X de la zone d'affichage sur l'image.
La position 0 de X est sur le bord gauche de l'image.
- Y = La position Y de la zone d'affichage sur l'image.
La position 0 de Y est sur le bord haut de l'image.
- width = La longueur de la zone d'affichage.
- height = La hauteur de la zone d'affichage.

Le script :

À mettre au-dessus de main.

Code:
#==============================================================================
# ** Affichage partiel des images                          Par Erwill
#------------------------------------------------------------------------------
#  Ce script ajoute une option à l'affichage de l'image : la possibilité de
#  sélectionner qu'une partie qui sera affichée, un peu comme le principe des
#  spritesheets.
#------------------------------------------------------------------------------
#  Mode d'emploi :
#  
#  Voici les commandes ajoutées :
#
#  - $game_screen.pictures[ID].rect(x, y, width, height) Permet de sélectionner la partie qui sera affichée.
#     Elle permet de créer et de paramétrer la zone d'affichage de l'image.
#      - ID = l'id de l'image.
#      - X = La position X de la zone d'affichage sur l'image.
#      - Y = La position Y de la zone d'affichage sur l'image.
#      - width = La longueur de la zone d'affichage.
#      - height = La hauteur de la zone d'affichage.
#
#  - $game_screen.pictures[ID].rectchange(duration, x, y, width, height) Permet de déplacer la partie affichée. (ne fonctionne pas s'il n'y a pas eu la première commande pour l'image)
#     Elle permet de modifier la zone d'affichage de l'image.
#      - ID = l'id de l'image.
#      - Duration = La durée de la modification en frame.
#      - X = La position X de la zone d'affichage sur l'image.
#      - Y = La position Y de la zone d'affichage sur l'image.
#      - width = La longueur de la zone d'affichage.
#      - height = La hauteur de la zone d'affichage.
#
#==============================================================================


#==============================================================================
# ** Game_Picture
#==============================================================================
class Game_Picture
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader   :number                   # picture number
  attr_reader   :name                     # file name
  attr_reader   :origin                   # starting point
  attr_reader   :x                        # x-coordinate
  attr_reader   :y                        # y-coordinate
  attr_reader   :zoom_x                   # x directional zoom rate
  attr_reader   :zoom_y                   # y directional zoom rate
  attr_reader   :opacity                  # opacity level
  attr_reader   :blend_type               # blend method
  attr_reader   :tone                     # color tone
  attr_reader   :angle                    # rotation angle
  attr_reader   :recx                     # Rect X
  attr_reader   :recy                     # Rect Y
  attr_reader   :recw                     # Rect width
  attr_reader   :rech                     # Rect Height
  attr_reader   :rece                     # Rect enable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     number : picture number
  #--------------------------------------------------------------------------
  def initialize(number)
    @number = number
    @name = ""
    @origin = 0
    @x = 0.0
    @y = 0.0
    @zoom_x = 100.0
    @zoom_y = 100.0
    @opacity = 255.0
    @blend_type = 1
    @duration = 0
    @target_x = @x
    @target_y = @y
    @target_zoom_x = @zoom_x
    @target_zoom_y = @zoom_y
    @target_opacity = @opacity
    @tone = Tone.new(0, 0, 0, 0)
    @tone_target = Tone.new(0, 0, 0, 0)
    @tone_duration = 0
    @angle = 0
    @rotate_speed = 0
    @recx = 0
    @recy = 0
    @recw = 0
    @rech = 0
    @rece = 0
    @rect_duration = 0
  end
  #--------------------------------------------------------------------------
  # * Show Picture
  #     name       : file name
  #     origin     : starting point
  #     x          : x-coordinate
  #     y          : y-coordinate
  #     zoom_x     : x directional zoom rate
  #     zoom_y     : y directional zoom rate
  #     opacity    : opacity level
  #     blend_type : blend method
  #--------------------------------------------------------------------------
  def show(name, origin, x, y, zoom_x, zoom_y, opacity, blend_type)
    @name = name
    @origin = origin
    @x = x.to_f
    @y = y.to_f
    @zoom_x = zoom_x.to_f
    @zoom_y = zoom_y.to_f
    @opacity = opacity.to_f
    @blend_type = blend_type
    @duration = 0
    @target_x = @x
    @target_y = @y
    @target_zoom_x = @zoom_x
    @target_zoom_y = @zoom_y
    @target_opacity = @opacity
    @tone = Tone.new(0, 0, 0, 0)
    @tone_target = Tone.new(0, 0, 0, 0)
    @tone_duration = 0
    @angle = 0
    @rotate_speed = 0
    @rect_target_x = 0
    @rect_target_y = 0
    @rect_target_width = 0
    @rect_target_height = 0
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    if @duration >= 1
      d = @duration
      @x = (@x * (d - 1) + @target_x) / d
      @y = (@y * (d - 1) + @target_y) / d
      @zoom_x = (@zoom_x * (d - 1) + @target_zoom_x) / d
      @zoom_y = (@zoom_y * (d - 1) + @target_zoom_y) / d
      @opacity = (@opacity * (d - 1) + @target_opacity) / d
      @duration -= 1
    end
    if @tone_duration >= 1
      d = @tone_duration
      @tone.red = (@tone.red * (d - 1) + @tone_target.red) / d
      @tone.green = (@tone.green * (d - 1) + @tone_target.green) / d
      @tone.blue = (@tone.blue * (d - 1) + @tone_target.blue) / d
      @tone.gray = (@tone.gray * (d - 1) + @tone_target.gray) / d
      @tone_duration -= 1
    end
    if @rotate_speed != 0
      @angle += @rotate_speed / 2.0
      while @angle < 0
        @angle += 360
      end
      @angle %= 360
    end
    if @rect_duration >= 1
      @recx = (@recx * (@rect_duration - 1) + @rect_target_x) / @rect_duration
      @recy = (@recy * (@rect_duration - 1) + @rect_target_y) / @rect_duration
      @recw = (@recw * (@rect_duration - 1) + @rect_target_width) / @rect_duration
      @rech = (@rech * (@rect_duration - 1) + @rect_target_height) / @rect_duration
      @rect_duration -= 1
    end
  end
  #--------------------------------------------------------------------------
  # * rect(x, y, width, height)
  #     Elle permet de créer et de paramétrer la zone d'affichage de l'image.
  #      - ID = l'id de l'image.
  #      - X = La position X de la zone d'affichage sur l'image.
  #      - Y = La position Y de la zone d'affichage sur l'image.
  #      - width = La longueur de la zone d'affichage.
  #      - height = La hauteur de la zone d'affichage.
  #--------------------------------------------------------------------------
  def rect(x, y, width, height)
    @recx = x
    @recy = y
    @recw = width
    @rech = height
    @rece = 1
  end
  #--------------------------------------------------------------------------
  # * rectchange(duration, x, y, width, height)
  #     Elle permet de modifier la zone d'affichage de l'image.
  #      - ID = l'id de l'image.
  #      - Duration = La durée de la modification en frame.
  #      - X = La position X de la zone d'affichage sur l'image.
  #      - Y = La position Y de la zone d'affichage sur l'image.
  #      - width = La longueur de la zone d'affichage.
  #      - height = La hauteur de la zone d'affichage.
  #--------------------------------------------------------------------------
  def rectchange(duration, x, y, width, height)
    @rect_duration = duration
    @rect_target_x = x
    @rect_target_y = y
    @rect_target_width = width
    @rect_target_height = height
  end
end




#==============================================================================
# ** Sprite_Picture
#==============================================================================
class Sprite_Picture < Sprite
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    # If picture file name is different from current one
    if @picture_name != @picture.name
      # Remember file name to instance variables
      @picture_name = @picture.name
      # If file name is not empty
      if @picture_name != ""
        # Get picture graphic
        self.bitmap = RPG::Cache.picture(@picture_name)
      end
    end
    # If file name is empty
    if @picture_name == ""
      # Set sprite to invisible
      self.visible = false
      return
    end
    # Set sprite to visible
    self.visible = true
    # Set transfer starting point
    if @picture.origin == 0
      self.ox = 0
      self.oy = 0
    else
      if @picture.rece==1 then
      self.ox = @picture.recw / 2
      self.oy = @picture.rech / 2
      else
      self.ox = self.bitmap.width / 2
      self.oy = self.bitmap.height / 2
      end
    end
    # Set sprite coordinates
    self.x = @picture.x
    self.y = @picture.y
    self.z = @picture.number
    # Set zoom rate, opacity level, and blend method
    self.zoom_x = @picture.zoom_x / 100.0
    self.zoom_y = @picture.zoom_y / 100.0
    self.opacity = @picture.opacity
    self.blend_type = @picture.blend_type
    # Set rotation angle and color tone
    self.angle = @picture.angle
    self.tone = @picture.tone
    if @picture.rece==1 then
    self.src_rect.set(@picture.recx, @picture.recy, @picture.recw, @picture.rech)
    end
  end
end

Exemple d'utilisation :

On va prendre un fichier de facesets et on va l'afficher dans le jeu avec la commande correspondante, ça donne ça en gros :
Spoiler:
Afficher partiellement des images VUyp1j

Maintenant je veux afficher uniquement le troisième faceset du bas, je n'ai qu'à entrer la commande pour créer la zone d'affichage :
Afficher partiellement des images INMWG4

Ce qui donne ça :
Spoiler:
Afficher partiellement des images 4jzUp8
Löne
Löne
Membre

Nombre de messages : 38
Distinction : Poisson 2018 [Amal']
Date d'inscription : 28/02/2018

RPG Maker XP Re: Afficher partiellement des images

le Jeu 1 Mar 2018 - 12:02
Script sympathique, mais je constate surtout qu'il y a toujours un soucis récurrent avec les scripts RPG Maker : celle de la compatibilité avec d'autres scripts. Je m'explique.

Le problème structurel de ton script, c'est que tu fais une copie du script existant que tu augmentes avec tes fonctions. Mais maintenant, imagine qu'un autre script, écrit par une autre personne, touche également à cette fonction d'affichage des images : tu te retrouves devant un problème, puisque les deux scripts vont inéluctablement rentrer en conflit.

Ruby est un langage très puissant en terme de métaprogrammation. Utilise donc ces propriétés pour éviter ce genre de problèmes. Voici un exemple type :

Code:
class Bar

  def initialize
    @hello = 0
  end

  def foo
    @hello += 1
  end

end

class Bar

  alias_method :old_initialize, :initialize # On définit un alias pour "augmenter" la définition précédente d'initialize sans pour autant y toucher en profondeur
  def initialize
    old_initialize
    puts @hello
  end

  alias_method :old_foo, :foo
  def foo
    old_foo
    @hello += 1
    puts @hello
  end

end

class Bar

  alias_method :old_initialize2, :initialize
  def initialize
    old_initialize2
    puts "initialized"
  end

end

b = Bar.new
b.foo
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum