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

Nuestros miembros han publicado un total de 84809 mensajes en 12071 argumentos.

Efecto ondeante de RPGVX en XP

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP Efecto ondeante de RPGVX en XP

Mensaje por AlbSchenk el 2017-07-25, 22:38

Buenas. Tengo un problema:
He encontrado un script que simula un efecto ondeante en la pantalla, al parecer original del RPGVX. El problema que encuentro es que, aunque está muy bien, se matiene el efecto todo el tiempo, y mi proyecto requiere emplear el script en momentos determinados, y por tanto desactivarlo el resto del tiempo. Entonces he pensado en la llamada de script para utilizarlo solo cuando sea necesario, sin embargo no sé como llamar a ese script.

---Script---

wave effect:
Código:
#========================================
# XP Wave Effect
#----------------------------------------
#by:      zecomeia
#date:    01/03/2010
#for:     RGSS
#version: 1.0
#www.colmeia-do-ze.blogspot.com
#----------------------------------------
=begin
Reproduction of the VX's wave effect
(see the help file of the RPGMaker VX
in the RGSS manual reference topic)
=end

#==============#
# Sprite class #
#==============#
class Sprite

include Math

attr_accessor   :wave_amp
attr_accessor   :wave_length
attr_accessor   :wave_speed
attr_accessor   :wave_phase
attr_accessor   :temp_bitmap

alias initialize default_initialize rescue nil
alias default_initialize initialize
def initialize(viewport=nil)
  @wave_amp = 2
  @wave_length = 72
  @wave_speed = 720
  @wave_phase = 0.25
  default_initialize(viewport)
  @temp_bitmap = nil
end

alias update default_update rescue nil
alias default_update update
def update()
  # the wave effect only works if wave_amp
  # propertie is a number more than zero
  wave_effect if @wave_amp > 0
  default_update()
end

# Return the width of image, because when use
# obj.bitmap.width the value will be more than
# the original value(because effect)
def width()
  return (self.bitmap.width - @wave_amp * 2)
end
 
#---------------
# Wave Effect
#---------------
def wave_effect()
  return if self.bitmap.nil?
  @temp_bitmap = self.bitmap if @temp_bitmap.nil?
  cw = @temp_bitmap.width + (@wave_amp * 2)
  ch = @temp_bitmap.height
  # Follow the VX wave effect, each horizontal line
  # has 8 pixel of height. This device provides less
  # lag in game.
  divisions = @temp_bitmap.height / 8
  divisions += 1 if @temp_bitmap.height % 8 != 0
  self.bitmap = Bitmap.new(cw, ch)
  for i in 0..divisions
    x = @wave_amp * Math.sin(i * 2 * PI / (@wave_length / 8).to_i + Math.deg_to_rad(@wave_phase))
    src_rect = Rect.new(0, i*8, @temp_bitmap.width, 8)
    dest_rect = Rect.new(@wave_amp + x, i * 8, @temp_bitmap.width, 8)
    self.bitmap.stretch_blt(dest_rect, @temp_bitmap, src_rect)
  end
  # frame rate: VX = 60 | XP = 40
  # wave speed compatibility VX to XP: wave_speed * 60/40
  # then: wave_speed * 1.5
  @wave_phase += @wave_speed * 1.5 / @wave_length
  @wave_phase -= 360 if @wave_phase > 360
  @wave_phase += 360 if @wave_phase < 0
end

end

#=============#
# module Math #
#=============#
module Math

#-------------------------------
# Conversion Degree to Radian
#-------------------------------
def Math.deg_to_rad(deg)
  return (deg * PI) / 180.0
end

end

Me preguntaba si alguien conoce una manera de llamar al script, para activarlo y desactivarlo,
o si conoce alguna forma alternativa de hacerlo.
Además me interesa saber si alguien conoce de más efectos de pantalla similares.

Gracias, un saludo.
avatar
AlbSchenk
Iniciado
Iniciado

0/3

Créditos 342

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: Efecto ondeante de RPGVX en XP

Mensaje por Wecoc el 2017-07-26, 00:51

Prueba con éste edit:

Código:
#==============================================================================
# ** [XP] Wave Effect
#------------------------------------------------------------------------------
# By:         Zecomeia
# Date:       01/03/2010
# Version:    1.0
# Edit by:    Wecoc
# Edit Date:  26/07/2017
#------------------------------------------------------------------------------
# www.colmeia-do-ze.blogspot.com
#==============================================================================

class Sprite

  attr_accessor   :wave_amp
  attr_accessor   :wave_length
  attr_accessor   :wave_speed
  attr_accessor   :wave_phase
  attr_accessor   :temp_bitmap

  alias wave_effect_ini initialize unless $@
  def initialize(viewport=nil)
    @wave_amp = 0
    @wave_length = 72
    @wave_speed = 720
    @wave_phase = 0.25
    wave_effect_ini(viewport)
    @temp_bitmap = nil
  end

  alias wave_effect_upd update unless $@
  def update
    # the wave effect only works if wave_amp
    # propertie is a number more than zero
    wave_effect if @wave_amp > 0
    wave_effect_upd
  end

  # Return the width of image, because when use
  # obj.bitmap.width the value will be more than
  # the original value(because effect)
  def width
    return (self.bitmap.width - @wave_amp * 2)
  end
 
  def wave_effect
    return if self.bitmap.nil?
    @temp_bitmap = self.bitmap if @temp_bitmap.nil?
    cw = @temp_bitmap.width + (@wave_amp * 2)
    ch = @temp_bitmap.height
    # Follow the VX wave effect, each horizontal line
    # has 8 pixel of height. This device provides less
    # lag in game.
    divisions = @temp_bitmap.height / 8
    divisions += 1 if @temp_bitmap.height % 8 != 0
    self.bitmap = Bitmap.new(cw, ch)
    for i in 0..divisions
      x = @wave_amp * Math.sin(i * 2 * Math::PI / (@wave_length / 8).to_i +
      (@wave_phase * Math::PI) / 180.0)
      src_rect = Rect.new(0, i*8, @temp_bitmap.width, 8)
      dest_rect = Rect.new(@wave_amp + x, i * 8, @temp_bitmap.width, 8)
      self.bitmap.stretch_blt(dest_rect, @temp_bitmap, src_rect)
    end
    # frame rate: VX = 60 | XP = 40
    # wave speed compatibility VX to XP: wave_speed * 60/40
    # then: wave_speed * 1.5
    @wave_phase += @wave_speed * 1.5 / @wave_length
    @wave_phase -= 360 if @wave_phase > 360
    @wave_phase += 360 if @wave_phase < 0
  end
end

for Klass in [Game_Character, Game_Battler, Game_Picture]
  class Klass
    attr_accessor   :wave_amp
    attr_accessor   :wave_length
    attr_accessor   :wave_speed
    alias wave_effect_ini initialize unless $@
    def initialize(*args)
      wave_effect_ini(*args)
      @wave_amp = 0
      @wave_length = 72
      @wave_speed = 720
    end
  end
end

class Spriteset_Map
  alias wave_effect_upd update unless $@
  def update
    wave_effect_upd
    for i in 0...@character_sprites.size
      sprite = @character_sprites[i]
      if i == @character_sprites.size - 1
        sprite.wave_amp     = $game_player.wave_amp
        sprite.wave_length  = $game_player.wave_length
        sprite.wave_speed   = $game_player.wave_speed
      else
        event = $game_map.events[i + 1]
        next if event.nil?
        sprite.wave_amp     = event.wave_amp
        sprite.wave_length  = event.wave_length
        sprite.wave_speed   = event.wave_speed
      end
    end
    for i in 0...@picture_sprites.size
      picture = $game_screen.pictures[i + 1]
      sprite = @picture_sprites[i]
      sprite.wave_amp     = picture.wave_amp
      sprite.wave_length  = picture.wave_length
      sprite.wave_speed   = picture.wave_speed
    end
  end
end

class Spriteset_Battle
  alias wave_effect_upd update unless $@
  def update
    wave_effect_upd
    for i in 0...@enemy_sprites.size
      enemy = $game_troop.enemies.reverse[i]
      next if enemy.nil? or !enemy.exist?
      sprite = @enemy_sprites[i]
      sprite.wave_amp     = enemy.wave_amp
      sprite.wave_length  = enemy.wave_length
      sprite.wave_speed   = enemy.wave_speed
    end
    for i in 0...@actor_sprites.size
      actor = $game_party.actors[i]
      next if actor.nil? or !actor.exist?
      sprite = @actor_sprites[i]
      sprite.wave_amp     = actor.wave_amp
      sprite.wave_length  = actor.wave_length
      sprite.wave_speed   = actor.wave_speed
    end
    for i in 0...@picture_sprites.size
      picture = $game_screen.pictures[i + 51]
      sprite = @picture_sprites[i]
      sprite.wave_amp     = picture.wave_amp
      sprite.wave_length  = picture.wave_length
      sprite.wave_speed   = picture.wave_speed
    end
  end
end

Para usarlo se usa el siguiente esquema:
(sprite).wave_amp = n

Donde n es la amplitud del efecto, normalmente sería 2 para cuando esté activo, pero puedes probar otros valores. Para desactivarlo ponle 0.

También puedes jugar con algunos otros parámetros como wave_length (por defecto 72) o wave_speed (por defecto 720) del mismo modo pero generalmente solo deberás usar wave_amp.

¿Pero qué es el sprite entonces? Pues tal como lo he montado hay varios atajos que puedes usar desde llamar script sin complicaciones:
Personaje
$game_player.wave_amp = n
Evento (en ID pon la ID del evento)
$game_map.events[ID].wave_amp = n
Picture (en ID pon el número de picture, en batalla debes sumarle 50 a ese valor)
$game_screen.pictures[ID].wave_amp = n
Gráfico de actor en batalla (en ID pon la posición del actor en la party, empezando por 0)
$game_party.actors[ID].wave_amp = n
Gráfico de actor en batalla (en ID pon la ID del actor en la base de datos)
$game_actors[ID].wave_amp = n
Gráfico de enemigo en batalla (en ID pon la posición de ese enemigo en la tropa enemiga, empezando por 0)
$game_troop.enemies[ID].wave_amp = n

Eso es todo. Sé que no abarca todas las posibilidades, pero con eso deberías tener suficiente para lo básico.
Según qué aplicaciones del efecto requieren otras ampliaciones del script, por ejemplo si se quisiera aplicar el efecto al matar a un enemigo, o casos concretos de ese tipo.
avatar
Wecoc
Administrador
Administrador



Créditos 9218

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: Efecto ondeante de RPGVX en XP

Mensaje por AlbSchenk el 2017-07-26, 07:55

muchas gracias, funciona perfecto.
avatar
AlbSchenk
Iniciado
Iniciado

0/3

Créditos 342

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: Efecto ondeante de RPGVX en XP

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.