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 4193 miembros registrados.
El último usuario registrado es Godot.

Nuestros miembros han publicado un total de 85222 mensajes en 12132 argumentos.

[XP][Tutorial] Transiciones de Pantalla (+ Script Transition EX)

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP][Tutorial] Transiciones de Pantalla (+ Script Transition EX)

Mensaje por Wecoc el 2016-07-28, 15:07

Hoy vengo a explicaros cómo funcionan las transiciones de pantalla de RPG maker. Sé que se hizo un tutorial hace poco del mismo tema pero faltan algunas cosas que quiero puntualizar. Muchas sirven para VX/Ace pero me centro en XP porque es el que más conozco.

Tutorial básico

Para aplicar una transición de pantalla hay que seguir los siguientes pasos:

1 - Se congela la pantalla, de modo que los cambios que ocurran no se ven a simple vista.

Método de script: Graphics.freeze
Comando de Evento: Preparar Transición

2 - A continuación se efectuan todos los cambios que hagan falta: Cambio de tono, teletransportar...

Spoiler:
Atención, Teletransportar ya tiene los tres pasos integrados, por ello si se hacen manualmente hay que desactivarlos.

3 - Se descongela la imagen y se cambia de una a otra, gradualmente.

Método de script (sin imagen): Graphics.transition
Comando de Evento: Ejecutar Transición - Ninguna -

Spoiler:

Por script, como es habitual, tienes más opciones que con el comando de evento.

Duration

La más simple es añadir la duración de la transición. La duración de una transición se define en frames, pero los frames en script no equivalen a los frames de los eventos, sino al doble.
Por lo tanto, se puede poner el método de la siguiente forma si os es más cómodo: Graphics.transition(frames*2). El valor por defecto es 8 (4*2)

Filename

Se puede usar una imagen en blanco y negro para que la transición la utilice para cambiar de una pantalla a la otra.

Spoiler:

Método de script: Graphics.transition(duración, nombre de archivo)
Comando de Evento: Ejecutar Transición - Gráfico -

El nombre de archivo incluye sus carpetas dentro del proyecto (aunque sea RTP)
Ejemplo: "Graphics/Transitions/002-Blind02"

El gráfico de transición funciona como un Plane. Eso significa que no tiene por qué hacer 640 x 480, puede tener un tamaño menor, y loopeará por toda la pantalla.

Vague

Finalmente algo que poca gente tiene en cuenta, es que por script se puede definir el 'vague' o suavidad del efecto. Por defecto vale 40 y no tiene límites aunque recomiendo no pasar mucho del doble de la duración.

Spoiler:

Método de script: Graphics.transition(duración, nombre de archivo, vague)

Script Transition EX y sus añadidos

Hice un script (no pido créditos puesto que no es complicado) que añade algunas propiedades extra a la transición de pantalla.
Tiene una pequeña pega y es que no debéis tener nunca en el juego alguna transición que se llame t.png, puesto que usa internamente un gráfico con ese nombre.
Además si queréis hacer cosas complejas con éste quizá dé un poco de lag, puesto que no usa ninguna dll.

Script:

Código:
#==============================================================================
# ** Transition EX
#==============================================================================

module RPG
  module Cache
    def self.transition(filename)
      self.load_bitmap("Graphics/Transitions/", filename)
    end
  end
end

module Graphics
  class << self
    alias wecoc_trans_EX transition unless $@
    def transition(duration=8, filename="", vague=40)
      if !filename.is_a?(String)
        filename.make_png('t', 'Graphics/Transitions/')
        wecoc_trans_EX(duration, 'Graphics/Transitions/' + 't.png', vague)
        File.delete('Graphics/Transitions/' + 't.png')
        return
      end
      wecoc_trans_EX(duration, filename, vague)
    end
    
    def transition_focus(duration, transition, event=$game_player,
      color=Color.new(255,255,255), vague=40)
      bitmap = Bitmap.new(640, 480)
      bitmap.fill_rect(0, 0, 640, 480, color)
      if event.is_a?(Game_Character)
        x = event.screen_x
        y = event.screen_y
      elsif event.is_a?(Array)
        x = event[0]
        y = event[1]
      end
      t = RPG::Cache.load_bitmap('', transition)
      sx = x - (t.width / 2)
      sy = y - (t.height / 2)
      src_rect = Rect.new(0, 0, t.width, t.height)
      bitmap.blt(sx, sy, t, src_rect)
      transition(duration, bitmap, vague)
    end
  end
end

module Zlib
  class Png_File < GzipWriter
    def make_png(bitmap_Fx,mode)
      @mode = mode
      @bitmap_Fx = bitmap_Fx
      self.write(make_header)
      self.write(make_ihdr)
      self.write(make_idat)
      self.write(make_iend)
    end

    def make_header
      return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
    end

    def make_ihdr
      ih_size = [13].pack("N")
      ih_sign = "IHDR"
      ih_width = [@bitmap_Fx.width].pack("N")
      ih_height = [@bitmap_Fx.height].pack("N")
      ih_bit_depth = [8].pack("C")
      ih_color_type = [6].pack("C")
      ih_compression_method = [0].pack("C")
      ih_filter_method = [0].pack("C")
      ih_interlace_method = [0].pack("C")
      string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
               ih_compression_method + ih_filter_method + ih_interlace_method
      ih_crc = [Zlib.crc32(string)].pack("N")
      return ih_size + string + ih_crc
    end

    def make_idat
      header = "\x49\x44\x41\x54"
      case @mode
      when 1
        data = make_bitmap_data#1
      else
        data = make_bitmap_data
      end
      data = Zlib::Deflate.deflate(data, 8)
      crc = [Zlib.crc32(header + data)].pack("N")
      size = [data.length].pack("N")
      return size + header + data + crc
    end

    def make_bitmap_data1
      w = @bitmap_Fx.width
      h = @bitmap_Fx.height
      data = []
      for y in 0...h
        data.push(0)
        for x in 0...w
          color = @bitmap_Fx.get_pixel(x, y)
          red = color.red
          green = color.green
          blue = color.blue
          alpha = color.alpha
          data.push(red)
          data.push(green)
          data.push(blue)
          data.push(alpha)
        end
      end
      return data.pack("C*")
    end

    def make_bitmap_data
      gz = Zlib::GzipWriter.open('hoge.gz')
      t_Fx = 0
      w = @bitmap_Fx.width
      h = @bitmap_Fx.height
      data = []
      for y in 0...h
        data.push(0)
        for x in 0...w
          t_Fx += 1
          if t_Fx % 10000 == 0
            Graphics.update
          end
          if t_Fx % 100000 == 0
            s = data.pack("C*")
            gz.write(s)
            data.clear
            #GC.start
          end
          color = @bitmap_Fx.get_pixel(x, y)
          red = color.red
          green = color.green
          blue = color.blue
          alpha = color.alpha
          data.push(red)
          data.push(green)
          data.push(blue)
          data.push(alpha)
        end
      end
      s = data.pack("C*")
      gz.write(s)
      gz.close    
      data.clear
      gz = Zlib::GzipReader.open('hoge.gz')
      data = gz.read
      gz.close
      File.delete('hoge.gz')
      return data
    end

    def make_iend
      ie_size = [0].pack("N")
      ie_sign = "IEND"
      ie_crc = [Zlib.crc32(ie_sign)].pack("N")
      return ie_size + ie_sign + ie_crc
    end
  end
end

class Bitmap
  def make_png(name="like", path="",mode=0)
    make_dir(path) if path != ""
    Zlib::Png_File.open("temp.gz") {|gz|
      gz.make_png(self,mode)
    }
    Zlib::GzipReader.open("temp.gz") {|gz|
      $read = gz.read
    }
    f = File.open(path + name + ".png","wb")
    f.write($read)
    f.close
    File.delete('temp.gz')
  end

  def make_dir(path)
    dir = path.split("/")
    for i in 0...dir.size
      unless dir == "."
        add_dir = dir[0..i].join("/")
        begin
          Dir.mkdir(add_dir)
        rescue
        end
      end
    end
  end
end

La mejora principal del script es que permite (además de todo lo default) cargar directamente un gráfico al método de transición.

Método de script: Graphics.transition(duración, archivo)

Ejemplo de archivo: RPG::Cache.transition("002-Blind02")

Esa mejora que no parece muy significativa, permite centrar una transición a un punto concreto del mapa, tal como se ve a continuación.

Método de script: Graphics.transition_focus(duración, nombre de transición, evento)

El evento por defecto es el personaje ($game_player), en su posición antes de la transición. Además puedes añadir color de fondo en caso de que la transición a centrar no ocupe todo el mapa; por defecto es blanco. Finalmente puedes definir el vague como por defecto.

Método de script: Graphics.transition_focus(duración, nombre de archivo, evento, color, vague)

En vez del evento a veces es útil centrarlo a una coordenada de pantalla definida, por lo que también puse esa posibilidad.

Método de script: Graphics.transition_focus(duración, nombre de archivo, [X, Y], color, vague)

Ejemplo aplicado: Graphics.transition_focus(40, "Graphics/Transitions/020-Flat01", [12, 12], Color.new(128, 128, 128), 60)

Spoiler:

A parte de eso quizá usar archivo en vez de nombre de archivo en transition os sirva para alguna otra cosa, ahí ya os toca a vosotros ser creativos.

Espero que os haya servido algo de ésto, especialmente la primera parte.

Adicional:
A los que estáis haciendo un juego oldschool quizá os interese que el vague por defecto sea 0 y no 40. Para ello solo tenéis que usar éste script.

Código:
module Graphics
  class << self
    alias trans_vague0 transition unless $@
    def transition(duration=8, filename="", vague=0)
      trans_vague0(duration, filename, vague)
    end
  end
end

Si usáis los dos, éste va debajo del otro.
avatar
Wecoc
Administrador
Administrador



Créditos 9272

Gracias : 503

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.