Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

Sprite_Reflection versión de Wecoc

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP Sprite_Reflection versión de Wecoc

Mensaje por Wecoc el 2012-07-05, 18:23

Ésta es una idea tonta, cazurra, y un poco idiota que tuve a partir de una de las locuras de Orochii, pero no funciona igual que la suya porque me dió pereza hacerlo de esa manera D: xDD
De hecho la mía es muy sencilla: Es un script de reflejo totalmente normal solo que funciona siempre, y a una z inferior a 0. Así, si quieres que se refleje algo, solo tienes que usar transparencias de mapa y un panorama a juego.

Código:
#==============================================================================
# ** [XP] Sprite_Reflection v1.2
#------------------------------------------------------------------------------
# Autor: Wecoc (no requiere créditos)
# Adaptado del Sprite_Reflection de JmsPlDnl y Rataime.
#==============================================================================

#==============================================================================
# ** Sprite_Reflection
#==============================================================================

class Sprite_Reflection < RPG::Sprite
  #--------------------------------------------------------------------------
  attr_accessor :character
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize(viewport=nil, character=nil)
    super(viewport)
    @character = character
    update
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    super
    if @tile_id != @character.tile_id or
      @character_name != @character.character_name or
      @character_hue != @character.character_hue
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_hue = @character.character_hue
      if @tile_id >= 384
        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
          @tile_id, @character.character_hue)
        self.src_rect.set(0, 0, 32, 32)
        self.ox = 16
        self.oy = 32
      else
        self.bitmap = RPG::Cache.character(@character.character_name,
          @character.character_hue)
        @cw = bitmap.width / 4
        @ch = bitmap.height / 4
        self.ox = @cw / 2
        self.oy = @ch
      end
    end
    self.visible = (not @character.transparent && @character.reflection)
    self.mirror = true
    self.angle = 180
    if @tile_id == 0
      sx = @character.pattern * @cw
      sy = (@character.direction - 2) / 2 * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
    end
    self.x = @character.screen_x - 1
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch) - 999
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
  end
end

#==============================================================================
# ** Game_Character
#==============================================================================

class Game_Character
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  attr_accessor :reflection
  alias reflect_ini initialize unless $@
  def initialize
    reflect_ini
    @reflection = true
  end
end

#==============================================================================
# ** Spriteset_Map
#==============================================================================

class Spriteset_Map
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  alias reflect_ini initialize unless $@
  def initialize
    @reflection_sprites = []
    reflect_ini
    for i in 0...@character_sprites.size
      s = @character_sprites[i]
      sprite = Sprite_Reflection.new(@viewport1, s.character)
      @reflection_sprites.push(sprite)
    end
    update
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  alias reflect_dis dispose unless $@
  def dispose
    reflect_dis
    for sprite in @reflection_sprites
      sprite.dispose
    end
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  alias reflect_upd update unless $@
  def update
    reflect_upd
    for sprite in @reflection_sprites
      sprite.update
    end
  end
end

No sé si alguien le sabrá encontrar alguna utilidad práctica xD


Última edición por Wecoc el 2018-01-23, 16:59, editado 1 vez
avatar
Wecoc
Administrador
Administrador



Créditos 12310

Gracias : 654

Volver arriba Ir abajo

RPG Maker XP Re: Sprite_Reflection versión de Wecoc

Mensaje por orochii el 2012-07-05, 18:51

De hecho es una buena idea. Es más o menos como funciona creo el reflejo en los juegos de Pokémon (los reflejos en el agua). Se podría aplicar un detector de terrenos, y que se dibujase respecto a eso (si el terreno contiguo o en el que se está parado es X, se dibuja el reflejo). Eso también daría para hacer otros tipos de reflejos, como en espejos. La diferencia sería las transparencias, el color, y un ligero efecto de movimiento para el agua xP.

EN FIN, bonito script xD,
Orochii Zouveleki
avatar
orochii
Reportero

0/3

Créditos 7810

Gracias : 470

Volver arriba Ir abajo

RPG Maker XP Re: Sprite_Reflection versión de Wecoc

Mensaje por Wecoc el 2012-07-08, 08:33

No, el de Pokémon funciona como los demás que he visto; el reflejo ocupa todo el tile, no solo la parte de agua donde nos interesa el reflejo realmente. O eso creo vaya xDDD Y lo del terreno es un poco lo que quise evitar xD, por eso digo que funciona siempre: No depende de terrenos ni de nada.

He hecho una pequeña demo para que se vea mejor: Link
avatar
Wecoc
Administrador
Administrador



Créditos 12310

Gracias : 654

Volver arriba Ir abajo

RPG Maker XP Re: Sprite_Reflection versión de Wecoc

Mensaje por orochii el 2012-07-08, 18:46

Ah no no Wecoc, no me refería al del Pokémon Essentials. El del Pokémon Essentials si sé que trabaja así como dices, porque se nota a leguas que el reflejo se sale de la "zona de reflejo", y que aparece y desaparece "abruptamente".

Me refiero al de Pokémon Sapphire por ejemplo. Como el GameBoy Advance (y también sus predecesores) funcionan por layers (digámosles viewports xD?), el reflejo del personaje se dibuja en un layer distinto, debajo del normal (y luego usa las transparencias y eso. Y si no es así, entonces lo que hace es dibujar el reflejo y luego tirarle encima el mapa con transparencias en el mismo layer.

O algo así xD,
Orochii Zouveleki
avatar
orochii
Reportero

0/3

Créditos 7810

Gracias : 470

Volver arriba Ir abajo

RPG Maker XP Re: Sprite_Reflection versión de Wecoc

Mensaje por Wecoc el 2018-01-23, 17:06

Update: Nueva versión 1.2 ya disponible en el post principal (Atención: la demo no ha sido actualizada)

- Arreglados algunos problemas de performance del script
- Añadida opción de quitar el modo reflejo de cada chara individualmente
- Arreglado bug de Z entre varios sprites de reflejo
- Más fácilmente costumizable en caso que queráis algún caso especial de reflejos

Para definir si un sprite tiene o no reflejo se hace partiendo de su character:
$game_player.reflection = true / false
$game_map.events[ID].reflection = true / false


Recordad que al igualar algo a false en la ventana de Llamar Script se cuelga el maker si no ponéis detrás ; true

La idea del script es que se muestran los sprites debajo de la capa de tilemap, así que para que un reflejo se muestre donde sea solo hay que hacer el tile y/o autotile translúcido. En algunos casos interesaría que aún debajo se volviera a mostrar una versión no translúcida del tile pero eso ya requeriría una reescritura de Tilemap.

El script en sí es muy simple, más que antes incluso, así que podréis modificarlo sin demasiada dificultad en caso de querer modificar opacidad de reflejo o esas cosas. Al ser tan viejo tenía algunos bugs tontos, pero ya han sido revisados.
avatar
Wecoc
Administrador
Administrador



Créditos 12310

Gracias : 654

Volver arriba Ir abajo

RPG Maker XP Re: Sprite_Reflection versión de Wecoc

Mensaje por Wecoc el 2018-02-21, 17:04

Hoy os paso un script que es una interacción entre el Sprite_Reflection de este topic y el Wave Effect para que podáis aplicar efectos ondeantes a los sprites de reflejo.

El efecto de onda de ese script es horizontal, aunque puede llegar a editarse para que sea un efecto distinto.

Debéis poner este nuevo script debajo de los otros dos.
Al principio del script veréis 3 globales que corresponden a la configuración por defecto de los sprites de reflejo, por ejemplo si a DEFAULT_WAVE_AMP le ponéis 0, por defecto no ondulará.

Código:
#==============================================================================
# ** [XP] Wave Effect - Sprite_Reflection
#------------------------------------------------------------------------------
# Este script utiliza el Wave Effect, edit de Wecoc:
#   http://www.mundo-maker.com/t14166-efecto-ondeante-de-rpgvx-en-xp#104863
# Este script utiliza el Sprite_Reflection v1.2 o superior:
#   http://www.mundo-maker.com/t6474-sprite_reflection-version-de-wecoc
#------------------------------------------------------------------------------
# Lo que hace es aplicar un efecto ondeante a los sprites de reflejo.
# Autor: Wecoc (créditos opcionales)
#==============================================================================

class Sprite_Reflection
  #----------------------------------------------------------------------------
  DEFAULT_WAVE_AMP = 2
  DEFAULT_WAVE_LENGTH = 128
  DEFAULT_WAVE_SPEED = 720
  #----------------------------------------------------------------------------
  alias wave_addon_ini initialize unless $@
  def initialize(*args)
    wave_addon_ini(*args)
    @wave_amp = DEFAULT_WAVE_AMP
    @wave_length = DEFAULT_WAVE_LENGTH
    @wave_speed = DEFAULT_WAVE_SPEED
  end
end

class Sprite
  def remove_wave
    @wave_amp = 0
    self.bitmap = @temp_bitmap.clone
  end
end

class Interpreter
  def reflection_sprite(event_id)
    spriteset = $scene.instance_eval("@spriteset") rescue nil
    return if spriteset.nil?
    sprites = spriteset.instance_eval("@reflection_sprites")
    case event_id
    when -1 # Player
      sprite = sprites.select do |sprite|
        sprite.character == $game_player
      end[0]
    when 0 # Current Character
      sprite = sprites.select do |sprite|
        sprite.character == $game_map.events[@event_id]
      end[0]
    else # Character ID
      sprite = sprites.select do |sprite|
        sprite.character == $game_map.events[event_id]
      end[0]
    end
    return sprite
  end
end

- ¿Cómo cambio las propiedades de un determinado sprite de reflejo?

Usad en una llamada de script lo siguiente para obtener el reflejo de un determinado evento
reflection_sprite(EVENT_ID)
Cambiad EVENT_ID por la ID del evento. Si ponéis 0 será el evento que ha efectuado la llamada, y si ponéis -1 será el gráfico del personaje.

Luego a ese sprite podéis modificarle los parámetros tal como dicta el script de Wave Effect:
[line]reflection_sprite(-1).wave_amp = 4[/line]

Además si se quiere parar el efecto, si solo le pones wave_amp = 0 quedará parado pero con las "ondas" aún visibles, para que quede totalmente plano usad:
[line]reflection_sprite(-1).remove_wave[/line]

Eso es todo.
avatar
Wecoc
Administrador
Administrador



Créditos 12310

Gracias : 654

Volver arriba Ir abajo

RPG Maker XP Re: Sprite_Reflection versión de Wecoc

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.