[RPG-MAKER.FR] Oniromancie: tout l'univers de RPG Maker en français - Tutoriels - [Scripting] Afficher des fenêtres, Partie 2


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace

Apprendre
RPG Maker

Guides
Tutoriels
Astuces
Making-of


Comment ça marche?

Aëdemphia
Par Sylvanor

Fighting Robots Quest
Par Boulon

Geex
Par roys

Inexistence
Par Falco

La Légende d'Ibabou
Par Zaitan

Nylu
Par NanakyTim

Sarcia
Par Kaëlar

Super Mario RPG - Lost Souls
Par Omegabowser

Jeux: Inexistence / Tutos: Faire de la neige facilement en (...) / Jeux: ARCH ULTRA / Sorties: ARCH ULTRA / News: Alex d'Or 2019 : Les Vainqueurs ! /

Chat  

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

144 connectés actuellement

10281141 visiteurs
depuis l'ouverture

443 visiteurs
aujourd'hui



Barre de séparation

Partenaires






TOP
GAMEMAKING


Les 5 plus
visités

Akademiya RPG Maker

Alex d'Or

BloGecko

ConsoleFun

Eclipso

Au hasard

Le bazar à Omega

Indiexpo

Zarok

Les deux derniers

Zarok

Akademiya RPG Maker

Nos autres partenaires

Devenir
partenaire


Barre de séparation

Un site du réseau
War Paradise

Annuaires référenceurs




[Scripting] Afficher des fenêtres, Partie 2
Ecrit par trebor777

Domaine : RGSS
Niveau : Moyen
Requis : Maitrise des Scene_xxxx et Fenetre de Base^^ bref avoir compris mes 2 précédents tutos...

Vous voulez un menu... avec un curseur pour vos choix et vous n'avez pas envie de faire çà avec des events... :P(comme je vous comprend).... alors ce tuto est fait pour vous.^^

Je vous expliquerai de manière générale le fonctionnement des fenêtre à choix.

Première chose !
Lors de la définition de votre classe Window_x_menu...

Ce n'est plus "< Window_Base" mais "< Window_Selectable" qu'il faudra inscrire, comme ceci:

class Window_x_menu < Window_Selectable
....
end


Bon déjàj une chose de faite....
Mais comment çà marche ?

Prenons un cas concret ->
Nous voulons que notre Scene_xxxx n'affiche une certaine fenêtre que si un choix est fait et un menu, le choix de ce menu fait changer la fenêtre affichée^^...
- nos choix sont "Option 1", "Option 2", et "Option 3"
- Les 3 fenêtre doivent être de classe différente^^ ( pour compléxifier un peu notre histoire)
- Qd j'appuie sur la touche B ou au bout d'un certain temps d'inactivité, je dois retourner à la map.


1ère étape la définition des classes de fenêtre "statique"

Chacune d'elle doit afficher "Prout 1" ou 2 ou 3 selon l'option choisie !

Donc nous savons que notre écran de jeu, fait 640 par 480 pixel.^^
Essayons d'utiliser au mieux l'espace...
Je suggère, dans notre cas, qu'un menu horizontal sera mieux... ^^ Mais pas de souci , nous ferons aussi un menu vertical^^.

Bref... Prévoyons notre espace pour le menu ^^ -> tout en haut 640 de large, sur 64 de haut. Il nous reste donc 480 - 64 = 416 pixel.
Donc nos 3 fenêtres feront 640*416 pixel.

Leurs positions seront donc en 0,64 ^^ puisque en 0,0 il y aura le menu.

Passons au code maintenant !
Pour la fenêtre 1:

class Window_f1 < Window_Base
def initialize
super(0,64,640,416)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
def refresh
self.contents.clear
self.contents.draw_text(10, 10, 200, 32, "Prout 1 !!",0)
end
end

Pour la fenêtre 2:

class Window_f2 < Window_Base
def initialize
super(0,64,640,416)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
def refresh
self.contents.clear
self.contents.draw_text(10, 10, 200, 32, "Prout 2 !!",1)
end
end

Pour la fenêtre 3:

class Window_f3 < Window_Base
def initialize
super(0,64,640,416)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
def refresh
self.contents.clear
self.contents.draw_text(10, 10, 200, 32, "Prout 3 !!",2)
end
end


Voilà nos 3 fenêtres sont définies^^ plutot rapide n'est ce pas !!^^ ( vive le copier coller !)

Maintenant ce qui nous interresse le plus le menu :
Nous le voulons ^^ horizontal ... il n'a que 3 options, ca nous donne donc ... 3 colonnes ! (ouuuaaa !)
Voici le code de cette fenêtre de menu.

class Window_menu < Window_Selectable
def initialize()
super(0, 0, 640, 64)
@column_max = 3
@item_max = 3
@commands = ["Option 1","Option 2","Option 3"]
self.contents = Bitmap.new(width - 32, @item_max * 32)
refresh
self.index = 0
end
def refresh
self.contents.clear
for i in 0...@item_max
draw_item(i, normal_color)
end
end
def draw_item(index, color)
self.contents.font.color = color
rect = Rect.new(4, 32 * index, self.contents.width - 8, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
self.contents.draw_text(rect, @commands[index])
end
end


On a 3 fonctions de base, on en reconnait 2 déjà étudiée ^^ dans le tutorial précédent.
Mais sur lesquelles nous allons revenir, parce qu'il y a des détails propres aux fenêtres à choix, dans ces fonctions.

Donc commençons par "Initialize"
On, reconnais la commande super^^ pour les dimensions et coordonnées de la fenêtre^^...
puis 3 variables d'instance, très importantes !
- @column_max définit le nombre de colonne dans la fenêtre et donc, par un astucieux calcul le nombre de ligne^^... bref ^^ à changer à votre guise^^, donc pour un menu vertical -> 1 seule colonne, et horizontal... ben essayer de trouver un nombre de colonne adéquat réduisant suffisament le nombre de ligne.
- @item_max définit le nombre d'objets, enfin de truc à afficher, comme option.
- @commands définit un tableau contenant chacune de ces options...^^ qui sont des chaines de caractères.

On défini ensuite notre bitmap ...^^ vous remarquerez que sa hauteur est calculé selon le nombre d'objet. (on aurait pu laisser height - 32 parce que notre menu ne fait qu'une seule "ligne".)

Puis est appelé Refresh ...
et enfin on spécifie la position d'origine du curseur !
C'est pas très compliqué^^ la valeur correspond à la position dans le tableau. On commence donc à 0 ^^ et on fini à 2 si il y a 3 et ainsi de suite.
Ici notre curseur sera sur "Option 1".
Mais si on le veux sur la dernière -> self.index = 2

Et si on ne veut pas qu'il s'affiche ^^ on lui donne la valeur -1, le menu sera alors non navigable.
Il faut que la valeur d'index soit >=0 pour qui le soit.

Passons à Refresh!

On a une petite boucle après "le nettoyage" du bitmap... qui va de 0 à 2
pour chacun de ses passages, on affiche l'option d'index i, avec la couleur normale(cf tuto précédent).

On affiche grâce à la 3eme méthode "draw_item(index,color)"
qui a donc 2 paramètre :l'index et la couleur.
On définie donc la couleur de police avec le 2ème paramètre.
Puis on crée un rectangle vide dans lequel on appliquera le texte...^^
ca permet d'avoir des options bien alignés, qui dépasse pas et tout...

Vous remarquerez que "Draw_text" est complètement différente au niveau des paramètres que celle expliqué dans le tuto précédent... ici on a que 2 paramètre au lieu de 6.
PK ?? parce que le rectangle qui lui est passé en paramètre, remplace les 4 premiers (il définit, une position et 2 dimensions), et le 6ème pour l'alignement est omis volontairement( donc par défaut =0 pour aligner à gauche).
Ici le 2ème paramètre correspond au 5ème de la méthode expliquée dans la partie 1. c'est à dire la chaine de caractère affichée.
On récupère la valeur d'index "index" du tableau @commands. On obtiendra donc grace à la boucle successivement Option 1, Option 2 et Option 3.

Voilà Pour la fenêtre de choix^^! C'est pas très compliqué^^ !

Allez passons à notre Scene_xxxx qui doit gérer tout çà !!


class Scene_xxxx
def main
# Création des différentes fenêtres
@fenetre1 = Window_f1.new
@fenetre2 = Window_f2.new
@fenetre3 = Window_f3.new
@menu = Window_menu.new
# Paramétrage des différents fenêtres
@fenetre1.visible = false
@fenetre2.visible = false
@fenetre3.visible = false

Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
@fenetre1.dispose
@fenetre2.dispose
@fenetre3.dispose
@menu.dispose
end
#-----------------------
def update
@fenetre1.update
@fenetre2.update
@fenetre3.update
@menu.update
@temp == nil ? @temp=0 : @temp+=1
if Input.trigger?(Input::B) or @temp>=50
$scene= Scene_Map.new
return
end
if Input.trigger?(Input::C)
case @menu.index
when 0
@fenetre1.visible = true
@fenetre2.visible = false
@fenetre3.visible = false
when 1
@fenetre1.visible = false
@fenetre2.visible = true
@fenetre3.visible = false
when 2
@fenetre1.visible = false
@fenetre2.visible = false
@fenetre3.visible = true
end
@temp=0
end
end
end

Au départ on a donc que le menu ! avec le curseur sur option 1
et aucune fenêtre affichée !!
Pourquoi ?? parce que j'ai mis leur attribut "visible" sur false(faux) dès le départ...
J'aurai très bien pu aussi le faire directement dans le initialize de chacune d'elle.
on aurait eu ceci :

class ....
def initialize
....
self.visible = false
...


Bon j'ai défini une variable de temporisation (@temp) qui si elle est nulle (n'a donc aucune valeur, même pas 0) devient égale à zéro et sinon, augmente de 1.
Comme on le sait ... cette méthode update est appelée à chaque frame...
donc la première fois on définie @temp à 0... puis la frame suivante elle sera égale à 1... puis à 2 ... etc

Qd arrive 50 ou un appuie sur la touche B(Echap) on change la valeur de $scene, en mettant = Scene_Map.new, qui correspond donc à la Map.

SI j'appuie sur C(Entrée ou Espace), selon la valeur de l'index du menu, donc de la position du curseur, je change la visibilité de la fenêtre voulue.
et je remet @temp = 0 pour remettre la tempo à Zéro ^^... et dire que j'ai pas été inactif....

voilà notre cas est réalisé !

Bon maintenant légère variante....
On veut le menu inactif ! et sans curseur affiché tant que j'ai pas appuyé sur la touche C une première fois !
Puis ensuite je peux affiché les fenêtres !


class Scene_xxxx
def main
# Création des différentes fenêtres
@fenetre1 = Window_f1.new
@fenetre2 = Window_f2.new
@fenetre3 = Window_f3.new
@menu = Window_menu.new
# Paramétrage des différents fenêtres
@fenetre1.visible = false
@fenetre2.visible = false
@fenetre3.visible = false
@menu.active = false
@menu.index = -1
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
@fenetre1.dispose
@fenetre2.dispose
@fenetre3.dispose
@menu.dispose
end
#-----------------------
def update
@fenetre1.update
@fenetre2.update
@fenetre3.update
@menu.update
@temp == nil ? @temp=0 : @temp+=1
if Input.trigger?(Input::B) or @temp>=50
$scene= Scene_Map.new
return
end
if Input.trigger?(Input::C)
if @menu.active == false
@menu.index = 0
@menu.active = true
return
end
case @menu.index
when 0
@fenetre1.visible = true
@fenetre2.visible = false
@fenetre3.visible = false
when 1
@fenetre1.visible = false
@fenetre2.visible = true
@fenetre3.visible = false
when 2
@fenetre1.visible = false
@fenetre2.visible = false
@fenetre3.visible = true
end
@temp=0
end
end
end


^^ Donc on a spécifié au départ que la fenêtre menu ait active à false(ca bloque la navigation, et l'index à -1 pour cacher le curseur.
on aurait pu faire ca dans le Initialize de Window_menu ^^ en remplacant @menu, par self

Ensuite dans le Update :
A l'endroit ou je test la touche C, je vérifie avant le test de la position du curseur, que le menu est actif ou pas, si il ne l'est pas, je l'active et j'affiche le curseur... ET je quitte update !! pour ne pas traiter le cas de la position du curseur qui est juste après!
comme çà à la frame suivante mon menu est actif, avec le curseur à "option 1" et je n'ai plus qu'à appuyer sur C pour afficher la fenêtre voulue.
Si on avait omis le "return", comme on avait mis index à 0, on rentrait dans un des cas possible de l'affichage, et il aurait donc affiché lors du premier appui la fenetre1 . au lieu de ne le faire qu'au second !

Voili voulou !! J'espère que vous avez compris !!!
:P


josua - posté le 25/01/2009 à 15:32:27 (6 messages postés)

❤ 0

JVM aussi fort kune pizza ^^

Ca bug moi, je peux rien faire.... :\...
Le texte ne s'affiche pas....


lilililololo - posté le 09/12/2009 à 18:31:41 (12 messages postés)

❤ 0

pas mal mais a vue d'oeil il a lir looooonnnnnnnnnnnggg

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site:

Communauté: Accueil | News | Forum | Flash-news | Sorties | Chat | Commentaires | Galerie | Blogs | Articles perso | Screen de la semaine | Palmarès | Livre d'or | Recherche | Interviews | OST | L'Annuaire | Divers
Apprendre: Le Wiki | Tutoriels | Guides | Gaming-Live | Tests | Making-of
Télécharger: Programmes | Scripts | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Index jeux séparés | Top Classiques | Top Originaux | Les autres | Collection Oniro | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Jeux complets | Proposer
Hébergés: Aëdemphia | Fighting Robots Quest | Geex | Inexistence | La Légende d'Ibabou | Nylu | Sarcia | Super Mario RPG - Lost Souls
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis