Advertisement
LiTTleDRAgo

[RGSS] Zecomeia's XP Wave Effect (edited)

Oct 11th, 2013
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 9.47 KB | None | 0 0
  1. #==============================================================================
  2. # XP Wave Effect
  3. #------------------------------------------------------------------------------
  4. # by:      zecomeia
  5. # date:    01/03/2010
  6. # for:     RGSS
  7. # version: 1.0
  8. # www.colmeia-do-ze.blogspot.com
  9. #------------------------------------------------------------------------------
  10. #
  11. # * Edited by LiTTleDRAgo
  12. #
  13. # Reproduction of the VX's wave effect
  14. # (see the help file of the RPGMaker VX in the RGSS manual reference topic)
  15. #
  16. # How to use
  17. #
  18. #   @sprite = Sprite.new
  19. #   @sprite.bitmap = Bitmap.new(640,480)
  20. #   type = :horizontal                            # *
  21. #   @sprite.make_wave(type)
  22. #   @sprite.update until Input.trigger?(Input::C) # **
  23. #   @sprite.kill_wave
  24. #   @sprite.dispose
  25. #
  26. # Note : * type is :horizontal or :vertical (can be left out)
  27. #        ** @sprite.update must be called in in order to execute the effect
  28. #
  29. # Script call =
  30. #   $scene.spriteset.fog.make_wave(type)    # *
  31. #   $scene.spriteset.fog.kill_wave
  32. #   $scene.spriteset.panorama.make_wave     # *
  33. #   $scene.spriteset.panorama.kill_wave
  34. #
  35. # Note : * type is :horizontal or :vertical (can be left out)
  36. #
  37. #==============================================================================
  38.  
  39. #==============================================================================
  40. # ** Wave_Effect_XP
  41. #------------------------------------------------------------------------------
  42. #  This module contains methods needed to create wave_sprites
  43. #==============================================================================
  44. module Wave_Effect_XP
  45.   #--------------------------------------------------------------------------
  46.   # * Public Instance Variable
  47.   #--------------------------------------------------------------------------
  48.   attr_accessor :wave
  49.   attr_accessor :wave_amp
  50.   attr_accessor :wave_length
  51.   attr_accessor :wave_speed
  52.   attr_accessor :wave_phase
  53.   attr_accessor :wave_bitmap  
  54.   #--------------------------------------------------------------------------
  55.   # * Create Wave Effect
  56.   #--------------------------------------------------------------------------
  57.   def make_wave(type = :horizontal)
  58.     @wave        = type
  59.     @wave_amp    = 8
  60.     @wave_length = 64
  61.     @wave_speed  = 720
  62.     @wave_phase  = 0.25
  63.     clear_wave_bitmap
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # * Kill Wave Effect
  67.   #--------------------------------------------------------------------------
  68.   def kill_wave
  69.     @wave     = false
  70.     @wave_amp = 0
  71.     clear_wave_bitmap
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # * Clear Wave Bitmap
  75.   #--------------------------------------------------------------------------
  76.   def clear_wave_bitmap
  77.     @wave_bitmap.nil? || @wave_bitmap.disposed? || @wave_bitmap.dispose
  78.     @wave_bitmap = nil    
  79.   end
  80.   #--------------------------------------------------------------------------
  81.   # * Wave?
  82.   #--------------------------------------------------------------------------
  83.   def wave?
  84.     (@wave_amp ||= 0).is_a?(Numeric) && @wave_amp > 0  
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # * Wave Effect
  88.   #--------------------------------------------------------------------------
  89.   def update_wave
  90.     return unless (bitmap && bitmap.disposed? == false && wave?)
  91.     return unless (@wave_length ||= 64  ).is_a?(Numeric)
  92.     return unless (@wave_speed  ||= 720 ).is_a?(Numeric)
  93.     return unless (@wave_phase  ||= 0.25).is_a?(Numeric)
  94.     @wave_bitmap ||= bitmap.clone
  95.     # Follow the VX wave effect, each horizontal line has 8 pixel of height.
  96.     # This device provides less lag in game.
  97.     if @wave == :vertical
  98.       l = (@wave_length / 8.0).round * 2
  99.       divisions = @wave_bitmap.width / l
  100.       divisions += 1 if @wave_bitmap.width % l != 0
  101.     else
  102.       l = (@wave_length / 8.0).round
  103.       divisions = @wave_bitmap.height / l
  104.       divisions += 1 if @wave_bitmap.height % l != 0
  105.     end
  106.     bitmap.clear
  107.     divisions.floor.times do |i|
  108.       x = (@wave_amp * Math.sin(i*2*Math::PI/l + (@wave_phase*Math::PI)/180))
  109.       if @wave == :vertical
  110.         src_rect  = Rect.new(i*l,0,l,@wave_bitmap.height)
  111.         dest_rect = Rect.new(i*l,@wave_amp+x,l,@wave_bitmap.height)
  112.         adt_src   = Rect.new(i*l,src_rect.height-(@wave_amp+x),l,@wave_amp+x)
  113.         adt_dest  = Rect.new(i*l,0,l,adt_src.height)
  114.       else
  115.         src_rect  = Rect.new(0,i*l,@wave_bitmap.width,l)
  116.         dest_rect = Rect.new(@wave_amp+x,i*l,@wave_bitmap.width,l)
  117.         adt_src   = Rect.new(src_rect.width-(@wave_amp+x),i*l,@wave_amp+x,l)
  118.         adt_dest  = Rect.new(0,i*l,adt_src.width, l)
  119.       end
  120.       bitmap.stretch_blt(dest_rect, @wave_bitmap, src_rect)
  121.       bitmap.stretch_blt(adt_dest,  @wave_bitmap, adt_src )
  122.     end
  123.     # frame rate: VX = 60 | XP = 40
  124.     # wave speed compatibility VX to XP: wave_speed * 60/40
  125.     phase = @wave_speed * (60.0 / Graphics.frame_rate) / @wave_length
  126.     @wave_phase += phase
  127.     @wave_phase -= 360 if @wave_phase > 360
  128.     @wave_phase += 360 if @wave_phase < 0
  129.   end
  130. end
  131.  
  132. #==============================================================================
  133. # ** Sprite
  134. #------------------------------------------------------------------------------
  135. #  This sprite is used to display bitmap in game.
  136. #==============================================================================
  137. class Sprite
  138.   #--------------------------------------------------------------------------
  139.   # * Include Wave_Effect_XP method
  140.   #--------------------------------------------------------------------------
  141.   method_defined?(:update_wave) || (include Wave_Effect_XP)
  142.   #--------------------------------------------------------------------------
  143.   # * Alias Listing
  144.   #--------------------------------------------------------------------------
  145.   unless method_defined?(:wave_effect_update)
  146.     alias_method :wave_effect_update, :update
  147.     alias_method :bitmap_change, :bitmap=
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # * Bitmap
  151.   #--------------------------------------------------------------------------
  152.   def bitmap=(*args)
  153.     bitmap_change(*args)
  154.     clear_wave_bitmap  
  155.   end
  156.   #--------------------------------------------------------------------------
  157.   # * Frame Update
  158.   #--------------------------------------------------------------------------
  159.   def update(*args)
  160.     wave_effect_update(*args) # Call Original or Other Aliases
  161.     wave? && update_wave      # If Sprite has a Wave
  162.   end
  163. end
  164.  
  165. #==============================================================================
  166. # ** Plane
  167. #------------------------------------------------------------------------------
  168. #  Plane is used to display the looping image. The image will looping
  169. #  both horizontally and vertically.
  170. #==============================================================================
  171. class Plane
  172.   #--------------------------------------------------------------------------
  173.   # * Include Wave_Effect_XP method
  174.   #--------------------------------------------------------------------------
  175.   method_defined?(:update_wave) || (include Wave_Effect_XP)
  176.   #--------------------------------------------------------------------------
  177.   # * Alias Listing
  178.   #--------------------------------------------------------------------------
  179.   method_defined?(:bitmap_change) || alias_method(:bitmap_change, :bitmap=)
  180.   #--------------------------------------------------------------------------
  181.   # * Bitmap
  182.   #--------------------------------------------------------------------------
  183.   def bitmap=(*args)
  184.     bitmap_change(*args)
  185.     clear_wave_bitmap
  186.   end
  187. end
  188.  
  189. #==============================================================================
  190. # ** Scene_Map
  191. #------------------------------------------------------------------------------
  192. #  This class performs map screen processing.
  193. #==============================================================================
  194. Scene_Map.send(:attr_reader, :spriteset)
  195.  
  196. #==============================================================================
  197. # ** Spriteset_Map
  198. #------------------------------------------------------------------------------
  199. #  This class brings together map screen sprites, tilemaps, etc.
  200. #  It's used within the Scene_Map class.
  201. #==============================================================================
  202. class Spriteset_Map
  203.   #--------------------------------------------------------------------------
  204.   # * Public Instance Variable
  205.   #--------------------------------------------------------------------------
  206.   method_defined?(:fog)      || (attr_reader :fog)
  207.   method_defined?(:panorama) || (attr_reader :panorama)
  208.   #--------------------------------------------------------------------------
  209.   # * Alias Listing
  210.   #--------------------------------------------------------------------------
  211.   unless method_defined?(:wave_effect_update)
  212.     alias_method :wave_effect_update, :update
  213.   end
  214.   #--------------------------------------------------------------------------
  215.   # * Frame Update
  216.   #--------------------------------------------------------------------------
  217.   def update(*args)
  218.     # Call Original or Other Aliases
  219.     wave_effect_update(*args)
  220.     # If Panorama Plane has a Wave
  221.     @panorama.wave? && @panorama.update_wave if @panorama.respond_to?(:wave?)
  222.     # If Fog Plane has a Wave
  223.     @fog.wave? && @fog.update_wave if @fog.respond_to?(:wave?)
  224.   end
  225. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement