Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[Ayuda] Conversión de Ace a VX y personalización de script "Battle swirl"

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker VX [Ayuda] Conversión de Ace a VX y personalización de script "Battle swirl"

Mensaje por Oscar92player el 2015-03-29, 10:21

¡Buenas a todos!

Después de buscar una pechá por ahí, por fin encontré un script que simula el "remolino" que hace la pantalla al entrar en una batalla, como en la mayoría de juegos de Final Fantasy. Es el siguiente:

Frame buffer battle swirl:

Código:
module FrameBuffer

  def self.start(frames = 1, viewport_z = 10000)
    dispose unless disposed?
    this_frame =  Graphics.snap_to_bitmap
    @buffer = []
    @viewport = Viewport.new
    @viewport.z = viewport_z
    
    frames.times do
      sprite = Sprite.new(@viewport)
      sprite.bitmap = this_frame.clone
      sprite.x = Graphics.width / 2
      sprite.y = Graphics.height / 2
      sprite.ox = Graphics.width / 2
      sprite.oy = Graphics.height / 2
      @buffer.push(sprite)
    end
    this_frame.dispose
  end
  
  def self.dispose
    return if disposed?
    @buffer.each {|sprite| sprite.dispose}
    @viewport.dispose if @viewport
    @buffer = nil
  end
  
  def self.disposed?
    !@buffer
  end
  
  # Deletes the oldest frame bitmaps and shuffles all the bitmaps down
  # replacing the first frame with a fresh snap shot
  def self.cycle
    return if disposed?
    @buffer[-1].bitmap.dispose
    @buffer.each_index do |i|
      next if i == 0
      @buffer[i].bitmap = @buffer[i - 1].bitmap
    end
    @buffer[0].bitmap = Graphics.snap_to_bitmap
  end
  
  # Set's all the frame buffer sprites to use a fresh snapshot
  def self.refresh
    this_frame = Graphics.snap_to_bitmap
    @buffer.each do |sprite|
      sprite.bitmap.dispose
      sprite.bitmap = this_frame.clone
    end
    this_frame.dispose
  end
  
  def self.[](num)
    return nil if disposed?
    return @buffer[num]
  end
  
end

class Scene_Map < Scene_Base

  #--------------------------------------------------------------------------
  # * Preprocessing for Battle Screen Transition
  #--------------------------------------------------------------------------
  def pre_battle_scene
    Graphics.update
    Graphics.freeze
    
    FrameBuffer.start(3)
    
    FrameBuffer[0].z = 0
    FrameBuffer[0].zoom_x = 1
    FrameBuffer[0].zoom_y = 1
    FrameBuffer[0].opacity = 235
    FrameBuffer[0].angle = 0
    FrameBuffer[0].blend_type = 0
    
    FrameBuffer[1].z = 1
    FrameBuffer[1].zoom_x = 1.01
    FrameBuffer[1].zoom_y = 1.01
    FrameBuffer[1].opacity = 128
    FrameBuffer[1].angle = 359
    FrameBuffer[1].blend_type = 0
  
    FrameBuffer[2].z = 2
    FrameBuffer[2].zoom_x = 0.8
    FrameBuffer[2].zoom_y = 0.9
    FrameBuffer[2].opacity = 12
    FrameBuffer[2].angle = 12
    FrameBuffer[2].blend_type = 1
    
    @spriteset.dispose_characters
    BattleManager.save_bgm_and_bgs
    BattleManager.play_battle_bgm
    Sound.play_battle_start
  end

  #--------------------------------------------------------------------------
  # * Execute Pre-Battle Transition
  #--------------------------------------------------------------------------
  def perform_battle_transition
    Graphics.transition(1)
    (0..60).each do |i|
      Graphics.brightness = 255
      FrameBuffer.refresh
      Graphics.frame_reset
      Graphics.brightness = 255 - (255 * ((i - 40) / 20.0)) if i > 40
      Graphics.update
    end
    FrameBuffer.dispose
    Graphics.freeze
  end
  
end

El cógido, por lo que sé y he leído, parece que se aprovecha de sacar una captura de pantalla del juego, y luego se encarga de hacer esa especie de efecto.

El único problema es que el proyecto que estoy haciendo se encuentra en el RPG maker VX, pero el script está diseñado para el Ace. Ya he probado a copiarlo sin más en el editor, pero salta un fallo, dejando claro que de compatible nanai de la china...

Sé que hay buenos scripters por aquí, y el script en sí no es demasiado largo, así que se agradecería toda ayuda ofrecida para convertir este script de una versión a otra.

También hay un objetivo opcional en esto, y es que me gustaría que el script, aparte de poder hacer el "remolino" antes de la batalla, pueda hacer también otros efectos (ej: Final Fantasy VIII, cuando luchas contra un jefe que se cruza una imagen cuadriplicada hacia el centro con un efecto de brillo). Y también por supuesto, ponerle un sonido de transición distinto para cada caso.

Sé que es mucho pedir para un script tan chico. ¡Gracias por adelantado a todos por la ayuda!
¡Saludos!
avatar
Oscar92player
Principiante
Principiante

0/3

Créditos 344

Gracias : 39

Volver arriba Ir abajo

RPG Maker VX Re: [Ayuda] Conversión de Ace a VX y personalización de script "Battle swirl"

Mensaje por orochii el 2015-03-29, 13:49

Listo. Convertido. No he hecho lo demás, pero bueh xD. Habría que ver cómo eran exactamente las transiciones del FF8 porque no las recuerdo xDD.
Código:
module FrameBuffer

  def self.start(frames = 1, viewport_z = 10000)
    dispose unless disposed?
    this_frame =  Graphics.snap_to_bitmap
    @buffer = []
    @viewport = Viewport.new(0,0,544,416)
    @viewport.z = viewport_z
    
    frames.times do
      sprite = Sprite.new(@viewport)
      sprite.bitmap = this_frame.clone
      sprite.x = Graphics.width / 2
      sprite.y = Graphics.height / 2
      sprite.ox = Graphics.width / 2
      sprite.oy = Graphics.height / 2
      @buffer.push(sprite)
    end
    this_frame.dispose
  end
  
  def self.dispose
    return if disposed?
    @buffer.each {|sprite| sprite.dispose}
    @viewport.dispose if @viewport
    @buffer = nil
  end
  
  def self.disposed?
    !@buffer
  end
  
  # Deletes the oldest frame bitmaps and shuffles all the bitmaps down
  # replacing the first frame with a fresh snap shot
  def self.cycle
    return if disposed?
    @buffer[-1].bitmap.dispose
    @buffer.each_index do |i|
      next if i == 0
      @buffer[i].bitmap = @buffer[i - 1].bitmap
    end
    @buffer[0].bitmap = Graphics.snap_to_bitmap
  end
  
  # Set's all the frame buffer sprites to use a fresh snapshot
  def self.refresh
    this_frame = Graphics.snap_to_bitmap
    @buffer.each do |sprite|
      sprite.bitmap.dispose
      sprite.bitmap = this_frame.clone
    end
    this_frame.dispose
  end
  
  def self.[](num)
    return nil if disposed?
    return @buffer[num]
  end
  
end

class Scene_Map < Scene_Base

  #--------------------------------------------------------------------------
  # * Preprocessing for Battle Screen Transition
  #--------------------------------------------------------------------------
  alias fbst_call_battle call_battle
  def call_battle
    Graphics.update
    Graphics.freeze
    
    FrameBuffer.start(3)
    
    FrameBuffer[0].z = 0
    FrameBuffer[0].zoom_x = 1
    FrameBuffer[0].zoom_y = 1
    FrameBuffer[0].opacity = 235
    FrameBuffer[0].angle = 0
    FrameBuffer[0].blend_type = 0
    
    FrameBuffer[1].z = 1
    FrameBuffer[1].zoom_x = 1.01
    FrameBuffer[1].zoom_y = 1.01
    FrameBuffer[1].opacity = 128
    FrameBuffer[1].angle = 359
    FrameBuffer[1].blend_type = 0
  
    FrameBuffer[2].z = 2
    FrameBuffer[2].zoom_x = 0.8
    FrameBuffer[2].zoom_y = 0.9
    FrameBuffer[2].opacity = 12
    FrameBuffer[2].angle = 12
    FrameBuffer[2].blend_type = 1
    
    fbst_call_battle
    
    #@spriteset.dispose_characters
    #BattleManager.save_bgm_and_bgs
    #BattleManager.play_battle_bgm
    #Sound.play_battle_start
  end

  #--------------------------------------------------------------------------
  # * Execute Pre-Battle Transition
  #--------------------------------------------------------------------------
  def perform_battle_transition
    Graphics.transition(1)
    (0..60).each do |i|
      Graphics.brightness = 255
      FrameBuffer.refresh
      Graphics.frame_reset
      Graphics.brightness = 255 - (255 * ((i - 40) / 20.0)) if i > 40
      Graphics.update
    end
    FrameBuffer.dispose
    Graphics.freeze
  end
  
end

No pido créditos por cierto. Salut!
avatar
orochii
Reportero

0/3

Créditos 7614

Gracias : 415

Volver arriba Ir abajo

RPG Maker VX Re: [Ayuda] Conversión de Ace a VX y personalización de script "Battle swirl"

Mensaje por Oscar92player el 2015-03-30, 09:49

Gracias por la conversión, orochii, funciona perfectamente.

Pues, transiciones de FF8... a ver cómo lo explico...

1.- Para las batallas corrientes, que es simplemente un fundido en negro desde la derecha o izquierda de la pantalla:
Transición 1:


2.- Y para la de los jefes, que la imagen se multiplicaba en cuatro, una hacia cada esquina de la pantalla, y que luego convergen hacia el centro aplicando zoom y una especie de efecto de brillo:
Transición 2:

No son imágenes muy explicativas porque las he tenido que capturar del juego mismo en mi PC y no soy muy preciso a la hora de hacer pantallazos, pero más o menos se ve lo que me gustaría hacer, aunque no sé si este script lo permite, sería cuestión de probar (aunque por mi parte, tampoco sé mucho de programación).

¡Cualquier ayuda extra es bien recibida!
¡Saludos!
avatar
Oscar92player
Principiante
Principiante

0/3

Créditos 344

Gracias : 39

Volver arriba Ir abajo

RPG Maker VX Re: [Ayuda] Conversión de Ace a VX y personalización de script "Battle swirl"

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.