Sujet n°5921
Posté par Lén le 28 Jan - 23:59 (2010)
Titre : [Script] Manipuler des fenêtres avec des events
Salut !
Voici une de mes nouvelles créations, normalement déjà débugguée :lol:


Vous pourrez avec ce script:
  1. Créer des fenêtres
  2. Leur ajouter du contenu (images et textes)
  3. Modifier leur windowskin
  4. Leur donner du mouvement ! (dans n'importe quelle direction et vitesse
Et bien sûr, tout ça marche en event, pour que vous mes chers PSPistes n'ayez pas (ou presque) à bouger le petit doigt pour créer des interfaces et des fenêtres d'informations, voir pourquoi pas des nouvelles fenêtres de dialogue complètement personnalisées !!!

Le script à coller en dessous de interpreter Sphinx: (si vous m'aimez bien appelez le interpreter Len, sinon comme vous voulez 8) )

Script

Code:

 class Interpreter
 
  def initialisation
    @windows = []
  end
 
  def nouvelle_fenetre(x,y,w,h,o)
    windowlen = Window_Base.new(x,y,w,h)
    windowlen.contents = Bitmap.new(w - 32, h - 32)
    windowlen.contents.font.name = $fontface
    windowlen.contents.font.size = $fontsize
    windowlen.opacity = o
    @windows.push(windowlen)
  end
 
  def fermer_fenetre(id)
    id -= 1
    if @windows[id].disposed?
      id += 1
      print "La fenetre " + id.to_s + " n'existe pas ou a déjà été fermée."
    else
      @windows[id].dispose
    end
  end
   
  def bouger_fenetre(id, speed, angle, len)
    id -= 1
    if @windows[id].disposed?
        id += 1
        print "La fenetre " + id.to_s + " n'existe pas ou a déjà été fermée."
    else
      path = 0
      angle = Math::PI*angle/180
      cosx = (Math.cos(angle)*speed).to_i
      siny =  (Math.sin(angle)*speed).to_i
      loop do
        path += 1
        @windows[id].x += cosx
        @windows[id].y -=  siny
        Graphics.update
        if path == len
          break
        end
      end
    end
  end
 
  def ajouter_image(id,x,y,o,file)
    id -= 1
    if @windows[id].disposed?
        id += 1
        print "La fenetre " + id.to_s + " n'existe pas ou a déjà été fermée."
    else
      bitmap = RPG::Cache.picture(file)
      rect = Rect.new(0, 0, bitmap.width, bitmap.height)
      @windows[id].contents.blt(x, y, bitmap, rect, o)
    end
  end
 
  def ajouter_texte(id,x,y,w,h,text, color, o)
    id -= 1
    if @windows[id].disposed?
        id += 1
        print "La fenetre " + id.to_s + " n'existe pas ou a déjà été fermée."
    else
      if w == "auto"
        w =  text.size
      end
      if h == "auto"
        h =  32
      end
      case color
         when "noir"
          color = Color.new(0,0,0,o)
        when "rouge"
          color = Color.new(255,0,0,o)
        when "blanc"
          color = Color.new(0,0,0,o)
        else
          color = Color.new(color[0,3].to_i,color[4,3].to_i,color[8,3].to_i,o)
      end
      @windows[id].contents.font.color = color
      @windows[id].contents.draw_text(x, y, w, h, text)
    end
  end
 
  def changer_skin(id, file)
    id -= 1
    if @windows[id].disposed?
      id += 1
      print "La fenetre " + id.to_s + " n'existe pas ou a déjà été fermée."
    else
      @windows[id].windowskin = RPG::Cache.windowskin(file)
    end
  end
 
end



Explications

Dans un event, insérez une commande de script tel que suit:



Ensuite, dans n'importe quel event, même celui où vous avez écrit initialisation précédemment, vous pouvez rentrer une de ces commandes.
id correspond au numéro de la fenêtre dans l'ordre de création (la 1ere porte le numéro 1, la 2e porte le numéro 2, ...etc).

Création d'une fenêtre:
nouvelle_fenetre(x,y,largeur,hauteur,opacité)
# largeur et hauteur doivent faire au minimum 32

Fermer une fenêtre:
fermer_fenetre(id)

Ajouter une image dans la fenêtre:
ajouter_image(id,x,y,opacité,"nom_du_fichier.png")

Ajouter un texte dans la fenêtre:
ajouter_texte(id,x,y,largeur,hauteur,"texte","couleur",opacité)
# ici largeur et hauteur peuvent être remplacé par "auto" et auront une taille de 32 par 32. Généralement hauteur reste en "auto"
# couleur peut-être "noir" ou "rouge" ou "blanc" ou "rrr,ggg,bbb" (obligatoirement sur 3 chiffres)


Changer le windowskin de la fenêtre:
changer_skin(id,"nom_du_fichier.png")

bouger_fenetre:
position_fenetre(id, vitesse, angle, longueur)
# vitesse est le nombre de pixel par frame dont la fenêtre va se déplacer. vitesse minimum = 2
# angle est en degré en sens trigo (inverse des aiguilles d'une montre: 0 va a droite et 180 va a gauche)
# longueur est le nombre de pixel dont la fenêtre doit se déplacer en direction de l'angle




Utilisateurs avancés

Vous pouvez acceder a toutes les paramèters d'une fenêtre en connaissant son ID:


Code:

 @windows[7].width += 100


Agrandira la fenêtre 8 de 100 pixels de largeur.

Veuillez noter que cette fonction ne comporte pas de mode "débutant", la première fenêtre est à la position 0 du tableau, et non 1 comme pour les fonctions intégrées de base.
Certains effets intéressant de modifications de taille de la fenêtre en mouvement peuvent-être par exemple ainsi créés en suivant mon tutoriel sur l'animation des fenêtres ICI.


N'hésiter pas a demander plus d'explication sur certains points et à me proposer de nouvelles fonctions pour vous faciliter la vie.

Posté par Sphinx le 29 Jan - 00:05 (2010)
Imbécile heureux Boulot magnifique lén ! Comme d'hab quoi ^o^


>> juste une ptite sugg : pourquoi ne pas utiliser une Hash (pour permettre au maker de choisir le nom par lequel il voudra appeler sa fenêtre) ^o^

En outre, une ptite question :! Actuellement j'en suis au tout début de la sérialisation de ces objets graphiques (sprites, bitmaps, ...) et les windows me posent encore qques pbs :! Comment tu gères ce pb pr les saves ? ^o^" (que sauvegardes tu, en fait, si tu sauvegardes qque chose)

Posté par Lén le 29 Jan - 14:42 (2010)
MERCI :mrgreen:

Utiliser un hash ? ouais bonne idée ! Je m'y met :D

Je ne sauve rien. Mais je pense mettre une sauvegarde basique des données dans un fichier texte tout bête ... l'avantage ? ben déjà je m'embête pas avec les marshall ... et en plus le tricheur n'a rien a gagner a modifier un fichier de paramètre d'affichage XD

Qu'entends-tu par sérialisation ? :D

Posté par GT.Onizuka le 29 Jan - 19:51 (2010)
J'adore je te remercie profondément pour ce script (bien que la vidéo ne fonctionne ou je suis) mais le script et les explications suffisent .
Merci !!!

Posté par Sphinx le 29 Jan - 21:35 (2010)
>> sérialiser c'est enregistrer un objet dans un fichier (Marshal)

Imbécile heureux Et les objets graphiques ne sont pas sérialisables.

Posté par Angi-MK le 30 Jan - 07:56 (2010)
Beau gosse le Lénou, merci pour toute l'aide que tu m'a apporté et celle que tu continue de me fournir !

Posté par Lén le 30 Jan - 22:51 (2010)
Merci les gars  Petit saligaud mal élevé !

Je pensais qu'avec la fureur du DualScreen beaucoup de monde viendrait ici mais ... non !