Sujet n°14393
Posté par Giratinaprimal le 24 Jan - 21:48 (2015)
Titre : Améliorations de la commande "Afficher un message
Hello !

Après une très longue absence (3 ans), je me suis un peu remis à mon projet. J'ai essayé d'améliorer la fonction "Afficher un message" afin qu'elle gère les pauses en plein milieu de texte ou les fins automatiques. "Et pourquoi ne pas en faire profiter les autres ?", me suis-je dit !

Important :
Ce script fonctionne sur PSP4G+. Il est possible qu'il fonctionne également avec d'autres versions de PSP mais c'est à vérifier. Il ne fonctionnera pas avec des projets RPG Maker XP ordinaires.

Installation :
Créez un script au-dessus de Main, renommez-le comme vous le voulez et collez le script suivant :
Code

Code:
#=======================================================================
# ■ Fonctions supplémentaires de la commande "Afficher un message"
#    GiraPrimal - MàJ le 25/01/2015 - v1.1
#
# Basé sur le script Window_Message (redéfinition pour PSP) de Krosk
# Compatible aevc PSP4G+, à vérifier pour d'autres versions.
# Crédits non nécessaires mais appréciés.
# Toutes améliorations bienvenues.
#=======================================================================
# ■ DESCRIPTION
# Comme vous le savez peut-être, on peut modifier la couleur d'un
# message ou mettre le nom d'un personnage directement dedans. Ce
# script offre des fonctions supplémentaires afin d'avoir un rendu
# similaire à ce qu'on a dans RPG Maker VX.
#-----------------------------------------------------------------------
# ■ COMMENT L'UTILISER ?
# Dans un événement, créez un message et écrivez les commandes suivantes
# pour effectuer différentes actions :
# \N[X]     Affiche le nom du héros n°X
# \C[X]     À partir de cet endroit, le texte prend la couleur n°X
#           (voir le script Window_Base pour les couleurs)
# \G        Affiche une fenêtre avec l'argent possédé par le joueur
#           (cette fenêtre disparaît une fois le message terminé)
# \\        Affiche le caractère '\'
# \.        Marque une pause d'1/4 de seconde à cet endroit
# \|        Marque une pause d'une seconde à cet endroit
# \!        Marque une pause à cet endroit. Le message continuera
#           dès que le joueur appuie sur C, ENTRÉE, X ou ÉCHAP
# \^        Termine le message sans que le joueur n'appuie sur un bouton
#           (placez cette commande de préférence à la fin du message)
#-----------------------------------------------------------------------
# ■ NOTES
# - (Important)   Ce script peut ne pas fonctionner sur des projets RPG
#                 Maker XP ordinaires. Il est conçu à la base
#                 pour PSP 4G+.
#=======================================================================

class Window_Message < Window_Selectable
 
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    self.contents.font.name = $fontface
    self.contents.font.size = $fontsize
    text_count = 0
    x = y = 0
    push = false
    @cursor_width = 0
    wait = 0
    if $game_temp.choice_start == 0
      x = 8
    end
    if $game_temp.message_text != nil
      text = $game_temp.message_text
      begin
        last_text = text.clone
        text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
        text.gsub!(/\\[Pp]\[([0-9]+)\]/) { $string[$1.to_i] }
      end until text == last_text
      text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
        $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
      end
      text.gsub!(/\\\\/)               { "\000" }         
      text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" } 
      text.gsub!(/\\[Gg]/)             { "\002" }
      text.gsub!(/\\\./)               { "\003" }
      text.gsub!(/\\\|/)               { "\004" }
      text.gsub!(/\\!/)                { "\005" }
      text.gsub!(/\\\^/)               { "\006" }
     
      while ((c = text.slice!(/./m)) != nil)
        # \\
        if c == "\000"
          c = "\\"
        end
       
        # \C[n]
        if c == "\001"
          text.sub!(/\[([0-9]+)\]/, "")
          color = $1.to_i
          if color >= 0 and color <= 7
            self.contents.font.color = text_color(color)
          end
          next
        end
       
        # \G
        if c == "\002"
          if @gold_window == nil
            @gold_window = Window_Gold.new
            @gold_window.x = 560 - @gold_window.width
            if $game_temp.in_battle
              @gold_window.y = 192
            else
              @gold_window.y = self.y >= 128 ? 32 : 384
            end
            @gold_window.opacity = 255
            @gold_window.back_opacity = 255
          end
          next
        end
       
        # \.
        if c == "\003"
          wait = 10
          until wait == 0
            wait -= 1
            Graphics.update
            $scene.update
          end
        end
       
        # \|
        if c == "\004"
          wait = 40
          until wait == 0
            wait -= 1
            Graphics.update
            $scene.update
          end
        end
       
        # \!
        if c == "\005"
          until Input.trigger?(Input::C) or Input.trigger?(Input::B)
            Graphics.update
            $scene.update
            Input.update
          end
        end
       
        # \^
        if c == "\006"
          terminate_message
        end
       
        # \n
        if c == "\n"
          if y >= $game_temp.choice_start
            @cursor_width = [@cursor_width, x].max
          end
          y += 1
          x = 0
          if y >= $game_temp.choice_start
            x = 8
          end
          next
        end
       
        self.contents.draw_text(4 + x, 24 * y, 40, 32, c)
        text_count += 1
        Input.update
        if Input.trigger?(Input::C)
          push = true
        end
        if text_count == @speed_defilement and @speed_defilement != 0 and push == false
          Graphics.update
          #$game_map.update
          $scene.update#spriteset.update
          text_count = 0
        end
        x += self.contents.text_size(c).width
      end
    end
    if $game_temp.choice_max > 0
      @item_max = $game_temp.choice_max
      self.active = true
      self.index = 0
    end
    if $game_temp.num_input_variable_id > 0
      @input_number_window = Window_InputNumber.new($game_temp.num_input_digits_max)
      @input_number_window.x = self.x + 8
      @input_number_window.y = self.y + $game_temp.num_input_start * 32
    end
  end 
end



Utilisation :
Si vous utilisez la commande d'évent "Afficher un message" pour afficher du texte, tapez les commandes suivantes :
\N[X] Affiche le nom du héros n°X
\C[X] À partir de cet endroit, le texte prend la couleur n°X (voir le script Window_Base pour les couleurs)
\G Affiche une fenêtre avec l'argent possédé par le joueur (cette fenêtre disparaît une fois le message terminé)
\\ Affiche le caractère '\'
\. Marque une pause d'1/4 de seconde à cet endroit
\| Marque une pause d'une seconde à cet endroit
\! Marque une pause à cet endroit. Le message continuera dès que le joueur appuie sur C, ENTRÉE, X ou ÉCHAP
\^ Termine le message sans que le joueur n'appuie sur un bouton (placez cette commande de préférence à la fin du message)

Remarques :
- Si vous voulez ajouter d'autres options, n'hésitez pas à proposer.
- Il est possible que le caractère '\' apparaisse comme le symbole Yen selon la version du logiciel que vous utilisez. Cette différence n'influe pas les effets du script.
- Le caractère '\' est disponible en tapant la combinaison Alt Gr + _. (Juste au cas où ^^)


À plus Clin d'œil foireux

Posté par Sansonic le 25 Jan - 00:11 (2015)
Intéressant de permettre l'incorporation de commandes de message VX's like.
Evidemment le seul souci reste de ne pas pouvoir l'utiliser sur des projets non PSP, cela dit pour améliorer l'ensemble tu peux t'inspirer d'autres scripts ayant ce même effet sous XP.


Concernant les tilesets qui se figent, un scripteur confirmé saura expliquer la chose mieux que moi, mais je présume que ça tien au ciblage des éléments affectés par l’arrêt momentané du défilement de frames. Certainement que sous RGSS1 la gestion sur ce point diffère de celle sous RGSS2 et +, d'où la non incorporation de la commande de base. Ou ça peut être simplement un bug chez-toi comme c'est le cas pour certains avec le déclenchement en "Automatique".
Mon propos n'est pas scrupuleusement proche du vocable d'usage, mais j'espère et pense ne pas être loin de la vérité (auquel cas corrigez moi).


Sur ce merci du partage  Clin d'œil foireux .

Posté par Nuri Yuri le 25 Jan - 00:19 (2015)
Les animations qui se figent dans le fond vient du fait que la map n'est plus rafraichie pendant les pauses.
Code:
        if c == "\004"
          wait = 40
          until wait == 0
            wait -= 1
            Graphics.update
          end
        end

Qui doit devenir :
Code:
        if c == "\004"
          wait = 40
          until wait == 0
            wait -= 1
            Graphics.update
            $scene.update
          end
        end


Etc... pour le reste :p

Posté par Giratinaprimal le 25 Jan - 11:28 (2015)
Hello !

C'est corrigé et ça marche nickel ! Merci, Nuri Yuri Clin d'œil foireux
Le script a été mis à jour.

Posté par Nuri Yuri le 25 Jan - 12:34 (2015)
De rien :p
Je me servirais des commandes que t'as ajouté dans PSDK si j'y pense Gros matou qui ronronne