Il reste encore quelques détails graphiques à régler, mais laissons çà de côté pour l’instant. Si vous voulez plus de détails concernant ce point adressez vous à un scripteur ou envoyez moi un MP.
Bien considérons la phase d’aménagement terminée et passons à la suite.
Fenêtres du sous-menu :Bien nous allons ici créer des scripts présentant l’interface du sous-menu, l’interaction sera vue dans la partie suivante. Courage, ce n’est pas encore fini.
Tout d’abord vous devez vous mettre en tête une image de votre menu, un découpage des fenêtres, l’emplacement des fonctions, les images… Tout cela dépend bien sûr de la fonctionnalité de votre sous-menu et de vos envies.
Les cadres définissant les fenêtres sont créés à partir de script de type Window. Nous allons expliquer tout çà sur un exemple.
Exemple :Nous allons créer l’interface permettant de choisir une classe parmi une liste. Pour cela nous avons besoin d’une ligne indiquant la classe actuelle, une ligne où l’on voit les caractéristiques du héros et un cadre où l’on choisit la classe. On sépare en général ce genre de demande en deux scripts, l’un est le principal et l’autre porte l’épithète Status, qui comme l’indique son nom présente les caractéristiques du personnage.
Occupons nous de notre ClasseStatus. Créez au milieu des autres Window le script Window_ClasseStatus.
- Code: Tout sélectionner
class Window_ClasseStatus < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# actor : アクター
#--------------------------------------------------------------------------
def initialize(actor)
super(0, 64, 640, 64)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = $fontface
self.contents.font.size = $fontsize
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
draw_actor_name(@actor, 4, 0)
draw_actor_state(@actor, 140, 0)
draw_actor_hp(@actor, 284, 0)
draw_actor_sp(@actor, 460, 0)
end
end
Le but est de bien comprendre le fonctionnement de ce script pour ensuite faire le votre.
Etudions le en détail.
- Code: Tout sélectionner
class Window_ClasseStatus < Window_Base
On crée ici une nouvelle classe d’objet qui qui dérive de la sur-classe Window_Base, cela signifie que toutes les méthodes de Window_Base restent valable ici. En fait ce procédé permet de créer des objets différents à partir d’une classe générale plus modulable (un moule amovible en quelque sorte).
- Code: Tout sélectionner
def initialize(actor)
super(0, 64, 640, 64)
initialize est la méthode qui crée l’objet, on l’appelle par la méthode .new.
super permet de faire appel à la méthode du même non dans la super classe.
Allons donc voir la méthode initialize de Window_Base
- Code: Tout sélectionner
def initialize(x, y, width, height)
Cela vous permet de saisir la signification des chiffres que nous avons choisi.
0 pour l’abscisse (x), on place la fenêtre contre la bordure gauche de l’écran.
64 pour l’ordonnée (y), on laisse de la place pour la ligne présentant la classe actuelle du héros.
640 de largeur (width) cela fait tout l’écran.
64 de hauteur (height) une ligne d’écriture (32 pour écrire et 2 x 16 de bordure).
- Code: Tout sélectionner
self.contents = Bitmap.new(width - 32, height - 32)
Ici on crée véritablement notre fenêtre de largeur 640 (celle que l’on a indiqué) moins 32 pour faire les bordures (2 x 16). Idem pour la hauteur.
Les deux lignes suivantes règlent la police et la taille de caractères.
- Code: Tout sélectionner
@actor = actor
Souvenez vous que l’on a demandé en argument de notre initialize actor (le perso), on le place donc dans une variable disponible dans toute la classe (grâce au @).
Vous comprenez que le sous-menu est propre à chaque personnage (comme les compétences) donc il faut nécessairement préciser que l’on appelle le sous-menu dédié à un personnage particulier.
On appelle ensuite la méthode refresh qui comme son nom l’indique met à jour la fenêtre en fonction de plusieurs paramètres, ici en fonction du héros.
- Code: Tout sélectionner
def refresh
self.contents.clear
draw_actor_name(@actor, 4, 0)
draw_actor_state(@actor, 140, 0)
draw_actor_hp(@actor, 284, 0)
draw_actor_sp(@actor, 460, 0)
end
On efface (clear) ce qu’il y a dans la fenêtre (pour éviter que des données se chevauchent en cas de changement). Ensuite on écrit nom, état, hp et sp sur la ligne (y = 0) séparés (les x sont choisis pour).
Pour plus d’infos concernant ces méthodes regardez leur définition dans Window_Base.
Créons ensuite le corps de notre sous-menu, avec le script Window_Classe
- Code: Tout sélectionner
class Window_Classe < Window_Selectable
#--------------------------------------------------------------------------
# ● Initialise
# actor : choix du perso
#--------------------------------------------------------------------------
def initialize(actor)
super(0, 128, 640, 352)
@actor = actor
@column_max = 2
refresh
self.index = 0
end
On va créer un menu de choix qui dérive donc de Window_Selectable. Dans la définition, on choisit les mêmes paramètres que précédemment pour que notre cadre remplisse bien l’espace qui lui est dévolu (quelques calculs sur papier vous aideront grandement).
Notez que l’on choisit 2 colonnes car cela se présente assez bien.
Index désigne l’emplacement du curseur on le place au départ à 0.
Voici la règle de remplissage pour les index : on commence à 0 première ligne et première colonne puis on ajoute 1 en passant à la colonne suivante, quand il n’y a plus de colonne on passe au début de la ligne suivante en ajoutant encore 1 et ainsi de suite.
- Code: Tout sélectionner
#--------------------------------------------------------------------------
# ● job
#--------------------------------------------------------------------------
def job
return @data[self.index]
end
Cette méthode à pour but de renvoyer l’élément du tableau nommé @data d’indice self.index (la position du curseur). C’est utile dans certains cas.
- Code: Tout sélectionner
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@data = []
for i in 0...@actor.class_list.size
job = @actor.class_list[i]
if job != nil
@data.push(job)
end
end
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, row_max * 32)
self.contents.font.name = $fontface
self.contents.font.size = $fontsize
for i in 0...@item_max
draw_item(i)
end
end
end
Admirez car vous voici au cœur du sous-menu. Ici vous réglez sa présentation.
Les premières lignes servent juste à remettre les pendules à 0.
Vous remarquez que l’on définit ici le fameux tableau @data, vide à l’origine.
Ensuite une boucle for.
Alors pour i variant de 0 à
la longueur du tableau des classes du personnage sélectionné on effectue les commandes suivantes (en fait cela permet de passer en revue toutes les classes contenues dans le tableau des classes du perso).
job prend la valeur de l’élément en position i du tableau des classes du personnage sélectionné. En gros job c’est la ième classe du tableau.
Si job existe (le tableau n’est pas vide) alors on l’ajoute au tableau @data.
On appelle @item_max la longueur du tableau @data.
Si @item_max est plus grand que 0 (s’il y a des classes dans @data), on rempile sur une boucle for qui va appeler la méthode draw_item avec pour argument i.