Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 4068 miembros registrados.
El último usuario registrado es Schwarz54.

Nuestros miembros han publicado un total de 84121 mensajes en 11982 argumentos.

[Tutorial] Personalizando la ventana de mensajes

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [Tutorial] Personalizando la ventana de mensajes

Mensaje por Wecoc el 2017-03-06, 21:21

Incluso usando scripts de mensajería avanzada, las ventanas de mensaje de los juegos RPG casi siempre se ven muy parecidas entre ellas; hay muy poca personalización más allá de la windowskin, la fuente y quizá como mucho integrar facesets, no disponibles por defecto en XP.
Eso es porque para personalizarlas bien es conveniente hacerlo por scripts.

Mi intención es explicar algunos trucos para hacer que tu windowskin pase de cutre a algo más 'top'. Son trucos separados que os pueden servir de referencia, pero la idea es hacer una windowskin única para el proyecto así que tendréis que hacer el esfuerzo de idearla vosotros mismos.

Está enfocado únicamente para RPG maker XP.

Sistema de mensajería avanzada

El sistema de mensajería del RPG maker por defecto es muy deficiente.
Si quieres ni que sea una integración básica tipo negrita o cursiva ya tienes que buscar un sistema de mensajería avanzada.
Lo bueno de éstos es que vienen con muchas funciones para que ya a tu manera puedas salirte un poco de lo default.
Para éste tutorial usaré Wecoc's Message System (WMS).
Los scripts de añadidos que pondré irían a un script a parte justo debajo de éste.


Incluso con el WMS, si creas un mensaje tal cual se verá como siempre.

Imagen:

Así que vayamos al grano con los trucos.

1. Cambiar la Windowskin

Algo que puedes hacer es hacer que la ventana de mensaje tenga una windowskin propia algo distinta de la del juego.
La clave es hacer una windowskin que pegue con el estilo del juego pero que no sea siempre la de los menús.

Para ello en el add-on solo hay que definir la nueva windowskin en el inicio de la ventana Window_Message y parecidas.

Script:
Código:
#------------------------------------------------------------------------------
# ** WMS 1.0 AddOns
#------------------------------------------------------------------------------
# 1 - Windowskin específica para mensajes
#------------------------------------------------------------------------------

module Message_System
  MESSAGE_SKIN = "001-Blue01" # Nombre de la windowskin
end

class Window_Message < Window_Selectable
  alias wms_add1_ini initialize unless $@
  def initialize(*args)
    wms_add1_ini(*args)
    self.windowskin = RPG::Cache.windowskin(Message_System::MESSAGE_SKIN)
  end
end

class Window_Choice < Window_Selectable
  alias wms_add1_ini initialize unless $@
  def initialize(*args)
    wms_add1_ini(*args)
    self.windowskin = RPG::Cache.windowskin(Message_System::MESSAGE_SKIN)
  end
end

class Window_Namebox < Window_Base
  alias wms_add1_ini initialize unless $@
  def initialize(*args)
    wms_add1_ini(*args)
    self.windowskin = RPG::Cache.windowskin(Message_System::MESSAGE_SKIN)
  end
end

class Pause < Sprite
  alias wms_add1_ini initialize unless $@
  def initialize(viewport)
    wms_add1_ini(viewport)
    self.windowskin = Message_System::MESSAGE_SKIN
  end
end

Imagen:

2. Parámetros por defecto de la ventana

Solo cambiando la posición y algunos parámetros de la ventana, logramos que se vea bastante distinta a lo de siempre.
En mi ejemplo he puesto que ésta siempre quede totalmente al borde, y no solo eso sinó que su altura depende de las líneas que hay. Es una modificación bastante sencilla de la opción "message_fit_text" del WMS en la que la ventana adopta el tamaño del texto. También cambié la opacidad del fondo (back_opacity) por una un poco más opaca. Todos esos parámetros por defecto se definen dentro de la clase Game_System del WMS. Puedes modificar otros de la misma forma, como la posición de la flechita pause, la alineación del texto, el tipo de ventana de elecciones... Dentro de la clase Font además se pueden cambiar parámetros del texto; en mi ejemplo le puse una sombra fina.

Script:
Código:
#------------------------------------------------------------------------------
# ** WMS 1.0 AddOns
#------------------------------------------------------------------------------
# 2 - Fijar posición al borde
#------------------------------------------------------------------------------

module Message_System
  BORDER_LIMIT = true   # Fijar la windowskin a los límites de la pantalla
  ADJUST_MODE = true    # Modo de texto más ajustado a la ventana
end

class Game_System
  alias wms_add2_ini initialize unless $@
  def initialize
    wms_add2_ini
    @message_fit_text = true    # Fit window size to the text size
    @reset_message = false      # Reset message when event terminates
    @message_x = 0              # Message Window X
    @message_width = 640        # Message Window Width
    @message_back_opacity = 200 # Message Window Back Opacity
    if Message_System::ADJUST_MODE
      @pause_y = -16
    else
      @pause_y = 0
    end
    @message_tab_size = 20
    @message_align = 0 # Message alignment
  end
end

class Window_Message < Window_Selectable
  alias wms_add2_ini initialize unless $@
  def initialize
    @dummy_window = Window_Base.new(80, 304, 480, 160)
    @dummy_window.z = 100
    if Message_System.constants.include?("MESSAGE_SKIN")
      skin = RPG::Cache.windowskin(Message_System::MESSAGE_SKIN)
      @dummy_window.windowskin = skin
    end
    wms_add2_ini
  end
  
  alias wms_add2_dis dispose unless $@
  def dispose
    wms_add2_dis
    @dummy_window.dispose
  end
  
  def fit_window_to_text
    font = self.contents.font.clone
    if Message_System::BORDER_LIMIT == true
      self.x = -2
      self.width = 640 + 4
    else
      self.x = 0
      self.width = 640
    end
    text = splited_text
    sorted = text.sort do |a, b|
      self.contents.text_size(b).width <=> self.contents.text_size(a).width
    end
    self.height = sorted.size * 32
    if Message_System::ADJUST_MODE == true
      self.height += 8
    else
      self.height += 32
    end
    if $game_system.number_window == false
      self.height += 32 if $game_temp.num_input_variable_id > 0
    end
    case $game_system.message_position
    when 0
      if Message_System::BORDER_LIMIT == true
        self.y = -2
      else
        self.y = 0
      end
    when 1
      self.y = 240 - self.height / 2
    when 2
      if Message_System::BORDER_LIMIT == true
        self.y = 480 - self.height + 2
      else
        self.y = 480 - self.height
      end
    end
    if Message_System::ADJUST_MODE == true
      self.y -= 16
      self.height += 32
    end
    self.contents = Bitmap.new(self.width - 32, self.height - 32)
    self.contents.font = font.clone
  end
  
  alias wms_add2_upd update unless $@
  def update
    wms_add2_upd
    @dummy_window.update
  end
  
  def x=(x)
    super(x)
    @dummy_window.x = x
  end
  
  def y=(y)
    super(y)
    if Message_System::ADJUST_MODE == true
      @dummy_window.y = y + 16
    else
      @dummy_window.y = y
    end
  end
  
  def width=(width)
    super(width)
    @dummy_window.width = width
  end
  
  def height=(height)
    super(height)
    if Message_System::ADJUST_MODE == true
      @dummy_window.height = height - 32
    else
      @dummy_window.height = height
    end
  end
  
  def visible=(visible)
    super(visible)
    @dummy_window.visible = visible
  end
  
  def opacity
    @dummy_window.opacity
  end
  
  def opacity=(opacity)
    @dummy_window.opacity = opacity
    super(0)
  end
  
  def back_opacity=(back_opacity)
    @dummy_window.back_opacity = back_opacity
    super(0)
  end
  
  def update_cursor_rect
    if $game_system.choice_window == true or @index < 0
      self.cursor_rect.empty
      return
    end
    setup = $game_temp.choice_setup[@index]
    x, y = *setup
    choices = []
    for i in 0...$game_temp.choices.size
      choices[i] = $game_temp.choices[i].clone
    end
    choices.each do |ch|
      unformated_text(ch)
    end
    sorted = choices.sort do |a, b|
      self.contents.text_size(b).width <=> self.contents.text_size(a).width
    end
    width = self.contents.text_size(sorted[0]).width + 8
    if $game_temp.choice_width != nil
      width = $game_temp.choice_width
    end
    self.cursor_rect.set(x, y * 32 + 4, width, 24)
  end
end

class Interpreter
  def define_namebox(x, y, width, height, name)
    $game_system.namebox_auto = false
    $game_system.namebox_pos = 0
    $game_system.namebox_align = 0
    temp_text = $game_temp.message_text
    if $game_system.message_fit_text == true
      l = 0
      loop do
        l += 1
        if @list[@index + l].code == 101
          $game_temp.message_text = @list[@index + l].parameters[0]
          break
        end
      end
      message_window.fit_window_to_text
    end
    $game_temp.message_text = temp_text
    namebox_window.x = message_window.x + x - 16
    namebox_window.y = message_window.y + y - 20
    namebox_window.width = width
    namebox_window.height = height
    namebox_window.name = name
    namebox_window.refresh
    namebox_window.visible = true
    namebox_window.opacity = 0
    return
  end
end

Usar las opciones que te da el propio sistema es importante. Para completar ésta parte del ejemplo usé la opción de colocar las elecciones donde se quiera del mensaje.

Imagen:

3. Ampliar códigos de mensaje a tu gusto

Ésto ya es más para entendidos, pero muchas veces te encontrarás con que te interesa mucho una opción que el sistema no te da por defecto.
Suele ser complicado de implementar ya que difícilmente se puede usar alias... pero vale la pena.
En éste ejemplo implementé una nueva opción "\fp" (de "fix point") que hace lo siguiente; donde se coloca luego se guarda la X y es la que se usa de inicio para las siguientes líneas.
Su utilidad es poder hacer cosas como éstas:

Código:
Alexis: Hola, qué tal soy Alexis bla bla bla
        bla bla como se ve se mantiene el "párrafo"

Script:
Código:
#------------------------------------------------------------------------------
# ** WMS 1.0 AddOns
#------------------------------------------------------------------------------
# 3 - Fijar punto de tabulación
#------------------------------------------------------------------------------

class Window_Base < Window
  alias wms_add3_ini initialize unless $@
  def initialize(x, y, width, height)
    wms_add3_ini(x, y, width, height)
    @fix_point = 0
  end
  
  def gsub_fixpoint(text) # \fp (fix point)
    return text.gsub(/\\[Ff][Pp]/) { "\\00044" }
  end
  
  alias wms_add3_get_codes get_text_codes unless $@
  def get_text_codes(text)
    text = wms_add3_get_codes(text)
    text = gsub_fixpoint(text)
    return text
  end
  
  def slice_text(text, x, y)
    # Text justification: define spaces (" ") width
    if $game_system.justify_text == true
      line_text = unformated_text(text.clone.to_a.shift.to_s)
      space_count = line_text.count(" ")
      line_text.gsub!("\n", "")
      if space_count != 0
        line_text.gsub!(" ", "")
        line_width = self.contents.text_size(line_text).width
        window_width = self.width
        just_x = (window_width - line_width - 48) / space_count
      end
    end
    # Start slice process
    while ((c = text.slice!(/(\\\d+|.)/m)) != nil)
      if c == "\\00000"
        c = "\\"
      end
      if c == "\\00001" # Change color
        text.sub!(/\[([0-9]+)\]/, "")
        color = $1.to_i
        if color >= 0 and color <= 7
          self.contents.font.color = text_color(color)
        end
        next
      end
      if c == "\\00002" # Window Gold
        if @gold_window == nil
          @gold_window = Window_Gold.new
          @gold_window.x = $game_system.gold_x
          @gold_window.y = $game_system.gold_y
          @gold_window.width = $game_system.gold_width
          @gold_window.height = $game_system.gold_height
          @gold_window.opacity = $game_system.gold_opacity
          @gold_window.back_opacity = $game_system.gold_back_opacity
        end
        next
      end
      if c == "\\00003" # Eval \s[id]
        text.sub!(/\[([0-9]+)\]/, "")
        eval_id = $1.to_i
        if not $game_temp.message_evals.keys.include?(eval_id)
          next
        end
        c_eval = $game_temp.message_evals[eval_id]
        unless c_eval.include?("self")
          result = Message_System.module_eval(c_eval)
        end
        if result.is_a?(String)
          text.insert(0, result)
        else
          c_text = Text.new(c_eval, x, y, self.contents.font.clone)
          c_text.eval_mode = true
          @text_array.push(c_text)
        end
        next
      end
      if c == "\\00004" # Eval \! (stop)
        c_text = Text.new("stop", x, y, self.contents.font.clone)
        c_text.eval_mode = true
        @text_array.push(c_text)
        next
      end
      if c == "\\00005" # Eval \tab[n] (tabulation)
        text.sub!(/\[([0-9]+)\]/, "")
        value = $1.clone.to_i
        c_text = Text.new("self.tab=#{value}", x, y, self.contents.font.clone)
        c_text.eval_mode = true
        @text_array.push(c_text)
        next
      end
      if c == "\\00006" # Choices \chc[n]
        if $1.nil?
          text.sub!(/\[([0-9]+)\]/, "#{$1}")
        else
          text.sub!(/\[([0-9]+)\]/, "")
        end
        if $game_system.choice_window
          next
        end
        index = $1.to_i
        next if $game_temp.choices[index] == nil
        choice = $game_temp.choices[index].clone
        next if choice.nil?
        $game_temp.choice_setup.store(index, [x, y])
        font = self.contents.font.clone
        slice = slice_choice(choice, x, y)
        self.contents.font = font
        x, y = slice
        sorted = $game_temp.choices.sort do |a, b|
          self.contents.text_size(b).width <=> self.contents.text_size(a).width
        end
        width = self.contents.text_size(sorted[0]).width + 8
        x += width
        next
      end
      if c == "\\00007" # \b (bold)
        self.contents.font.bold = !self.contents.font.bold
        next
      end
      if c == "\\00008" # \i (italic)
        self.contents.font.italic = !self.contents.font.italic
        next
      end
      if c == "\\00009" # \size[n] (text size)
        text.sub!(/\[([0-9]+)\]/, "")
        self.contents.font.size = $1.to_i
        next
      end
      if c == "\\00010" # \t (tabulation)
        tab_size = $game_system.message_tab_size
        x = (x.to_f / tab_size).ceil * tab_size
        next
      end
      if c == "\\00011" # \dn (deny the next \n)
        text.sub!("\n", "")
        next
      end
      if c == "\\00012" # \df (deny justification)
        next
      end
      if c == "\\00013" # \up (upcase)
        @upcase = !@upcase
        next
      end
      if c == "\\00014" # \bopc (back_opacity)
        text.sub!(/\[([0-9]+)\]/, "")
        $game_system.message_back_opacity = $1.to_i
        self.back_opacity = $1.to_i
        next
      end
      if c == "\\00015" # \c[n] (hexadecimal color)
        text.sub!(/\[([0123456789abcdef]+)\]/, "")
        hex_code = $1.to_s
        red   = ("0x" + hex_code.slice(0..1)).hex
        blue  = ("0x" + hex_code.slice(2..3)).hex
        green = ("0x" + hex_code.slice(4..5)).hex
        alpha = 255
        if hex_code.slice(6..7) != ""
          alpha = ("0x" + hex_code.slice(6..7)).hex
        end
        self.contents.font.color = Color.new(red, blue, green, alpha)
        next
      end
      if c == "\\00016" # \font[n] (font name)
        text.sub!(/\[(.*?)\]/, "")
        self.contents.font.name = $1.to_s
        next
      end
      if c == "\\00017" # \ic[n] (draw icon)
        text.sub!(/\[(.*?)\]/, "")
        x += 4
        name = $1.to_s
        bitmap = RPG::Cache.icon(name)
        self.contents.blt(x, (y * 32) + 4, bitmap, Rect.new(0, 0, 24, 24))
        x += 20
        next
      end
      if c == "\\00018" # \oa[n] (draw armor)
        text.sub!(/\[([0-9]+)\]/, "")
        x += 8
        item = $data_armors[$1.to_i]
        bitmap = RPG::Cache.icon(item.icon_name)
        self.contents.blt(x, (y * 32) + 4, bitmap, Rect.new(0, 0, 24, 24))
        self.contents.draw_text(x + 24, y * 32, 212, 32, item.name)
        size = self.contents.text_size(item.name).width + 20
        x += size
        next
      end
      if c == "\\00019" # \oi[n] (draw item)
        text.sub!(/\[([0-9]+)\]/, "")
        x += 8
        item = $data_items[$1.to_i]
        bitmap = RPG::Cache.icon(item.icon_name)
        self.contents.blt(x, (y * 32) + 4, bitmap, Rect.new(0, 0, 24, 24))
        self.contents.draw_text(x + 24, y * 32, 212, 32, item.name)
        size = self.contents.text_size(item.name).width + 20
        x += size
        next
      end
      if c == "\\00020" # \os[n] (draw skill)
        text.sub!(/\[([0-9]+)\]/, "")
        x += 8
        item = $data_skills[$1.to_i]
        bitmap = RPG::Cache.icon(item.icon_name)
        self.contents.blt(x, (y * 32) + 4, bitmap, Rect.new(0, 0, 24, 24))
        self.contents.draw_text(x + 24, y * 32, 212, 32, item.name)
        size = self.contents.text_size(item.name).width + 20
        x += size
        next
      end
      if c == "\\00021" # \ow[n] (draw weapon)
        text.sub!(/\[([0-9]+)\]/, "")
        x += 8
        item = $data_weapons[$1.to_i]
        bitmap = RPG::Cache.icon(item.icon_name)
        self.contents.blt(x, (y * 32) + 4, bitmap, Rect.new(0, 0, 24, 24))
        self.contents.draw_text(x + 24, y * 32, 212, 32, item.name)
        size = self.contents.text_size(item.name).width + 20
        x += size
        next
      end
      if c == "\\00022" # \opc (opacity)
        text.sub!(/\[([0-9]+)\]/, "")
        $game_system.message_opacity = $1.to_i
        self.opacity = $1.to_i
        next
      end
      if c == "\\00023" # \tl (justify text to left)
        $game_system.message_align = 0
        x = 0
        next
      end
      if c == "\\00024" # \tc (justify text to center)
        $game_system.message_align = 1
        line_text = unformated_text(text.clone.to_a.shift.to_s)
        line_text.gsub!("\n", "")
        line_width = self.contents.text_size(line_text).width
        window_width = self.width
        x = (window_width - line_width) / 2 - 32
        if $game_system.message_fit_text
          x += 8
        end
        next
      end
      if c == "\\00025" # \tr (justify text to right)
        $game_system.message_align = 2
        line_text = unformated_text(text.clone.to_a.shift.to_s)
        line_text.gsub!("\n", "")
        line_width = self.contents.text_size(line_text).width
        window_width = self.width
        x = window_width - line_width - 48
        if $game_system.message_fit_text
          x += 8
        end
        next
      end
      if c == "\\00027" # \wa[n] (autoclose wait frames)
        text.sub!(/\[([0-9]+)\]/, "")
        $game_system.autoclose_frames = $1.to_i
        next
      end
      if c == "\\00028" # Eval \sc[id] (special characters)
        text.sub!(/\[([0-9]+)\]/, "")
        eval_id = $1.to_i
        if not $game_temp.message_spchr.keys.include?(eval_id)
          next
        end
        c_eval = $game_temp.message_spchr[eval_id]
        c_text = Text.new(c_eval, x, y, self.contents.font.clone)
        c_text.special = true
        @text_array.push(c_text)
        bitmap = RPG::Cache.picture(c_text.text)
        x += bitmap.width
        next
      end
      if c == "\\00030" # \sh (shadow)
        self.contents.font.shadow = !self.contents.font.shadow
        next
      end
      if c == "\\00031" # \shx[n] (shadow x)
        text.sub!(/\[([0-9]+)\]/, "")
        self.contents.font.shadow_x = $1.to_i
        next
      end
      if c == "\\00032" # \shx[-n] (shadow x)
        text.sub!(/\[([0-9]+)\]/, "")
        self.contents.font.shadow_x = -$1.to_i
        next
      end
      if c == "\\00033" # \shy[n] (shadow y)
        text.sub!(/\[([0-9]+)\]/, "")
        self.contents.font.shadow_y = $1.to_i
        next
      end
      if c == "\\00034" # \shy[-n] (shadow y)
        text.sub!(/\[([0-9]+)\]/, "")
        self.contents.font.shadow_y = -$1.to_i
        next
      end
      if c == "\\00035" # \shc[n] (shadow color)
        text.sub!(/\[([0-9]+)\]/, "")
        color = $1.to_i
        if color >= 0 and color <= 7
          shadow_color = text_color(color)
          shadow_color.alpha = 100
          self.contents.font.shadow_color = shadow_color
        end
        next
      end
      if c == "\\00036" # \shc[n] (shadow color)
        text.sub!(/\[([0123456789abcdef]+)\]/, "")
        hex_code = $1.to_s
        red   = ("0x" + hex_code.slice(0..1)).hex
        blue  = ("0x" + hex_code.slice(2..3)).hex
        green = ("0x" + hex_code.slice(4..5)).hex
        alpha = 100
        if hex_code.slice(6..7) != ""
          alpha = ("0x" + hex_code.slice(6..7)).hex
        end
        self.contents.font.shadow_color = Color.new(red, blue, green, alpha)
        next
      end
      if c == "\\00037" # \q[n] (shortcuts)
        text.sub!(/\[([0-9]+)\]/, "")
        eval_id = $1.to_i
        if not $game_temp.shortcuts.keys.include?(eval_id)
          next
        end
        c_eval = $game_temp.shortcuts[eval_id]
        result = get_text_codes(c_eval)
        text.insert(0, result)
        next
      end
      if c == "\\00039" # \z[n] (z window)
        text.sub!(/\[([0-9]+)\]/, "")
        self.z = $1.to_i
        next
      end
      if c == "\\00040" # \ou (outline)
        self.contents.font.outline = !self.contents.font.outline
        next
      end
      if c == "\\00041" # \ouc[n] (outline color)
        text.sub!(/\[([0-9]+)\]/, "")
        color = $1.to_i
        if color >= 0 and color <= 7
          outline_color = text_color(color)
          self.contents.font.outline_color = outline_color
        end
        next
      end
      if c == "\\00042" # \ouc[n] (outline color)
        text.sub!(/\[([0123456789abcdef]+)\]/, "")
        hex_code = $1.to_s
        red   = ("0x" + hex_code.slice(0..1)).hex
        blue  = ("0x" + hex_code.slice(2..3)).hex
        green = ("0x" + hex_code.slice(4..5)).hex
        alpha = 255
        if hex_code.slice(6..7) != ""
          alpha = ("0x" + hex_code.slice(6..7)).hex
        end
        self.contents.font.outline_color = Color.new(red, blue, green, alpha)
        next
      end
      if c == "\\00043" # \e[n] (over event)
        text.sub!(/\[([0-9]+)\]/, "")
        $game_system.message_fit_text = true
        fit_window_to_text
        self.over_event($1.to_i)
        next
      end
      if c == "\\00044" # \fp (fix point)
        @fix_point = x
        next
      end
      if c == "\n" # Line jump
        y += 1
        just_x = 0
        # Next line justification
        if $game_system.justify_text == true
          line_text = unformated_text(text.clone.to_a.shift.to_s)
          space_count = line_text.count(" ")
          line_text.gsub!("\n", "")
          if space_count != 0
            line_text.gsub!(" ", "")
            line_width = self.contents.text_size(line_text).width
            window_width = self.width
            just_x = (window_width - line_width - 48) / space_count
          end
        end
        # Next line align
        case $game_system.message_align
        when 0 # Left
          x = @fix_point
        when 1 # Center
          line_text = unformated_text(text.clone.to_a.shift.to_s)
          line_text.gsub!("\n", "")
          line_width = self.contents.text_size(line_text).width
          window_width = self.width
          x = (window_width - line_width) / 2 - 32
          if $game_system.message_fit_text
            x += 8
          end
        when 2 # Right
          line_text = unformated_text(text.clone.to_a.shift.to_s)
          line_text.gsub!("\n", "")
          line_width = self.contents.text_size(line_text).width
          window_width = self.width
          x = window_width - line_width - 48
          if $game_system.message_fit_text
            x += 8
          end
        end
        next
      end
      if c == " " # Space
        c_text = Text.new(c, x, y, self.contents.font.clone)
        @text_array.push(c_text)
        if $game_system.justify_text == true
          line_text = text.clone.to_a.shift.to_s
          if line_text.include?("\\00012")
            x += c_text.width
          else
            x += just_x
          end
        else
          x += c_text.width
        end
        next
      end
      # Save the character on @text_array to write it later
      c.upcase! if @upcase
      c_text = Text.new(c, x, y, self.contents.font.clone)
      @text_array.push(c_text)
      x += c_text.width
    end
  end
end

class Window_Message < Window_Selectable
  alias wms_add3_reset reset_window unless $@
  def reset_window
    wms_add3_reset
    @fix_point = 0
  end
end

Lo que decía, para una implementación así de chorra el script resultante es bastante largo. Si estáis muy seguros de lo que hacéis podéis modificar el script de mensajería directamente, pero siempre es más arriesgado.

Para mostraros cómo queda eso, hice uso de algunas opciones más del script, como \tab para dejar espacio para una face, y \q[n] para atajos de código.
Nota: La face la saqué de Fire Emblem.

Imagen:

4. Opciones nuevas para el sistema

El objetivo de éste ejemplo es cambiar la posición de pause a la derecha de la ventana. De hecho ya expliqué eso en el punto 2, pero algunos RPG tienen una opción más difícil que quería mostrar. Esa opción consiste en mostrar la flechita pause justo después del último carácter del texto, por lo que cada vez su posición será distinta.

Eso implica crear la opción totalmente nueva para el sistema, ya que éste no tiene nada parecido. Por suerte no es una opción difícil.

Script:
Código:
#------------------------------------------------------------------------------
# ** WMS 1.0 AddOns
#------------------------------------------------------------------------------
# 4 - Cambiar posición de pause a la derecha de la ventana
#------------------------------------------------------------------------------

module Message_System
  PAUSE_IN_TEXT = true # Pause se muestra justo detrás del último carácter
end

class Game_System
  alias wms_add4_ini initialize unless $@
  def initialize
    wms_add4_ini
    @pause_x = 300
    @pause_y = 0
    if Message_System.constants.include?("ADJUST_MODE")
      if Message_System::ADJUST_MODE
        @pause_y = -8
      end
    end
    @pause_y -= 20
  end
end

class Window_Message < Window_Selectable
  alias wms_add4_slice_text slice_text
  def slice_text(text, x, y)
    if Message_System::PAUSE_IN_TEXT == true
      cloned = text.clone
      tab_x = 0
      while ((c = cloned.slice!(/(\\\d+|.)/m)) != nil)
        if c == "\\00005" # Eval \tab[n] (tabulation)
          text.sub(/\[([0-9]+)\]/, "")
          tab_x = $1.clone.to_i
        end
      end
    end
    wms_add4_slice_text(text, x, y)
    if Message_System::PAUSE_IN_TEXT == true
      px = @text_array[-1].x - (self.width - 32) / 2 + tab_x + 12
      px += @fix_point if defined?(@fix_point) != nil
      $game_system.pause_x = px
    end
  end
end

A parte, para ampliar un poco el ejemplo hice uso de la opción "namebox" que te da el sistema, así como otros detalles como colores de fuente personalizados o la opción de subrayar texto. Aunque todo ésto son detalles bastante chorras, en conjunto hacen mucho por el apartado gráfico del juego.

Imagen:

5. Uso de engines

Sí, los engines también tienen cabida aquí. En éste ejemplo creé un engine para mostrar una ventana de ayuda que cambia dinámicamente según la opción que tengas seleccionada.
Apenas necesita script, solo un pequeño bugfix para soportar ese uso de ventanas.

Script:
Código:
#------------------------------------------------------------------------------
# ** WMS 1.0 AddOns
#------------------------------------------------------------------------------
# 5 - Añadir la opción de Help Window
#------------------------------------------------------------------------------

class Interpreter
  def create_help_window
    @help_window = Window_Help.new
    if Message_System.constants.include?("MESSAGE_SKIN")
      skin = RPG::Cache.windowskin(Message_System::MESSAGE_SKIN)
      @help_window.windowskin = skin
    end
    @help_window.back_opacity = message_window.back_opacity
    @help_window.opacity = message_window.opacity
  end
  
  def clear
    clear_message_wecoc
    if !$game_system.nil? && !$game_system.map_interpreter.running?
      clear_message
    end
  end
end

Pongo imagen del resultado y del engine en proceso paralelo. Usa una variable para saber en qué elecciones estás, es decir si éste evento u otro del mapa tuviera otras elecciones, justo antes le asignarías a la variable otro valor, de modo que en el proceso paralelo se usará para saber la actual.

Imagen:



Y hasta aquí el tutorial.
avatar
Wecoc
Administrador
Administrador



Créditos 9129

Gracias : 471

Volver arriba Ir abajo

RPG Maker XP Me Gusta Esto...

Mensaje por xXIsrael0499Xx el 2017-03-06, 21:28

Bastante interesante... Me gusta Tu idea.. sobre mejorar las ventanas.. ya que como mencionaste.. por defecto en el maker.. #Esto es Personal... Son bastante feas.. y Es bueno saber Ciertos Truquitos para mejorar su vista...

** Aunque algunas Cosas que nombraste.. ya las sabia... otras no.. y se agradece el aporte.. creo que a mas de uno le servirá...

PD: Haciendo Publicidad a Tu Script Indirectamente XD
avatar
xXIsrael0499Xx
Soñador
Soñador

3/3

Créditos 783

Gracias : 29

Volver arriba Ir abajo

RPG Maker XP Re: [Tutorial] Personalizando la ventana de mensajes

Mensaje por orochii el 2017-03-06, 23:25

Viendo esta clase de temas con ideas y tal recuerdo porqué me gustan las comunidades :^3, ver lo que la otra gente hace y tal (y luego copiarles-- eh digo, es conocimiento cofcof). Es que no hay otra forma de hacer cosas nuevas, lo nuevo se hace del remix xd.

Asdf asdf aparte tu script mola Wec :^3.
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6359

Gracias : 325

http://ragnarokrproject.com/

Volver arriba Ir abajo

RPG Maker XP Re: [Tutorial] Personalizando la ventana de mensajes

Mensaje por RiKennedy-Maker el 2017-03-07, 14:07

Isra escribió:PD: Haciendo Publicidad a Tu Script Indirectamente XD
Wecocio escribió:Para éste tutorial usaré Wecoc's Message System (WMS).
Si él mismo lo dice :v


Muy buen tutorial Wec :v eh de admitir que te admiro secretamente xD ahora sé que otras cosas puedo hacer con tu WMS y con estos Add-Ons... aunque definir cosas por script y localizar coordenadas por pixel nunca se me dio bien xD
+1, definitivamente me será útil :v
PD: mientras escribía este mensaje se me vino a la mente algún script que se llame "Bbcode message system" xDDD ¿Saben que haría verad ¬w¬?
Saludos!! Cool
avatar
RiKennedy-Maker
Principiante
Principiante

0/3

Créditos 329

Gracias : 50

Volver arriba Ir abajo

RPG Maker XP Re: [Tutorial] Personalizando la ventana de mensajes

Mensaje por L Munch el 2017-03-08, 01:48

Esto es una cosa que necesitare y esta genial,pero para comprenderla correctamente tendria que estar toda la noche o dia y descansado para estudiarla,pero con esfuerzo no creo que se me haga dificil modo dios,bueno gracias yo voy a necesitar eso que coincidencia Very Happy
avatar
L Munch
Iniciado
Iniciado

0/3

Créditos 5

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: [Tutorial] Personalizando la ventana de mensajes

Mensaje por Eron el 2017-05-05, 13:02

Me pareció genial tu última propuesta de engine, mirar en qué índice de choices está el jugador y cambiar algo según ese.
Se me ocurre una variación, que es mostrar una Picture distinta según ese índice. Por ejemplo si las elecciones son [Alexis, Basil...] que cuando estás encima de Basil salga el Battler de Basil.

En fin, buen aporte.
avatar
Eron
Principiante
Principiante

0/3

Créditos 1283

Gracias : 54

Volver arriba Ir abajo

RPG Maker XP Re: [Tutorial] Personalizando la ventana de mensajes

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.