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 3763 miembros registrados.
El último usuario registrado es Carlos Rodriguez.

Nuestros miembros han publicado un total de 85779 mensajes en 12216 argumentos.

[XP] Message Font Fix (espacio entre letras)

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Message Font Fix (espacio entre letras)

Mensaje por Wecoc el 2016-11-28, 22:07

Ledai y yo hemos estado hablando de un problema recurrente del RPG maker XP/VX/Ace. No sé si me explicaré muy bien, pero en resumen digamos que a veces cuando insertas una fuente para usarla en el RPG maker la separación entre algunas letras no se corresponde a como se ve en un editor de texto.

Imagen:

Las fuentes que quedarían superpuestas porque tienen esos trazos quedan totalmente separadas.

Es problema del maker, del modo como lee las fuentes para los mensajes.
El modo en el que se muestran los textos en las ventanas y en la ventana de mensaje de evento son distintos. En las ventanas normales el texto se muestra todo a la vez, con un único "draw_text" para todo ese texto, por lo que ahí no debería haber ese problema. En los mensajes de evento en cambio las letras se muestran una a una y a la "x" se le va sumando el tamaño de la letra anterior, por eso pasa eso. Está hecho así para leer bien los carácteres especiales \c[n] y todo eso, no hay otro modo mejor de hacerlo.

La forma de arreglar ese problema es definir en una global las alteraciones de la x personalizadas que quieras hacer en algunas letras.

Las instrucciones que daré a continuación sirven para XP, VX y Ace, y sirven además para insertar el fix en scripts de mensajes personalizados. Explico los pasos porque no es complicado hacerse el script uno mismo, y como hay tantos scripts que modifican el refresh de Window_Message no hay más remedio.

Instrucciones:
Se define en una global dentro de Window_Message para cada letra la diferencia que quieres aplicarle en la x antes de dibujar ésta y después (de cara a dibujar la siguiente).
Así: Nombre fuente => [[letra, x (antes), x (después)], ...]
De ese modo configuras todas las fonts que uses en el juego y tengan ese problema. La x (después) suele valer 0, solo la puse por si acaso.

Ejemplo:
Código:
 CONF_FONTS = { "Arial" => [ ["f", -8, 0], ["g", -8, 0] ] }

Luego solo hay que buscar en el refresh dónde se añade el tamaño de la letra actual a la x (siempre ocurre justo después del draw_text de esa letra, y se mide con un self.contents.text_size)

Luego solo hay que añadir ésto justo antes del draw_text:

Código:
       # New X feature (Before)
        if !CONF_FONTS[self.contents.font.name].nil?
          array = CONF_FONTS[self.contents.font.name].select{|a| a[0] == c}[0]
          x += array[1] if !array.nil?
        end

Y ésto después del text_size que comenté antes:

Código:
       # New X feature (After)
        if !CONF_FONTS[self.contents.font.name].nil?
          array = CONF_FONTS[self.contents.font.name].select{|a| a[0] == c}[0]
          x += array[2] if !array.nil?
        end

Para quien use el XP sin scripts de mensajes costumizados, os pongo el script ya hecho, pegadlo encima de main:

Código:
#==============================================================================
# ** Message Font Fix
#------------------------------------------------------------------------------
#  Autor: Wecoc (no requiere créditos)
#==============================================================================

class Window_Message < Window_Selectable

  # Nombre fuente => [[letra, x (antes), x (después)], ...]
  CONF_FONTS = { "Arial" => [ ["f", -8, 0], ["g", -8, 0] ] }
  
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    x = y = 0
    @cursor_width = 0
    # Indent if choice
    if $game_temp.choice_start == 0
      x = 8
    end
    # If waiting for a message to be displayed
    if $game_temp.message_text != nil
      text = $game_temp.message_text
      # Control text processing
      begin
        last_text = text.clone
        text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$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
      # Change "\\\\" to "\000" for convenience
      text.gsub!(/\\\\/) { "\000" }
      # Change "\\C" to "\001" and "\\G" to "\002"
      text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
      text.gsub!(/\\[Gg]/) { "\002" }
      # Get 1 text character in c (loop until unable to get text)
      while ((c = text.slice!(/./m)) != nil)
        # If \\
        if c == "\000"
          # Return to original text
          c = "\\"
        end
        # If \C[n]
        if c == "\001"
          # Change text color
          text.sub!(/\[([0-9]+)\]/, "")
          color = $1.to_i
          if color >= 0 and color <= 7
            self.contents.font.color = text_color(color)
          end
          # go to next text
          next
        end
        # If \G
        if c == "\002"
          # Make gold window
          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 = self.opacity
            @gold_window.back_opacity = self.back_opacity
          end
          next
        end
        # If new line text
        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
        # New X feature (Before)
        if !CONF_FONTS[self.contents.font.name].nil?
          array = CONF_FONTS[self.contents.font.name].select{|a| a[0] == c}[0]
          x += array[1] if !array.nil?
        end
        # Draw text
        self.contents.draw_text(4 + x, 32 * y, 40, 32, c)
        x += self.contents.text_size(c).width
        # New X feature (After)
        if !CONF_FONTS[self.contents.font.name].nil?
          array = CONF_FONTS[self.contents.font.name].select{|a| a[0] == c}[0]
          x += array[2] if !array.nil?
        end
      end
    end
    # If choice
    if $game_temp.choice_max > 0
      @item_max = $game_temp.choice_max
      self.active = true
      self.index = 0
    end
    # If number input
    if $game_temp.num_input_variable_id > 0
      digits_max = $game_temp.num_input_digits_max
      number = $game_variables[$game_temp.num_input_variable_id]
      @input_number_window = Window_InputNumber.new(digits_max)
      @input_number_window.number = number
      @input_number_window.x = self.x + 8
      @input_number_window.y = self.y + $game_temp.num_input_start * 32
    end
  end  
end
avatar
Wecoc
Administrador
Administrador



Créditos 9370

Gracias : 517

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Message Font Fix (espacio entre letras)

Mensaje por Ledai el 2016-11-29, 17:51

Pues es un aporte, nuevamente; único. 
No conocía la diferencia de actuación a la hora de dibujar el texto en un menú y en el cuadro de evento, pero ahora tiene sentido el problema y la solución.

Acabo de adaptar el Script que uso en el proyecto siguiendo tus instrucciones y siguiendo paso a paso el script original y...

¡¡En serio, si lo he logrado hacer yo con un script en japones lo puede hacer cualquiera XD!!

Buen aporte y buena explicación, ahora este tipo de  fuente no parecerá partida.
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 2814

Gracias : 174

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Message Font Fix (espacio entre letras)

Mensaje por kyonides-arkanthos el 2016-12-01, 03:46

Código:
CONF_FONTS = { "Arial" => [ ["f", -8, 0], ["g", -8, 0] ] }

Creo que sería más efectivo hacerlo así:

CONF_FONTS = { "Arial" => { "f" => [-8, 0], "g" => [-8, 0] } }

Entonces más adelante solo habría que llamarlo así:

x1, x2 = CONF_FONTS[contents.font.name][c] || [0, 0]
x += x1

y luego...

x+= x2

Es solo una sugerencia para minimizar la cantidad de código que se leerá desde la ventana de mensajes.
avatar
kyonides-arkanthos
Principiante
Principiante

0/3

Créditos 476

Gracias : 69

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Message Font Fix (espacio entre letras)

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.