Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #==============================================================================
- # XP Wave Effect
- #------------------------------------------------------------------------------
- # by: zecomeia
- # date: 01/03/2010
- # for: RGSS
- # version: 1.0
- # www.colmeia-do-ze.blogspot.com
- #------------------------------------------------------------------------------
- #
- # * Edited by LiTTleDRAgo
- #
- # Reproduction of the VX's wave effect
- # (see the help file of the RPGMaker VX in the RGSS manual reference topic)
- #
- # How to use
- #
- # @sprite = Sprite.new
- # @sprite.bitmap = Bitmap.new(640,480)
- # type = :horizontal # *
- # @sprite.make_wave(type)
- # @sprite.update until Input.trigger?(Input::C) # **
- # @sprite.kill_wave
- # @sprite.dispose
- #
- # Note : * type is :horizontal or :vertical (can be left out)
- # ** @sprite.update must be called in in order to execute the effect
- #
- # Script call =
- # $scene.spriteset.fog.make_wave(type) # *
- # $scene.spriteset.fog.kill_wave
- # $scene.spriteset.panorama.make_wave # *
- # $scene.spriteset.panorama.kill_wave
- #
- # Note : * type is :horizontal or :vertical (can be left out)
- #
- #==============================================================================
- #==============================================================================
- # ** Wave_Effect_XP
- #------------------------------------------------------------------------------
- # This module contains methods needed to create wave_sprites
- #==============================================================================
- module Wave_Effect_XP
- #--------------------------------------------------------------------------
- # * Public Instance Variable
- #--------------------------------------------------------------------------
- attr_accessor :wave
- attr_accessor :wave_amp
- attr_accessor :wave_length
- attr_accessor :wave_speed
- attr_accessor :wave_phase
- attr_accessor :wave_bitmap
- #--------------------------------------------------------------------------
- # * Create Wave Effect
- #--------------------------------------------------------------------------
- def make_wave(type = :horizontal)
- @wave = type
- @wave_amp = 8
- @wave_length = 64
- @wave_speed = 720
- @wave_phase = 0.25
- clear_wave_bitmap
- end
- #--------------------------------------------------------------------------
- # * Kill Wave Effect
- #--------------------------------------------------------------------------
- def kill_wave
- @wave = false
- @wave_amp = 0
- clear_wave_bitmap
- end
- #--------------------------------------------------------------------------
- # * Clear Wave Bitmap
- #--------------------------------------------------------------------------
- def clear_wave_bitmap
- @wave_bitmap.nil? || @wave_bitmap.disposed? || @wave_bitmap.dispose
- @wave_bitmap = nil
- end
- #--------------------------------------------------------------------------
- # * Wave?
- #--------------------------------------------------------------------------
- def wave?
- (@wave_amp ||= 0).is_a?(Numeric) && @wave_amp > 0
- end
- #--------------------------------------------------------------------------
- # * Wave Effect
- #--------------------------------------------------------------------------
- def update_wave
- return unless (bitmap && bitmap.disposed? == false && wave?)
- return unless (@wave_length ||= 64 ).is_a?(Numeric)
- return unless (@wave_speed ||= 720 ).is_a?(Numeric)
- return unless (@wave_phase ||= 0.25).is_a?(Numeric)
- @wave_bitmap ||= bitmap.clone
- # Follow the VX wave effect, each horizontal line has 8 pixel of height.
- # This device provides less lag in game.
- if @wave == :vertical
- l = (@wave_length / 8.0).round * 2
- divisions = @wave_bitmap.width / l
- divisions += 1 if @wave_bitmap.width % l != 0
- else
- l = (@wave_length / 8.0).round
- divisions = @wave_bitmap.height / l
- divisions += 1 if @wave_bitmap.height % l != 0
- end
- bitmap.clear
- divisions.floor.times do |i|
- x = (@wave_amp * Math.sin(i*2*Math::PI/l + (@wave_phase*Math::PI)/180))
- if @wave == :vertical
- src_rect = Rect.new(i*l,0,l,@wave_bitmap.height)
- dest_rect = Rect.new(i*l,@wave_amp+x,l,@wave_bitmap.height)
- adt_src = Rect.new(i*l,src_rect.height-(@wave_amp+x),l,@wave_amp+x)
- adt_dest = Rect.new(i*l,0,l,adt_src.height)
- else
- src_rect = Rect.new(0,i*l,@wave_bitmap.width,l)
- dest_rect = Rect.new(@wave_amp+x,i*l,@wave_bitmap.width,l)
- adt_src = Rect.new(src_rect.width-(@wave_amp+x),i*l,@wave_amp+x,l)
- adt_dest = Rect.new(0,i*l,adt_src.width, l)
- end
- bitmap.stretch_blt(dest_rect, @wave_bitmap, src_rect)
- bitmap.stretch_blt(adt_dest, @wave_bitmap, adt_src )
- end
- # frame rate: VX = 60 | XP = 40
- # wave speed compatibility VX to XP: wave_speed * 60/40
- phase = @wave_speed * (60.0 / Graphics.frame_rate) / @wave_length
- @wave_phase += phase
- @wave_phase -= 360 if @wave_phase > 360
- @wave_phase += 360 if @wave_phase < 0
- end
- end
- #==============================================================================
- # ** Sprite
- #------------------------------------------------------------------------------
- # This sprite is used to display bitmap in game.
- #==============================================================================
- class Sprite
- #--------------------------------------------------------------------------
- # * Include Wave_Effect_XP method
- #--------------------------------------------------------------------------
- method_defined?(:update_wave) || (include Wave_Effect_XP)
- #--------------------------------------------------------------------------
- # * Alias Listing
- #--------------------------------------------------------------------------
- unless method_defined?(:wave_effect_update)
- alias_method :wave_effect_update, :update
- alias_method :bitmap_change, :bitmap=
- end
- #--------------------------------------------------------------------------
- # * Bitmap
- #--------------------------------------------------------------------------
- def bitmap=(*args)
- bitmap_change(*args)
- clear_wave_bitmap
- end
- #--------------------------------------------------------------------------
- # * Frame Update
- #--------------------------------------------------------------------------
- def update(*args)
- wave_effect_update(*args) # Call Original or Other Aliases
- wave? && update_wave # If Sprite has a Wave
- end
- end
- #==============================================================================
- # ** Plane
- #------------------------------------------------------------------------------
- # Plane is used to display the looping image. The image will looping
- # both horizontally and vertically.
- #==============================================================================
- class Plane
- #--------------------------------------------------------------------------
- # * Include Wave_Effect_XP method
- #--------------------------------------------------------------------------
- method_defined?(:update_wave) || (include Wave_Effect_XP)
- #--------------------------------------------------------------------------
- # * Alias Listing
- #--------------------------------------------------------------------------
- method_defined?(:bitmap_change) || alias_method(:bitmap_change, :bitmap=)
- #--------------------------------------------------------------------------
- # * Bitmap
- #--------------------------------------------------------------------------
- def bitmap=(*args)
- bitmap_change(*args)
- clear_wave_bitmap
- end
- end
- #==============================================================================
- # ** Scene_Map
- #------------------------------------------------------------------------------
- # This class performs map screen processing.
- #==============================================================================
- Scene_Map.send(:attr_reader, :spriteset)
- #==============================================================================
- # ** Spriteset_Map
- #------------------------------------------------------------------------------
- # This class brings together map screen sprites, tilemaps, etc.
- # It's used within the Scene_Map class.
- #==============================================================================
- class Spriteset_Map
- #--------------------------------------------------------------------------
- # * Public Instance Variable
- #--------------------------------------------------------------------------
- method_defined?(:fog) || (attr_reader :fog)
- method_defined?(:panorama) || (attr_reader :panorama)
- #--------------------------------------------------------------------------
- # * Alias Listing
- #--------------------------------------------------------------------------
- unless method_defined?(:wave_effect_update)
- alias_method :wave_effect_update, :update
- end
- #--------------------------------------------------------------------------
- # * Frame Update
- #--------------------------------------------------------------------------
- def update(*args)
- # Call Original or Other Aliases
- wave_effect_update(*args)
- # If Panorama Plane has a Wave
- @panorama.wave? && @panorama.update_wave if @panorama.respond_to?(:wave?)
- # If Fog Plane has a Wave
- @fog.wave? && @fog.update_wave if @fog.respond_to?(:wave?)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement