Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

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

Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

News: Résultat des Alex d'Or 2021 / Tutos: [MV/MZ] Les bases des formules / News: News d'automne / Jeux: Dagga / Jeux: Le rêve de Merm / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

334 connectés actuellement

13914668 visiteurs
depuis l'ouverture

959 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Hellsoft

Planète Glutko

RPG Maker VX

RPG Maker Détente

Offgame

RPG Fusion

ConsoleFun

Tous nos partenaires

Devenir
partenaire



[RGSS] Apprendre le RGSS : Fonctionnement de la classe Scene (Partie 2)

Suite des explications sur l'utilisation de la classe Scene. Ici, on voit comment la classe Scene interagit avec d'autres classes, et comment afficher une fenêtre.

Ecrit par trebor777 le 19/05/2006


❤ 1

Domaine : RGSS
Niveau : Moyen


Bon les fenêtres qu'est ce que c'est ??? Ce sont les principales composants des écrans "systèmes" (menu, boite de dialogue, statut, etc), donc des Scene_xxxx.

Je parlerai d'abord de l'interaction de la fenêtre dans une scène... puis de la création à proprement parler de celle-ci.


On a donc Scene_xxxx qui appelle une ou des Window_xxxx.
Elle les appelle en les attribuant à des variables de sa classe.

Exemple :

Portion de code : Tout sélectionner

1
2
3
4
5
Class Scene_xxxx
   def main 
      @fenetre = Window_xxxx.new
   ....
end



@fenetre est donc un objet "de type" Window_xxxx, appartenant à Scene_xxxx.

Par conséquent à chaque fois que l'on veut faire quelque chose avec cette fenetre, à partir de la Scene... il faut utiliser @fenetre.

Maintenant regardons dans Scene_xxxx, ce qui se passe avec @fenêtre.

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Scene_xxxx
   def main
      @fenetre = Window_xxxx.new
      Graphics.transition
      loop do
         Graphics.update
         Input.update
         update
         if $scene != self
            break
         end
      end
      Graphics.freeze
      @fenetre.dispose
   end
   #-----------------------
   def update
      @fenetre.update
      if Input.trigger?(Input::B)
         $scene= Scene_yyyy.new
      end
   end
end



Le principe de Scene_xxxx est d'afficher une fenêtre de type Window_xxxx et de passer à Scene_yyyy si j'appuie sur la touche B.

On voit 2 autres interactions avec @fenetre :
le .dispose et le .update ^^
Le dispose permet de détruire la fenêtre et le update, de la mettre à jour.

Une Scene doit toujours avoir au moins ces 3 appels (new, dispose, et update) pour qu'une fenêtre fonctionne correctement.

Bon maintenant qu'on a vu comment ca marche dans Scene_xxxx, regardons dans Window_xxxx.
Exemple de Window_xxxx :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
class Window_xxxx < Window_Base
   def initialize
      super(0,0,320,240)
      self.contents = Bitmap.new(width - 32, height - 32)
      refresh
   end
   def refresh
      self.contents.clear
   end
end


Bon, alors qu'est ce qu'on a ???

Très important, la définition de la classe :
class Window_xxxx
Le "< Window_Base" indique que Window_xxxx est une classe de type Window_Base, et que par conséquent elle hérite des méthodes et attributs de cette dernière.
Bon. C'est pas le plus important dans notre tuto...^^

On a 2 fonctions obligatoires pour ce type de classe :
- Initialize
- Refresh

Initialize crée la fenêtre, elle appelle la fonction Initialize de Window_Base, grâce au "SUPER" (super appelle la méthode de nom identique mais appartenant à la classe parente)
Ici le Initialize de Window_Base prend des paramètres qui sont, dans cet ordre :
- Position en X(0 à gauche)
- Position en Y(0 en haut)
- Largeur
- Hauteur

Dans mon exemple, toutes les fenêtres de types Window_xxxx s'afficheront en 0,0 avec une largeur de 320 et une hauteur de 240 (soit un quart de l'écran).

Puis je spécifie que contents est de type bitmap, qui a pour dimension la largeur - 32pixel et la hauteur - 32pixel.

Il est très important de créer ce bitmap, car c'est sur lui qu'on affichera le texte et autres. Ce bitmap, ce nomme contents, et on l'appelle grace à self.

Puis on appelle refresh...
refresh est la méthode où l'on spécifie le contenu de la fenêtre.
Ici notre fenêtre n'a aucun contenu, mais dispose quand meme d'une ligne de code :

Portion de code : Tout sélectionner

1
self.contents.clear


Donc le clear permet d'effacer le contenu du bitmap^^ on le place généralement au début de refresh pour être sur de travailler sur une zone vide.

Si vous avez suivi ce que j'ai dit, vous comprendrez que clear est une méthode de la classe "Bitmap".

Bref...^^
Vous me dîtes : "c'est bien gentil une fenêtre vide... mais comment j'affiche mon texte ??"

Très simplement :

Portion de code : Tout sélectionner

1
2
3
4
   def refresh
      self.contents.clear
      self.contents.draw_text(10, 10, 80, 32, "EXP",0)
   end



Grâce à la méthode "draw_text" de la classe ?????
… Mais, non, Bitmap bien sur ! ( c'est bien ils suivent au fond de la classe ! )

Voyons ses paramètres :
- Position en X
- Position en Y
- Largeur en Pixel
- Hauteur en Pixel
- La chaine de caractère (String en anglais)
- L'alignement (optionnel) -> 0 à gauche, 1 centre, 2 à droite

Donc là rien de bien sérieux...
Maintenant vous me dite.. et là couleur ???
Ben il existe aussi une propriété de Bitmap , qui s'appelle Font (police), qui a elle meme une propriété qui s'appelle color (couleur).
Il suffit donc de changer cette propriété pour notre Bitmap, qui s'appelle ????
… self.contents ! ^^

On obtient donc

Portion de code : Tout sélectionner

1
2
3
4
5
   def refresh
      self.contents.clear
      self.contents.font.color = normal_color
      self.contents.draw_text(10, 10, 80, 32, "EXP",0)
   end



Bon là vous me dîtes,"Treb arrête de nous prendre pour des idiots, j'ai jamais vu de couleur s'appeler "normal_color"...

C'est vrai... c'est ici un raccourci fourni par RMXP, qui évite de devoir écrire ceci :

Portion de code : Tout sélectionner

1
   Color.new(255, 255, 255, 255)


C'est en fait une méthode(appartenant à Window_Base)^^ qui ressemble à ceci:

Portion de code : Tout sélectionner

1
2
3
  def normal_color
    return Color.new(255, 255, 255, 255)
  end


Comment ça marche ?
C'est du R,V,B (Rouge, vert, bleu) la dernière est le niveau d'opacité. Ce niveau est facultatif, si vous ne le spécifiez pas, il sera à 255 (opaque).

On aurait donc pu faire cela dans notre refresh :

Portion de code : Tout sélectionner

1
2
3
4
5
   def refresh
      self.contents.clear
      self.contents.font.color = Color.new(255, 255, 255, 255)
      self.contents.draw_text(10, 10, 80, 32, "EXP",0)
   end



Ca aurait aussi bien marché...
Et pour changer la police de cette fenêtre ??
Très facile :
au lieu de color c'est name...

Portion de code : Tout sélectionner

1
self.contents.font.name="Comic sans MS"



Voilà on sait remplir notre bitmap avec du texte... reste les images...
C'est pas beaucoup plus dur, vous inquiétez pas: :twisted:

Portion de code : Tout sélectionner

1
2
3
4
5
bitmap = RPG::Cache.character(actor.character_name, actor.character_hue)
    cw = bitmap.width / 4
    ch = bitmap.height / 4
    src_rect = Rect.new(0, 0, cw, ch)
    self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect)


Voici le code de la méthode Draw_actor_graphic(avec actor, x, et y comme paramètre).

Le processus est très simple. Je cree un nouveau bitmap temporaire, ici avec le fichier du perso passé en paramètre, puis je sélectionne avec un rectangle que je définie, la zone de ce bitmap "à copier"...
Ici, notre rectangle se place en 0,0 et ne prend qu' 1/16ème(largeur/4 et hauteur/4) de l'image, ce qui correspond au perso vu de face à l'arrêt.
Enfin je fusionne, ce bout de bitmap copié, avec celui de la fenêtre à la position x et y. (ici la position est calculé en plus.. je vous passe ce détail)

Voilà pour les images.

Bon, reste à comprendre le update ?? parce que dans scene j'appelle @fenetre.update, mais y'a pas de update dans Window_xxxx.

Ben Ruby est malin... si une méthode n'existe pas dans une classe il vérifie dans sa classe parente et utilise celle ci. Mais si y en a aucune... alors il plante. ^^
C'est pareil pour dispose... qui est définie dans Window_Base.

Ne définissez update que si vous en avez besoin... par exemple si y'a un truc pour la fenêtre qui se passe à chaque frame, ou un certain nombre de frame... et n'oubliez pas alors de passer un petit appel "super"


Voili voulou;. j'espère avoir été assez clair... :wink:


Mis à jour le 7 novembre 2020.





chyro - posté le 13/01/2010 à 21:09:06 (93 messages postés)

❤ 0

la légende revient

tres pratique <3
avc ca on peut donc afficher un bestiaire ou une fenêtre de métier par exemple si j ai bien suivi:fou
donc les gens qui fond de fenêtre dans la section script certain on en faite juste ajouter une image quelque variable et la fenêtre en question:lol

hé ben c'est hallucinant ce qu'on peut faire avec la programmation:hihi

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 | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
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
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers