Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] ayuda Sprite_Reflection

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] ayuda Sprite_Reflection

Mensaje por UmbriaChronicles el 2016-01-26, 09:56

Hola a todos,

Tengo este script de Rataime para que los personajes se reflejen en el agua. El reflejo del jugador se inicia con una nota "hero_r", pero no encuentro el comando para desactivarlo... ¿Alguien lo encuentra?

Ahí va el script:
Código:
CATERPILLAR_COMPATIBLE = true

class Game_Party
  attr_reader :characters
end

class Sprite_Reflection < RPG::Sprite

 attr_accessor :character

 def initialize(viewport=nil, character=nil,self_angle = 180)
   super(viewport)
   @character = character
   @self_angle=self_angle
   self.opacity=0
   @reflected=false
   @former=false
   @moving=false
   if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)==7
     @reflected=true
     @former=true
   end
   update
 end

 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)
   if @tile_id == 0
     sx = (@character.pattern) * @cw
     sy = (@character.direction - 2) / 2 * @ch
     if @character.direction== 6
           sy = ( 4- 2) / 2 * @ch
     end
     if @character.direction== 4
           sy = ( 6- 2) / 2 * @ch
    end
    if @character.direction != 4 and @character.direction != 6
          sy = (@character.direction - 2) / 2 * @ch
    end
   end
  
   self.x = @character.screen_x
   self.y = @character.screen_y-5
   @moving=!(@character.real_x%128==0 and @character.real_y%128==0)
   @d=@character.direction
   @rect=[sx, sy, @cw, @ch]
   if !(@moving)
     if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)==7
       @reflected=true
       @former=true
     else
       @reflected=false  
       @former=false
     end
    
   else
       case @d
      
       when 2
       if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+2)==7
         @reflected=true
         if @former==false
           @offset = (@character.screen_y%32)*@ch/32
           @rect=[sx, sy, @cw, @offset]
           self.y=@character.screen_y-5
         end
       else
         @reflected=false  
       end
      
       when 4
       if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)!=7
         @offset = ((@character.screen_x-@cw/2)%32)*@cw/32
         @rect=[sx, sy, @offset, @ch]
         self.x=@character.screen_x
       else
         @reflected=true
         if @former==false
           @offset = ((@character.screen_x-@cw/2)%32)*@cw/32
           @rect=[sx+@offset, sy, @cw-@offset, @ch]
           self.x=@character.screen_x-@offset
         end
       end
      
       when 6
       if $game_map.terrain_tag(@character.real_x/128+1,@character.real_y/128+1)!=7
         @offset = ((@character.screen_x-@cw/2)%32)*@cw/32
         @rect=[sx+@offset, sy, @cw-@offset, @ch]
         self.x=@character.screen_x-@offset
       else
         @reflected=true
         if @former==false
           @offset = ((@character.screen_x-@cw/2)%32)*@cw/32
           @rect=[sx, sy, @offset, @ch]
           self.x=@character.screen_x
         end
       end
      
       when 8
       if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+2)==7
         @reflected=true
         if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)!=7
           @offset = (@character.screen_y%32)*@ch/32
           @rect=[sx, sy, @cw, @offset]
           self.y=@character.screen_y-5
         end
       else
         @reflected=false  
       end
      
       end

   end
   if @reflected
     self.opacity=128
   else
    @rect=[sx, sy, @cw, @ch]
    self.opacity=0
   end
  
   if $game_map.terrain_tag((@character.real_x+64)/128,@character.real_y/128+2)!=7
     if $game_map.terrain_tag((@character.real_x+64)/128,@character.real_y/128+2)!=7
       @rect[1]= @rect[1]+@ch/2
       @rect[3]= @rect[3]/2
       self.y = self.y - @ch/2
     else
       @reflected=false
     end
   end
    
   self.src_rect.set(@rect[0],@rect[1],@rect[2],@rect[3])
  
   @character.is_a?(Game_Player) ? self.z = 9 : self.z = 5
   self.blend_type = @character.blend_type
   self.bush_depth = @character.bush_depth
   if @character.animation_id != 0
     animation = $data_animations[@character.animation_id]
     animation(animation, true)
     @character.animation_id = 0
   end

   self.angle = @self_angle
 end
end

#===================================================
# ▼ CLASS Sprite_Character edit
#===================================================

class Sprite_Character < RPG::Sprite
  alias reflect_initialize initialize
  
  def initialize(viewport, character = nil)
    @character = character
    @reflection = []
    super(viewport)
    if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["r"])
     @reflection.push(Sprite_Reflection.new(viewport,@character))
    end
    if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["hero_r"])
     @reflection.push(Sprite_Reflection.new(viewport,$game_player))
#===================================================
# ● Compatibility with fukuyama's caterpillar script
#===================================================
if CATERPILLAR_COMPATIBLE and $game_party.characters!=nil

  for member in $game_party.characters
    @reflection.push(Sprite_Reflection.new(viewport,member))
  end

end
#===================================================
# ● End of the compatibility
#===================================================
    end
    reflect_initialize(viewport, @character)
  end
  
  alias reflect_update update
  
  def update
   reflect_update
   if @reflection!=nil
     for reflect in @reflection
       reflect.update
     end
   end
  end
  
end

Muchas gracias de antemano! :)
avatar
UmbriaChronicles
Novato
Novato

0/3

Créditos 76

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: [XP] ayuda Sprite_Reflection

Mensaje por Wecoc el 2016-01-26, 11:49

No hay comando para desactivarlo, porque no va por comandos.

Te lo he modificado, ahora debería servirte bien.

Código:
CATERPILLAR_COMPATIBLE = true

class Game_Party
  attr_reader :characters
end

class Sprite_Reflection < RPG::Sprite

  attr_accessor :character

  def initialize(viewport=nil, character=nil,self_angle = 180)
    super(viewport)
    @character = character
    @self_angle = self_angle
    self.opacity = 0
    @reflected = false
    @former = false
    @moving = false
    if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)==7
      @reflected=true
      @former=true
    end
    update
  end

  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)
    if @tile_id == 0
      sx = (@character.pattern) * @cw
      sy = (@character.direction - 2) / 2 * @ch
      if @character.direction == 6
        sy = (4 - 2) / 2 * @ch
      end
      if @character.direction == 4
        sy = (6 - 2) / 2 * @ch
      end
      if @character.direction != 4 and @character.direction != 6
        sy = (@character.direction - 2) / 2 * @ch
      end
    end
    self.x = @character.screen_x
    self.y = @character.screen_y - 5
    case @character.direction
    when 2, 8
      self.mirror = true
    else
      self.mirror = false
    end
    @moving = !(@character.real_x % 128 == 0 and @character.real_y % 128 == 0)
    @d = @character.direction
    @rect = [sx, sy, @cw, @ch]
    if !(@moving)
      if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)==7
        @reflected = true
        @former = true
      else
        @reflected = false 
        @former = false
      end
    else
      case @d
      when 2
        if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+2)==7
          @reflected = true
          if @former == false
            @offset = (@character.screen_y % 32) * @ch / 32
            @rect = [sx, sy, @cw, @offset]
            self.y = @character.screen_y - 5
          end
        else
          @reflected=false 
        end
      when 4
        if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)!=7
          @offset = ((@character.screen_x-@cw/2)%32)*@cw/32
          @rect=[sx, sy, @offset, @ch]
          self.x=@character.screen_x
        else
          @reflected=true
          if @former==false
            @offset = ((@character.screen_x-@cw/2)%32)*@cw/32
            @rect=[sx+@offset, sy, @cw-@offset, @ch]
            self.x=@character.screen_x-@offset
          end
        end
      when 6
        if $game_map.terrain_tag(@character.real_x/128+1,@character.real_y/128+1)!=7
          @offset = ((@character.screen_x-@cw/2)%32)*@cw/32
          @rect=[sx+@offset, sy, @cw-@offset, @ch]
          self.x=@character.screen_x-@offset
        else
          @reflected=true
          if @former==false
            @offset = ((@character.screen_x-@cw/2)%32)*@cw/32
            @rect=[sx, sy, @offset, @ch]
            self.x=@character.screen_x
          end
        end
      when 8
        if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+2)==7
          @reflected=true
          if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)!=7
            @offset = (@character.screen_y%32)*@ch/32
            @rect=[sx, sy, @cw, @offset]
            self.y=@character.screen_y-5
          end
        else
          @reflected=false 
        end
      end
    end
    if @reflected
      self.opacity=128
    else
      @rect=[sx, sy, @cw, @ch]
      self.opacity=0
    end
    if $game_map.terrain_tag((@character.real_x+64)/128,@character.real_y/128+2)!=7
      if $game_map.terrain_tag((@character.real_x+64)/128,@character.real_y/128+2)!=7
        @rect[1]= @rect[1]+@ch/2
        @rect[3]= @rect[3]/2
        self.y = self.y - @ch/2
      else
        @reflected=false
      end
    end
    self.src_rect.set(@rect[0],@rect[1],@rect[2],@rect[3])
    @character.is_a?(Game_Player) ? self.z = 9 : self.z = 5
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    if @character.animation_id != 0
      animation = $data_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
    self.angle = @self_angle
  end
end

class Game_Character
  attr_accessor :reflection
  alias ref_ini initialize unless $@
  def initialize
    ref_ini
    reflection = false
  end
end

#===================================================
# ▼ CLASS Sprite_Character edit
#===================================================

class Sprite_Character < RPG::Sprite
 
  alias reflect_initialize initialize unless $@
  def initialize(viewport, character = nil)
    @character = character
    @reflection = false
    @reflection_sprite = nil
    super(viewport)
    if (character.is_a?(Game_Event) and character.list != nil and
      character.list[0].code == 108 and character.list[0].parameters == ["r"])
      @character.reflection = true
    end
    if (character.is_a?(Game_Event) and character.list != nil and
      character.list[0].code == 108 and character.list[0].parameters == ["hero_r"])
      $game_player.reflection = true
      if CATERPILLAR_COMPATIBLE and $game_party.characters != nil
        for member in $game_party.characters
          member.reflection = true
        end
      end
    end
    reflect_initialize(viewport, @character)
  end

  alias reflect_update update unless $@
  def update
    reflect_update
    if @reflection != @character.reflection
      @reflection = @character.reflection
      if @reflection == true
        @reflection_sprite = Sprite_Reflection.new(@viewport, @character)
      else
        if @reflection_sprite != nil
          @reflection_sprite.dispose
          @reflection_sprite = nil
        end
      end
    end
    if @reflection_sprite != nil
      @reflection_sprite.update
    end
  end
end

Cuando en un evento pones en Notas hero_r, no hace falta activar ese evento, directamente el script lee eso al cargar el evento del mapa. Lo que he hecho es añadir un método para activarlo y desactivarlo manualmente. El método original debería seguir funcionando bien.

Para usarlo usa en un Llamar Script:
$game_player.reflection = true
$game_player.reflection = false
: true

Además de con $game_player puedes hacer lo mismo con cualquier evento:
$game_map.events[ID].reflection = true
$game_map.events[ID].reflection = false : true

Spoiler:
Ese : true del final es por un bug conocido del RPG maker en los Llamar script, si usas el bugfix no tienes por qué añadirlo después del false.

No sé si usas el Fukuyama's Caterpillar Script, si es así el método manual para los actores que siguen al héroe sería con $game_party.characters[ID] aunque no lo he probado.


Última edición por Wecoc el 2016-01-26, 12:30, editado 1 vez
avatar
Wecoc
Administrador
Administrador



Créditos 12208

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] ayuda Sprite_Reflection

Mensaje por UmbriaChronicles el 2016-01-26, 12:27

Hola Wecoc :) Gracias por la modificación, pero me da un error:

'Reflection effect' 190 NoMethodError
Undefined method 'push' for false:FalseClass
avatar
UmbriaChronicles
Novato
Novato

0/3

Créditos 76

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: [XP] ayuda Sprite_Reflection

Mensaje por Wecoc el 2016-01-26, 12:30

Perdón, me dejé una línea. Vuelve a probarlo, debería ir todo bien.
avatar
Wecoc
Administrador
Administrador



Créditos 12208

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] ayuda Sprite_Reflection

Mensaje por UmbriaChronicles el 2016-01-26, 13:21

@Wecoc escribió:Perdón, me dejé una línea. Vuelve a probarlo, debería ir todo bien.

Como siempre eres de gran ayuda! Muchas gracias!
avatar
UmbriaChronicles
Novato
Novato

0/3

Créditos 76

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: [XP] ayuda Sprite_Reflection

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.