Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

[VX] TDS Sprite Reflect

TDS Sprite Reflect

Introduction
Found it here and I want to share with you all that all.

Features
Reflects the characters sprite on the water.

Screenshots
http://img216.imageshack.us/img216/5311 ... kilqc2.png[/img]

Demo
http://www.mediafire.com/?50usgzg232k

Script
Fixed and shortened the code, please update script on demo with this one


Code:
Code:
#==============================================================================
# ** TDS Sprite Reflect
# Version: 1.8
#------------------------------------------------------------------------------
# This script makes specially desigated areas reflect the character sprite and
# events.
#==============================================================================
# Instructions:
#
# Create areas using the area creator of the map editor and call them "Reflect".
#
# For events you can use these two commands in part of their name.
#
# Reflect 
# 
# Any event with "Reflect" as part of it's name will have the reflect effect on
# the special areas of the map.
#
#
# /OFFSET[#]
#
#  [#] = Numerical value of the offset.
#
#  Example:
#   /OFFSET[10]
#
# Offset changes the Y offset of the sprite in the water.(How far is the 
# Reflection from the characters original standing point)
#
#
# $game_player.reflect_offset = # 
#
#  # = Value of the character offset.
#
# Just the same as the event offset except this one handles the characters 
# offset reflection.
#==============================================================================


  #--------------------------------------------------------------------------
  # * Constants for activating the wave effect on the water
  #--------------------------------------------------------------------------
  WATER_WAVE_EFFECT = true

  
#==============================================================================
# ** Sprite_Character
#------------------------------------------------------------------------------
#  This sprite is used to display characters. It observes a instance of the
# Game_Character class and automatically changes sprite conditions.
#==============================================================================

class Sprite_Reflect < Sprite_Base
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :character
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     viewport  : viewport
  #     character : character (Game_Character)
  #     offset    : offset value from the characters starting point.
  #--------------------------------------------------------------------------
  def initialize(viewport = nil, character = nil, offset = nil)
    super(viewport)
    self.visible = false
    @character = character
    @player_offset = $game_player.reflect_offset    
    @offset = (@character.is_a?(Game_Player) ? @player_offset : offset) 
    sprite_setup    
    update
  end
  #--------------------------------------------------------------------------
  # * Sprite Setup
  #--------------------------------------------------------------------------
  def sprite_setup
    self.bitmap = Cache.character(@character.character_name)            
     self.angle = 180 
     self.mirror = true    
     self.opacity = 120       
     sign = @character.character_name[/^[\!\$]./]
      if sign != nil and sign.include?('$')
       @cw = bitmap.width / 3
       @ch = bitmap.height / 4
      else
       @cw = bitmap.width / 12
       @ch = bitmap.height / 8
     end              
  end
  
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super    
     index = @character.character_index
     pattern = @character.pattern < 3 ? @character.pattern : 1
     sx = (index % 4 * 3 + pattern) * @cw
     sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch            
     self.src_rect.set(sx, sy, @cw, @ch)     
     
     if @character.is_a?(Game_Player)
        self.ox = @cw / 2       
        self.oy = 8 + @ch + $game_player.reflect_offset        
      else       
        self.ox = @cw / 2               
        self.oy = 8 + @ch + @offset
     end

     self.x = @character.screen_x
     self.y = @character.screen_y
     self.z = @character.screen_z

    if WATER_WAVE_EFFECT == true    
      self.wave_amp = 1
      self.wave_length = 1
      self.wave_speed = 3
    end      
  end
end


#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
#  This class brings together map screen sprites, tilemaps, etc. It's used
# within the Scene_Map class.
#==============================================================================

class Spriteset_Map
  #--------------------------------------------------------------------------
  # * Create Character Sprite
  #   Note: Removed alias because it causes a transfer error.
  #--------------------------------------------------------------------------
  def create_characters
    @character_sprites = []
    @event_reflection_sprite = []
    @reflecting_events = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
    end
    for vehicle in $game_map.vehicles
      sprite = Sprite_Character.new(@viewport1, vehicle)
      @character_sprites.push(sprite)
    end
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
    for i in $game_map.events.keys.sort    
     @event_name_offset = $game_map.events[i].name    
     @event_name_offset[ /\/OFFSET\[(.*?)\]/ ]
     sprite = Sprite_Reflect.new(@viewport1, $game_map.events[i], $1 != nil ? $1.to_i : 0)      
    if $game_map.events[i].name.include?("Reflect")   
      @event_reflection_sprite.push(sprite)      
      @reflecting_events.push($game_map.events[i])
      end
    end
    @reflection_sprite = Sprite_Reflect.new(@viewport1, $game_player, 0)            
  end
  
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  alias tds_sprite_reflection_update update  
  def update
    tds_sprite_reflection_update    
    if $game_player.current_area_name == "Reflect"
     if $game_player.moving? == false
       @reflection_sprite.visible = true         
     end
    else         
     @reflection_sprite.visible = false                 
    end
    
    for i in 0...@reflecting_events.size
     if @reflecting_events[i].current_area_name == "Reflect"
      if @reflecting_events[i].moving? == false
         @event_reflection_sprite[i].visible = true         
       end
     else
       @event_reflection_sprite[i].visible = false       
     end     
    end
  
    if @reflection_sprite.visible == true          
      @reflection_sprite.update
    end
    
    for i in 0...@event_reflection_sprite.size
      if @event_reflection_sprite[i].visible == true
        @event_reflection_sprite[i].update           
      end
    end
  end    
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    dispose_tilemap
    dispose_parallax
    dispose_characters
    dispose_shadow
    dispose_weather
    dispose_pictures
    dispose_timer
    dispose_viewports
    
    for i in 0...@reflecting_events.size
      @event_reflection_sprite[i].dispose
    end
    
    @reflection_sprite.dispose
  end  
end



#==============================================================================
# ** Game_Character
#------------------------------------------------------------------------------
#  This class deals with characters. It's used as a superclass of the
# Game_Player and Game_Event classes.
#==============================================================================

class Game_Character

  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor   :reflect_offset              # Character Reflection Offset  
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  alias tds_sprite_reflection_initialize initialize
  def initialize
    tds_sprite_reflection_initialize    
    @reflect_offset = 0
  end
  
  #--------------------------------------------------------------------------
  # * Determine if in Area
  #     area : Area data (RPG::Area)
  #--------------------------------------------------------------------------
  def in_area?(area)
    return false if area == nil
    return false if $game_map.map_id != area.map_id
    return false if @x < area.rect.x
    return false if @y < area.rect.y
    return false if @x >= area.rect.x + area.rect.width
    return false if @y >= area.rect.y + area.rect.height
    return true
  end  
  #--------------------------------------------------------------------------
  # * Current Area Name
  #--------------------------------------------------------------------------
  def current_area_name
    # Checks the areas in the maps
    for area in $data_areas.values
      # If the character is currently on an area
      if in_area?(area) == true
        # Give the value of the name of the area to the return variable
        return_area_name = area.name
        # Break loop
        break
      end    
    end    
    return return_area_name
  end
end

#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  This class deals with events. It handles functions including event page 
# switching via condition determinants, and running parallel process events.
# It's used within the Game_Map class.
#==============================================================================

class Game_Event < Game_Character 
  
  #--------------------------------------------------------------------------
  # * Return Even Name
  #--------------------------------------------------------------------------
  def name
    return @event.name
  end
end


Instructions
Create "Areas" on the maps where the player walks and it will reflect below him, and remember to call those areas Reflect so that other normal monster areas wont reflect.

All characters must have Reflect as part of it's name in order to reflect.

Another small add on is the "/OFFSET

    * " that I added into event names.


Using "/OFFSET

    * " will change how far is the reflection is displayed from it's original starting point.


Example: NPC Name Reflect /OFFSET[15]
That will display the NPCs reflection 15 pixels below it.

Using this "$game_player.reflect_offset = #" you will be able to change the mains characters offset.

Example:
Using a call script you will be able to change the value of this variable.

$game_player.reflect_offset = 15

That will display the characters reflection 15 pixels below the original standing point.

If you wish to use the small wave effect on the water simple go this line on the script.

Code:
WATER_WAVE_EFFECT

And switch it's value to true or false

Example:

Code:
WATER_WAVE_EFFECT = true

Compatibility
None that I know of.

Credits and Thanks
Well pretty much him TDS
 
Very neat script.
The offset idea was a very good one.  Something that might be useful is the ability to also define offsets in the area name?

I like it how it is though.  Nice.
 
Nice script. But it don't work with 1 character charset(the ones you need to put $ in the name).


And Maus... it's a rpg maker VX script... not XP lol
 

Maus

Member

Can be a chair: I AM using RPG Maker VX. I am using the retooled XP spriteset, so please keep your laughter to yourself.

Can be a chair":29uzfrpg said:
Nice script. But it don't work with 1 character charset(the ones you need to put $ in the name).


And Maus... it's a rpg maker VX script... not XP lol
 
Maus":2hnoz97e said:
I found this bug where these strange ghost images are left in an area where the script is activated. Any idea what could be causing this bug? They go away after you access the menu.
I would guess that it has something to do with the abnormal size of your sprites.  Test with a normal vx charset and see if you have the same problem.  If we discover that the size of the character is the problem, it should help the author fix the problem.  lordsith didn't make this script, so you should go to the link he provided for support.

Can be a chair":2hnoz97e said:
Nice script. But it don't work with 1 character charset(the ones you need to put $ in the name).
Not sure... I didn't have this problem.

[edit later in the day]
There is a new version of this script available now with numerous bugfixes. The original creator's thread can be found here.

Hopefully, as soon as lordsith has some time, he can update his post with the new version.
 
Its actually caused by character sizes taller than 32 pixels, it also causes a bug when warping to another map, it makes a copy of all events in the screen including character, is there a way to fix it? there will be more character sets for vx taller than 32 pixels, so this is big bug :)
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top