Ce script permet d’afficher seulement une partie d’une image dans RPG Maker XP, au lieu d’afficher le fichier entier.
En pratique, ça ajoute aux images affichées par événement un fonctionnement proche de celui des spritesheets : vous définissez une zone visible dans le bitmap, puis le jeu n’affiche que cette portion.
À quoi sert ce script ?
Par défaut, quand vous affichez une image dans RPG Maker XP, le moteur affiche le fichier complet.
Le problème, c’est que dès que vous voulez travailler avec :
- plusieurs facesets dans une seule planche ;
- plusieurs portraits dans une seule image ;
- des éléments d’interface regroupés dans un même fichier ;
- des planches de sprites ;
- des variations d’images dans un seul bitmap ;
vous êtes vite obligé de multiplier les fichiers.
Ce script règle ça.
Il permet de dire au moteur : “affiche seulement cette zone de l’image”.
Ce que fait le script
Le script ajoute deux commandes à Game_Picture :
$game_screen.pictures[ID].rect(x, y, width, height)
et
$game_screen.pictures[ID].rectchange(duration, x, y, width, height)
La première sert à définir une zone d’affichage.
La seconde sert à faire évoluer cette zone dans le temps.
Autrement dit :
rectdécoupe une portion visible ;rectchangeanime ou déplace ce découpage sur plusieurs frames.



Fonctionnement des commandes
1. Définir la zone affichée
$game_screen.pictures[ID].rect(x, y, width, height)
Cette commande définit quelle partie de l’image sera visible.
Paramètres
- ID : identifiant de l’image affichée
- x : position X de départ dans l’image
- y : position Y de départ dans l’image
- width : largeur de la zone visible
- height : hauteur de la zone visible
Repère
x = 0correspond au bord gauche de l’imagey = 0correspond au bord haut de l’image
Exemple
$game_screen.pictures[1].rect(200, 300, 96, 96)
Ici, l’image 1 n’affichera plus tout le fichier, mais uniquement un rectangle de 96×96 à partir de la position (200, 300) dans le bitmap.
2. Modifier la zone affichée progressivement
$game_screen.pictures[ID].rectchange(duration, x, y, width, height)
Cette commande modifie la zone visible de manière progressive.
Paramètres
- ID : identifiant de l’image
- duration : durée de la transition en frames
- x : nouvelle position X
- y : nouvelle position Y
- width : nouvelle largeur
- height : nouvelle hauteur
Important
Cette commande ne sert que si une zone a déjà été définie avec rect.
Exemple
$game_screen.pictures[1].rectchange(20, 96, 0, 96, 96)
Pendant 20 frames, la zone visible de l’image 1 glissera vers la nouvelle portion définie.
Cas d’usage concrets
Facesets regroupés dans un seul fichier
C’est le cas le plus évident.
Au lieu d’avoir :
- 1 fichier par portrait
- 1 image à charger par variation
vous pouvez faire une seule planche contenant tous les visages, puis afficher uniquement la portion voulue.
Résultat :
- moins de fichiers ;
- organisation plus propre ;
- plus facile à maintenir.
Planche de sprites personnalisée
Le script peut aussi servir à afficher plusieurs éléments d’une planche unique, comme :
- expressions ;
- icônes ;
- portraits ;
- éléments UI ;
- mini animations.
Ce n’est pas un système d’animation complet à lui seul, mais c’est une bonne base pour bricoler quelque chose de propre dans XP.
Interface et HUD
Vous pouvez également l’utiliser pour :
- afficher une jauge découpée dans un bitmap ;
- changer dynamiquement une icône dans une grande planche ;
- ne révéler qu’une partie d’un cadre ou d’une fenêtre ;
- simuler un masque très simple.
#==============================================================================
# ** 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