Advertisement
LiTTleDRAgo

[RGSS/2/3] Drago - Transition Pack

Sep 13th, 2013
673
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 41.51 KB | None | 0 0
  1. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  2. # Drago Transition Pack
  3. # Version: 1.05
  4. # Author : LiTTleDRAgo
  5. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  6. #
  7. #  How to Use :
  8. #
  9. #  DragoTransition.start(scene, method, *args)
  10. #   - scene =  "Scene_Something.new(0)" # Note : (as a string)
  11. #
  12. #   - method =                          # Note : (as a symbol)
  13. #            :zoom_in         :explode
  14. #            :zoom_out        :explode_cp
  15. #            :shred_h         :transpose
  16. #            :shred_v         :shutter
  17. #            :fade            :drop_off
  18. #            
  19. #            :ff_IV_style     :double_zoom
  20. #            :downward_spiral :uncover
  21. #            :blackhole       :frost      **
  22. #            :wave_distort    :pixelate   **
  23. #            :radial_break
  24. #
  25. #   - args   = *args of the method
  26. #
  27. #        ** Very time consuming
  28. #          Don't try it without WhiteFlute's Bitmap-EX script
  29. #
  30. # You can also use the transition in the current scene by using
  31. #   DragoTransition.start(:method)
  32. #   DragoTransition.start([:method,*args])
  33. #   DragoTransition.start([[:method,*args],[:method,*args],....])
  34. #
  35. #==============================================================================
  36. ($imported ||= {})[:drg_transition_pack] = 1.05
  37.  
  38. text = "This script needs Drago - Core Engine ver 1.32 or above"
  39. ($imported[:drg_core_engine] || 0) >= 1.32 || raise(text)
  40.  
  41. #==============================================================================
  42. # ** Graphics
  43. #------------------------------------------------------------------------------
  44. #  
  45. #==============================================================================
  46. module Graphics
  47.   #----------------------------------------------------------------------------
  48.   # ● class << self
  49.   #----------------------------------------------------------------------------
  50.   class << self
  51.     #--------------------------------------------------------------------------
  52.     # ● Alias Method
  53.     #--------------------------------------------------------------------------
  54.     alias_sec_method :drg_transition_pack_transition, :transition
  55.     #--------------------------------------------------------------------------
  56.     # ● transition
  57.     #--------------------------------------------------------------------------
  58.     def transition(*args)
  59.       if $skip_trans
  60.         DragoTransition.drg_transition_start_phase2(*$skip_trans)
  61.         args[0] = 0  
  62.         $skip_trans = nil
  63.       end
  64.       drg_transition_pack_transition(*args)
  65.     end
  66.     #--------------------------------------------------------------------------
  67.     # ● drg_transition_start_phase1
  68.     #--------------------------------------------------------------------------
  69.     def drg_transition_start_phase1(show_next,reserve,type,args,bitmap,scene)
  70.       $skip_trans = [show_next,reserve,type,args,bitmap,scene]  
  71.       freeze
  72.       scene ? LiTTleDRAgo.scene = eval(scene) : transition
  73.     end
  74.   end
  75. end
  76.  
  77. #==============================================================================
  78. # ** DragoTransition
  79. #------------------------------------------------------------------------------
  80. #  
  81. #==============================================================================
  82. class DragoTransition
  83.   #----------------------------------------------------------------------------
  84.   # ● Constant
  85.   #----------------------------------------------------------------------------
  86.   Explosion_Sound = nil
  87.   Clink_Sound     = nil
  88.   #----------------------------------------------------------------------------
  89.   # ● class << self
  90.   #----------------------------------------------------------------------------
  91.   class << self
  92.     #--------------------------------------------------------------------------
  93.     # ● Start
  94.     #--------------------------------------------------------------------------
  95.     def start(show_next = true,type = nil,*args)
  96.       show_next = [show_next] unless show_next.is_a?(Array)
  97.       @show_next = show_next.shift
  98.       @reserve = show_next
  99.       @type = type
  100.       @args = args
  101.       if @type.nil?
  102.         if @show_next.is_a?(Array)
  103.           @type      = @show_next.at(0)
  104.           @args      = @show_next.at(1)
  105.           @show_next = @reserve.shift
  106.         elsif @show_next.is_a?(Symbol)
  107.           @type      = @show_next  
  108.           @args      = []
  109.           unless @reserve.first.is_a?(Symbol)
  110.             @args.concat(@reserve)  
  111.             @reserve.clear
  112.           end
  113.           @show_next = @reserve.shift
  114.         else
  115.           @type      = :fade    
  116.           @args      = []    
  117.         end
  118.       end
  119.       Graphics.update
  120.       @bitmap = Graphics.snap_to_bitmap
  121.       change_scene
  122.       Graphics.drg_transition_start_phase1(@show_next,@reserve,@type,
  123.           @args,@bitmap,@scene)
  124.     end
  125.     #--------------------------------------------------------------------------
  126.     # ● drg_transition_start_phase2
  127.     #--------------------------------------------------------------------------
  128.     def drg_transition_start_phase2(show_next,reserve,type,args,bitmap,scene)
  129.       @show_next = show_next
  130.       @reserve = reserve
  131.       @type = type
  132.       @args = args
  133.       @bitmap = bitmap
  134.       @scene = scene
  135.       create_sprite
  136.       perform_transition
  137.       execute_transition(@type, *@args)
  138.       graphics_freeze unless is_a_true?
  139.       forced_freeze if $forced_freeze
  140.       terminate
  141.       execute_reserve unless is_a_true?
  142.     end
  143.     #--------------------------------------------------------------------------
  144.     # ● is_a_true?
  145.     #--------------------------------------------------------------------------
  146.     def is_a_true?
  147.       (@show_next || true).is_a?(TrueClass)
  148.     end
  149.     #--------------------------------------------------------------------------
  150.     # ● is_a_scene?
  151.     #--------------------------------------------------------------------------
  152.     def is_a_scene?
  153.       @show_next::method_defined?(:main) rescue false
  154.     end
  155.     #--------------------------------------------------------------------------
  156.     # ● change_scene
  157.     #--------------------------------------------------------------------------
  158.     def change_scene
  159.       @scene = nil
  160.       if is_a_scene?
  161.         @scene = "#{@show_next.new}"
  162.       elsif "#{@show_next}".scan(/.new/i).flatten != []
  163.         @scene = "#{@show_next}"
  164.       end
  165.     end
  166.     #--------------------------------------------------------------------------
  167.     # ● Create Sprite
  168.     #--------------------------------------------------------------------------
  169.     def create_sprite
  170.       @spriteviewport       = Viewport.new(0,0,Graphics.width,Graphics.height)
  171.       @spriteviewport.z     = 0x3FFFFFFF
  172.       @sprite = Sprite.new(@spriteviewport)
  173.       if @bitmap.is_a?(Bitmap) && @bitmap.not.disposed?
  174.         @sprite.bitmap = @bitmap
  175.       else
  176.         @sprite.bitmap = Graphics.snap_to_bitmap
  177.       end
  178.       @show_back = Sprite.new
  179.       unless @show_next
  180.         @show_back.bitmap = @sprite.bitmap.clone
  181.         @show_back.bitmap.fill_rect(@show_back.bitmap.rect,Color.new(0,0,0))
  182.       end
  183.       if @show_next.is_a?(Bitmap)
  184.         @show_back.bitmap = @show_next.clone
  185.         @show_next.dispose
  186.         @show_next = true
  187.       end
  188.       @sprite.x = @sprite.ox = @sprite.bitmap.width / 2
  189.       @sprite.y = @sprite.oy = @sprite.bitmap.height / 2
  190.       @sprite.z = 100000
  191.     end
  192.     #--------------------------------------------------------------------------
  193.     # ● perform_transition
  194.     #--------------------------------------------------------------------------
  195.     def perform_transition
  196.       Graphics.drg_transition_pack_transition(10)
  197.     end
  198.     #--------------------------------------------------------------------------
  199.     # ● execute_transition
  200.     #--------------------------------------------------------------------------
  201.     def execute_transition(type, *args)
  202.       send(type, *args)
  203.     end
  204.     #--------------------------------------------------------------------------
  205.     # ● graphics_freeze
  206.     #--------------------------------------------------------------------------
  207.     def graphics_freeze
  208.       Graphics.freeze
  209.     end
  210.     #--------------------------------------------------------------------------
  211.     # ● forced_freeze
  212.     #--------------------------------------------------------------------------
  213.     def forced_freeze
  214.       graphics_freeze
  215.       $forced_freeze = nil
  216.     end
  217.     #--------------------------------------------------------------------------
  218.     # ● terminate
  219.     #--------------------------------------------------------------------------
  220.     def terminate
  221.       all_variable_dispose
  222.     end
  223.     #--------------------------------------------------------------------------
  224.     # ● execute_reserve
  225.     #--------------------------------------------------------------------------
  226.     def execute_reserve
  227.       if @show_next.is_a?(Array)
  228.         show_next = @show_next.shift
  229.         DragoTransition.start(@reserve,show_next,*@show_next)
  230.       elsif @show_next.is_a?(Symbol)
  231.         DragoTransition.start(@reserve.empty? || @reserve,@show_next)
  232.       else
  233.         perform_transition
  234.       end
  235.     end
  236.     #--------------------------------------------------------------------------
  237.     # ● play_se
  238.     #--------------------------------------------------------------------------
  239.     def play_se(filename, pitch=nil, volume=nil)
  240.       se = RPG::AudioFile.new(filename)
  241.       se.pitch  = pitch unless pitch.nil?
  242.       se.volume = volume unless volume.nil?
  243.       $game_system.se_play(se)
  244.     end
  245.    
  246.     #==========================================================================
  247.     #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  248.     # ** Effect Library
  249.     #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  250.     #==========================================================================
  251.    
  252.     #--------------------------------------------------------------------------
  253.     # * Pixelate
  254.     #     frames : Effect duration in frames
  255.     #--------------------------------------------------------------------------
  256.     def pixelate(frames=20)
  257.       # Change bitmap to pixelate
  258.       frames.times do
  259.         @sprite.pixelate!
  260.         Graphics.update
  261.       end
  262.       unit_opacity = (255.0 / frames).ceil
  263.       frames.times do
  264.         @sprite.opacity -= unit_opacity
  265.         Graphics.update
  266.       end
  267.     end
  268.     #--------------------------------------------------------------------------
  269.     # * Frost
  270.     #     frames : Effect duration in frames
  271.     #--------------------------------------------------------------------------
  272.     def frost(frames=20)
  273.       # Change bitmap to frost
  274.       frames.times do
  275.         @sprite.frost!
  276.         Graphics.update
  277.       end
  278.       unit_opacity = (255.0 / frames).ceil
  279.       frames.times do
  280.         @sprite.opacity -= unit_opacity
  281.         Graphics.update
  282.       end
  283.     end
  284.     #--------------------------------------------------------------------------
  285.     # * Double Zoom
  286.     #     frames : Effect duration in frames
  287.     #   zoom1 : The max amount the screen zooms stage 1
  288.     #   zoom2 : The max amount the screen zooms stage 2
  289.     #--------------------------------------------------------------------------
  290.     def double_zoom(frames = 30, zoom1 = 12, zoom2 = 32)
  291.       # Calculate the stages. Account for final zoom being longer.
  292.       stage3 = (frames * (zoom1.to_f / zoom2)).round
  293.       stages = [(frames - stage3) / 2, (frames - stage3) / 2, stage3]
  294.       # Calculate the zoom rates to apply each frame, for each stage.
  295.       zoom_rates, opacity_rate = [zoom1-1, -zoom1+1, zoom2], (255 / frames.to_f)
  296.       zoom_rates.each_index {|i| zoom_rates[i] /= stages[i].to_f }
  297.       # Initialize local variable to keep track of current stage being executed.
  298.       current_stage = 0
  299.       3.times do
  300.         # Iterate each stage, using the calculated rates for each one.
  301.         stages[current_stage].times do
  302.           @sprite.zoom_x += zoom_rates[current_stage]
  303.           @sprite.zoom_y += zoom_rates[current_stage]
  304.           @sprite.opacity -= opacity_rate
  305.           Graphics.update
  306.         end
  307.         current_stage += 1
  308.       end
  309.     end
  310.     #--------------------------------------------------------------------------
  311.     # * Zoom In
  312.     #     frames : Effect duration in frames
  313.     #   max_zoom : The max amount the screen zooms out
  314.     #--------------------------------------------------------------------------
  315.     def zoom_in(frames=20, max_zoom=12)
  316.       # Calculate difference b/w current and target
  317.       # zooms (1 and max_zoom)
  318.       zoom_diff = max_zoom - 1
  319.       # Calculate unit values
  320.       unit_zoom = zoom_diff.to_f / frames
  321.       unit_opacity = (255.0 / frames).ceil
  322.       # Apply unit values to sprite
  323.       frames.times do
  324.         @sprite.zoom_x += unit_zoom
  325.         @sprite.zoom_y += unit_zoom
  326.         @sprite.opacity -= unit_opacity
  327.         Graphics.update
  328.       end
  329.     end
  330.     #--------------------------------------------------------------------------
  331.     # * Zoom Out
  332.     #     frames : Effect duration in frames
  333.     #--------------------------------------------------------------------------
  334.     def zoom_out(frames=20)
  335.       # Calculate unit values
  336.       unit_zoom = 1.0 / frames
  337.       unit_opacity = (255.0 / frames).ceil
  338.       # Apply unit values to sprite
  339.       frames.times do
  340.         @sprite.zoom_x -= unit_zoom
  341.         @sprite.zoom_y -= unit_zoom
  342.         @sprite.opacity -= unit_opacity
  343.         Graphics.update
  344.       end
  345.     end
  346.     #--------------------------------------------------------------------------
  347.     # * Shred Horizontal
  348.     #      thickness : Shred thickness
  349.     #       slowness : How slow the screens move out
  350.     #    start_speed : Speed of first step in pixels
  351.     #--------------------------------------------------------------------------
  352.     def shred_h(thickness=4, slowness=4, start_speed=8)
  353.       t = thickness
  354.       # Shred screen
  355.       sprite2 = Sprite.new(@sprite.viewport)
  356.       sprite2.bitmap = Bitmap.new(@sprite.bitmap.width, @sprite.bitmap.height)
  357.       sprite2.x = sprite2.ox = sprite2.bitmap.width / 2
  358.       sprite2.y = sprite2.oy = sprite2.bitmap.height / 2
  359.       for i in 0..(480/t)
  360.         sprite2.bitmap.blt(0, i*t*2, @sprite.bitmap, Rect.new(0, i*t*2, 640, t))
  361.         @sprite.bitmap.fill_rect(0, i*t*2, 640, t, Color.new(0, 0, 0, 0))
  362.       end
  363.       # Make sure starting step is not zero
  364.       start_speed = slowness if start_speed < slowness
  365.       # Move sprites
  366.       dist = 640 - @sprite.x + start_speed
  367.       loop do
  368.         x_diff = (dist - (640 - @sprite.x)) / slowness
  369.         @sprite.x += x_diff
  370.         sprite2.x -= x_diff
  371.         Graphics.update
  372.         break if @sprite.x >= 640 + 320
  373.       end
  374.       sprite2.bitmap.dispose
  375.       sprite2.dispose
  376.     end
  377.     #--------------------------------------------------------------------------
  378.     # * Shred Vertical
  379.     #      thickness : Shred thickness
  380.     #       slowness : How slow the screens move out
  381.     #    start_speed : Speed of first step in pixels
  382.     #--------------------------------------------------------------------------
  383.     def shred_v(thickness=4, slowness=4, start_speed=8)
  384.       t = thickness
  385.       # Shred screen
  386.       sprite2 = Sprite.new(@sprite.viewport)
  387.       sprite2.bitmap = Bitmap.new(@sprite.bitmap.width, @sprite.bitmap.height)
  388.       sprite2.x = sprite2.ox = sprite2.bitmap.width / 2
  389.       sprite2.y = sprite2.oy = sprite2.bitmap.height / 2
  390.       # Shred bitmap
  391.       for i in 0..(640/t)
  392.         sprite2.bitmap.blt(i*t*2, 0, @sprite.bitmap, Rect.new(i*t*2, 0, t, 480))
  393.         @sprite.bitmap.fill_rect(i*t*2, 0, t, 480, Color.new(0, 0, 0, 0))
  394.       end
  395.       # Make sure starting step is not zero
  396.       start_speed = slowness if start_speed < slowness
  397.       # Move sprites
  398.       dist = 480 - @sprite.y + start_speed
  399.       loop do
  400.         y_diff = (dist - (480 - @sprite.y)) / slowness
  401.         @sprite.y += y_diff
  402.         sprite2.y -= y_diff
  403.         Graphics.update
  404.         break if @sprite.y >= 480 + 240
  405.       end
  406.       sprite2.bitmap.dispose
  407.       sprite2.dispose
  408.     end
  409.     #--------------------------------------------------------------------------
  410.     # * Shred Grid
  411.     #      thickness : Shred thickness
  412.     #       slowness : How slow the screens move out
  413.     #    start_speed : Speed of first step in pixels
  414.     #       priority : Which direction comes first (0 - vertical, 1 - horizontal)
  415.     #--------------------------------------------------------------------------
  416.     def shred_g(thickness=4, slowness=4, start_speed=8, priority = 0)
  417.       t = thickness
  418.       # Shred screen
  419.       sprite2 = Sprite.new(@sprite.viewport)
  420.       sprite2.bitmap = Bitmap.new(@sprite.bitmap.width, @sprite.bitmap.height)
  421.       sprite2.x = sprite2.ox = sprite2.bitmap.width / 2
  422.       sprite2.y = sprite2.oy = sprite2.bitmap.height / 2
  423.       sprite3 = Sprite.new(@sprite.viewport)
  424.       sprite3.bitmap = Bitmap.new(@sprite.bitmap.width, @sprite.bitmap.height)
  425.       sprite3.x = sprite3.ox = sprite3.bitmap.width / 2
  426.       sprite3.y = sprite3.oy = sprite3.bitmap.height / 2
  427.       sprite4 = Sprite.new(@sprite.viewport)
  428.       sprite4.bitmap = @sprite.bitmap.clone
  429.       sprite4.x = sprite4.ox = sprite4.bitmap.width / 2
  430.       sprite4.y = sprite4.oy = sprite4.bitmap.height / 2
  431.       #sprite2.visible = sprite3.visible = sprite4.visible = false
  432.       # Shred bitmap
  433.       if priority == 0
  434.         for i in 0..(640/t)
  435.           sprite2.bitmap.blt(i*t*2, 0, @sprite.bitmap, Rect.new(i*t*2, 0, t, 480))
  436.           @sprite.bitmap.fill_rect(i*t*2, 0, t, 480, Color.new(0, 0, 0, 0))
  437.           sprite4.bitmap.fill_rect(i*t*2, 0, t, 480, Color.new(0, 0, 0, 0))
  438.           sprite2.z = 4
  439.           sprite3.z = 3
  440.           @sprite.z = 2
  441.           sprite4.z = 1
  442.         end
  443.         for i in 0..(480/t)
  444.           sprite3.bitmap.blt(0, i*t*2, @sprite.bitmap, Rect.new(0, i*t*2, 640, t))
  445.           @sprite.bitmap.fill_rect(0, i*t*2, 640, t, Color.new(0, 0, 0, 0))
  446.           sprite4.bitmap.fill_rect(0, i*t*2, 640, t, Color.new(0, 0, 0, 0))
  447.         end
  448.       else
  449.         for i in 0..(480/t)
  450.           sprite3.bitmap.blt(0, i*t*2, @sprite.bitmap, Rect.new(0, i*t*2, 640, t))
  451.           @sprite.bitmap.fill_rect(0, i*t*2, 640, t, Color.new(0, 0, 0, 0))
  452.           sprite4.bitmap.fill_rect(0, i*t*2, 640, t, Color.new(0, 0, 0, 0))
  453.           sprite3.z = 4
  454.           sprite2.z = 3
  455.           @sprite.z = 2
  456.           sprite4.z = 1
  457.         end
  458.         for i in 0..(640/t)
  459.           sprite2.bitmap.blt(i*t*2, 0, @sprite.bitmap, Rect.new(i*t*2, 0, t, 480))
  460.           @sprite.bitmap.fill_rect(i*t*2, 0, t, 480, Color.new(0, 0, 0, 0))
  461.           sprite4.bitmap.fill_rect(i*t*2, 0, t, 480, Color.new(0, 0, 0, 0))
  462.         end
  463.       end
  464.       # Make sure starting step is not zero
  465.       start_speed = slowness if start_speed < slowness
  466.       # Move sprites
  467.       disty = 480 - sprite4.y + start_speed
  468.       distx = 640 - @sprite.y + start_speed
  469.       loop do
  470.         y_diff = (disty - (480 - sprite4.y)) / slowness
  471.         x_diff = (distx - (640 - @sprite.x)) / slowness
  472.         sprite4.y += y_diff
  473.         sprite2.y -= y_diff
  474.         @sprite.x += x_diff
  475.         sprite3.x -= x_diff
  476.         Graphics.update
  477.         break if @sprite.x >= 640 + 320
  478.       end
  479.       sprite2.bitmap.dispose
  480.       sprite2.dispose
  481.       sprite3.bitmap.dispose
  482.       sprite3.dispose
  483.       sprite4.bitmap.dispose
  484.       sprite4.dispose
  485.     end
  486.     #--------------------------------------------------------------------------
  487.     # * Custom Tile Sprites
  488.     #--------------------------------------------------------------------------
  489.     def custom_tile_sprites(size_x, size_y, conditions, properties, centered = true)
  490.       raise "Tile Error: not the same amount of conditions and properties" if conditions.length != properties.length
  491.       tiles = []
  492.       # Iterate through main sprite, creating sprites for each square.
  493.       (0...@sprite.bitmap.width / size_x).each {|col|
  494.         (0...@sprite.bitmap.height / size_y).each {|row|
  495.           sprite = Sprite.new(@sprite.viewport)
  496.           sprite.x += col*size_x
  497.           sprite.y += row*size_y
  498.           sprite.bitmap = Bitmap.new(size_x, size_y)
  499.           rect = Rect.new(sprite.x, sprite.y, size_x, size_y)
  500.           sprite.bitmap.blt(0, 0, @sprite.bitmap, rect)
  501.           for i in 0...conditions.length
  502.             if conditions[i].call(col, row)
  503.               properties[i].each { |prop|
  504.                 sprite.send("#{prop[0]}=", prop[1])
  505.                 #sprite.zoom_x = 1
  506.                 #sprite.zoom_y = 1
  507.               }
  508.               break
  509.             end
  510.           end
  511.           if centered
  512.             sprite.ox = size_x / 2
  513.             sprite.oy = size_y / 2
  514.             sprite.x += size_x / 2
  515.             sprite.y += size_y / 2
  516.           end
  517.           tiles.push(sprite)
  518.         }
  519.       }
  520.       @sprite.opacity = 0
  521.       return tiles
  522.     end
  523.     #--------------------------------------------------------------------------
  524.     # * tile_sprites
  525.     #--------------------------------------------------------------------------
  526.     def tile_sprites(tilesize)
  527.       tiles = []
  528.       # Iterate through main sprite, creating sprites for each square.
  529.       (0...@sprite.bitmap.width / tilesize).each {|x|
  530.         (0...@sprite.bitmap.height / tilesize).each {|y|
  531.           sprite = Sprite.new
  532.           sprite.x, sprite.y = x*tilesize, y*tilesize
  533.           sprite.bitmap = Bitmap.new(tilesize, tilesize)
  534.           rect = Rect.new(sprite.x, sprite.y, tilesize, tilesize)
  535.           sprite.bitmap.blt(0, 0, @sprite.bitmap, rect)
  536.           tiles.push(sprite)
  537.         }
  538.       }
  539.       @sprite.opacity = 0
  540.       return tiles
  541.     end
  542.     #--------------------------------------------------------------------------
  543.     # * Effect3
  544.     #--------------------------------------------------------------------------
  545.     def effect3(size_x = 640, size_y = 4)
  546.       tiles = custom_tile_sprites(size_x, size_y, [proc { true }], [{}])
  547.       # Make sure starting step is not zero
  548.       #start_speed = slowness if start_speed < slowness
  549.       frames = 0
  550.       while (tiles.select { |i| i.visible == true }).length > 0
  551.         selected_length = (tiles.select { |i| i.visible == true }).length
  552.         frames += 1
  553.         for i in tiles
  554.           i.visible = false if rand(selected_length / 4) == 0
  555.         end
  556.         Graphics.update
  557.       end
  558.       tiles.each { |tile|
  559.         tile.bitmap.dispose
  560.         tile.dispose
  561.       }
  562.     end
  563.     #--------------------------------------------------------------------------
  564.     # * Effect2
  565.     #--------------------------------------------------------------------------
  566.     def effect2(fade_length = 10, size_x = 20, size_y = 20)
  567.       tiles = custom_tile_sprites(size_x, size_y, [proc { true }], [{}])
  568.       # Make sure starting step is not zero
  569.       #start_speed = slowness if start_speed < slowness
  570.       frames = 0
  571.       opac_diff = 255 / fade_length
  572.       while (tiles.select { |i| i.visible == true }).length > 0
  573.         selected_length = (tiles.select { |i| i.visible == true }).length
  574.         frames += 1
  575.         for i in tiles
  576.           i.opacity -= opac_diff if (i.opacity != 255 and i.opacity > 0) or rand(selected_length / 4) == 0
  577.           i.visible = false if i.opacity <= 0 and i.visible
  578.         end
  579.         Graphics.update
  580.       end
  581.       tiles.each { |tile|
  582.         tile.bitmap.dispose
  583.         tile.dispose
  584.       }
  585.     end
  586.     #--------------------------------------------------------------------------
  587.     # * Uncover
  588.     #--------------------------------------------------------------------------
  589.     def uncover(dir = 0, duration = 40)
  590.       frames = 0
  591.       x_mod = case dir;when 7,0,1 then -640; when 3,4,5 then 640;else 0;end
  592.       y_mod = case dir;when 1,2,3 then -480; when 5,6,7 then 480;else 0;end
  593.       s_pos = [@sprite.x, @sprite.y]
  594.       d_pos = [s_pos[0] + x_mod, s_pos[1] + y_mod]
  595.       loop do
  596.         frames += 1
  597.         @sprite.x = (s_pos[0] * (duration - frames) + d_pos[0] * frames) / duration
  598.         @sprite.y = (s_pos[1] * (duration - frames) + d_pos[1] * frames) / duration
  599.         Graphics.update
  600.         break if frames == duration
  601.       end
  602.     end
  603.     #--------------------------------------------------------------------------
  604.     # * Fade
  605.     #     target_color : Color to fade to
  606.     #           frames : Effect duration in frames
  607.     #--------------------------------------------------------------------------
  608.     def fade(target_color=Color.new(255, 255, 255), frames=40)
  609.       loop do
  610.         r = (@sprite.color.red   * (frames - 1) + target_color.red)   / frames
  611.         g = (@sprite.color.green * (frames - 1) + target_color.green) / frames
  612.         b = (@sprite.color.blue  * (frames - 1) + target_color.blue)  / frames
  613.         a = (@sprite.color.alpha * (frames - 1) + target_color.alpha) / frames
  614.         @sprite.color.red   = r
  615.         @sprite.color.green = g
  616.         @sprite.color.blue  = b
  617.         @sprite.color.alpha = a
  618.         frames -= 1
  619.         Graphics.update
  620.         break if frames <= 0
  621.       end
  622.       #Graphics.freeze
  623.     end
  624.     #--------------------------------------------------------------------------
  625.     # * Explode
  626.     #     explosion_sound : The SE filename to use for explosion sound
  627.     #--------------------------------------------------------------------------
  628.     def explode(explosion_sound=Explosion_Sound)
  629.       shake_count = 2
  630.       shakes = 40
  631.       tone = 0
  632.       shakes.times do
  633.         @sprite.ox = 320 + (rand(2) == 0 ? -1 : 1) * shake_count
  634.         @sprite.oy = 240 + (rand(2) == 0 ? -1 : 1) * shake_count
  635.         shake_count += 0.2
  636.         tone += 128/shakes
  637.         @sprite.tone.set(tone, tone, tone)
  638.         Graphics.update
  639.       end
  640.       @sprite.ox, @sprite.oy = 320, 240
  641.       Graphics.update
  642.       bitmap = @sprite.bitmap.clone
  643.       viewport = @sprite.viewport
  644.       @sprite.bitmap.dispose
  645.       @sprite.dispose
  646.       # Slice bitmap and create nodes (sprite parts)
  647.       hor = []
  648.       20.times do |i|
  649.         ver = []
  650.         15.times do |j|
  651.           # Set node properties
  652.           s = Sprite.new(viewport)
  653.           s.ox, s.oy = 8 + rand(25), 8 + rand(25)
  654.           s.x, s.y = s.ox + 32 * i, s.oy + 32 * j
  655.           s.bitmap = Bitmap.new(32, 32)
  656.           s.bitmap.blt(0, 0, bitmap, Rect.new(i * 32, j * 32, 32, 32))
  657.           s.tone.set(128, 128, 128)
  658.           # Set node physics
  659.           angle  = (rand(2) == 0 ? -1 : 1) * (4 + rand(4) * 10)
  660.           zoom_x = (rand(2) == 0 ? -1 : 1) * (rand(2) + 1).to_f / 100
  661.           zoom_y = (rand(2) == 0 ? -1 : 1) * (rand(2) + 1).to_f / 100
  662.           (zoom_x > zoom_y) ? (zoom_y = -zoom_x) : (zoom_x = -zoom_y)
  663.           x_rand = (2 + rand(2) == 0 ? -2 : 2)
  664.           y_rand = (1 + rand(2) == 0 ? -1 : 1)
  665.           # Store node and it's physics
  666.           ver.push([s, angle, zoom_x, zoom_y, x_rand, y_rand])
  667.         end
  668.         hor.push(ver)
  669.       end
  670.       bitmap.dispose
  671.       # Play sound
  672.       play_se(explosion_sound) if explosion_sound != nil
  673.       # Move pics
  674.       40.times do |k|
  675.         hor.each_with_index do |ver, i|
  676.           ver.each_with_index do |data, j|
  677.             # Get node and it's physics
  678.             s, angle, zoom_x, zoom_y = data[0], data[1], data[2], data[3]
  679.             x_rand, y_rand = data[4], data[5]
  680.             # Manipulate nodes
  681.             s.x += (i - 10) * x_rand
  682.             s.y += (j - 8) * y_rand + (k - 20)/2
  683.             s.zoom_x += zoom_x
  684.             s.zoom_y += zoom_y
  685.             tone = s.tone.red - 8
  686.             s.tone.set(tone, tone, tone)
  687.             s.opacity -= 13 if k > 19
  688.             s.angle += angle % 360
  689.           end
  690.         end
  691.         Graphics.update
  692.       end
  693.       # Dispose
  694.       for ver in hor
  695.         for data in ver
  696.           data[0].bitmap.dispose
  697.           data[0].dispose
  698.         end
  699.       end
  700.       hor = nil
  701.     end
  702.     #--------------------------------------------------------------------------
  703.     # * Explode (Chaos Project Style)
  704.     #     explosion_sound : The SE filename to use for explosion sound
  705.     #--------------------------------------------------------------------------
  706.     def explode_cp(explosion_sound=Explosion_Sound)
  707.       bitmap = @sprite.bitmap.clone
  708.       viewport = @sprite.viewport
  709.       @sprite.bitmap.dispose
  710.       @sprite.dispose
  711.       # Slice bitmap and create nodes (sprite parts)
  712.       hor = []
  713.       20.times do |i|
  714.         ver = []
  715.         15.times do |j|
  716.           # Set node properties
  717.           s = Sprite.new(viewport)
  718.           s.ox = s.oy = 16
  719.           s.x, s.y = s.ox + 32 * i, s.oy + 32 * j
  720.           s.bitmap = Bitmap.new(32, 32)
  721.           s.bitmap.blt(0, 0, bitmap, Rect.new(i * 32, j * 32, 32, 32))
  722.           # Set node physics
  723.           angle  = (rand(2) == 0 ? -1 : 1) * rand(8)
  724.           zoom_x = (rand(2) == 0 ? -1 : 1) * (rand(2) + 1).to_f / 100
  725.           zoom_y = (rand(2) == 0 ? -1 : 1) * (rand(2) + 1).to_f / 100
  726.           # Store node and it's physics
  727.           ver.push([s, angle, zoom_x, zoom_y])
  728.         end
  729.         hor.push(ver)
  730.       end
  731.       bitmap.dispose
  732.       # Play sound
  733.       play_se(explosion_sound) if explosion_sound != nil
  734.       # Move pics
  735.       40.times do |k|
  736.         hor.each_with_index do |ver, i|
  737.           ver.each_with_index do |data, j|
  738.             # Get node and it's physics
  739.             s, angle, zoom_x, zoom_y = data[0], data[1], data[2], data[3]
  740.             # Manipulate node
  741.             s.x += i - 9
  742.             s.y += j - 8 + k
  743.             s.zoom_x += zoom_x
  744.             s.zoom_y += zoom_y
  745.             s.angle += angle % 360
  746.           end
  747.         end
  748.         Graphics.update
  749.       end
  750.       # Dispose
  751.       for ver in hor
  752.         for data in ver
  753.           data[0].bitmap.dispose
  754.           data[0].dispose
  755.         end
  756.       end
  757.       hor = nil
  758.     end
  759.     #--------------------------------------------------------------------------
  760.     # * Transpose (bt Blizzard)
  761.     #     frames : Effect duration in frames
  762.     #   max_zoom : The max amount the screen zooms out
  763.     #      times : Number of times screen is zoomed (times * 3 / 2)
  764.     #--------------------------------------------------------------------------
  765.     def transpose(frames=80, max_zoom=12, times=3)
  766.       max_zoom -= 1 # difference b/w zooms
  767.       max_zoom = max_zoom.to_f / frames / times # unit zoom
  768.       unit_opacity = (255.0 / frames).ceil
  769.       spr_opacity = (255.0 * times / 2 / frames).ceil
  770.       @sprites = []
  771.       (times * 3 / 2).times {
  772.         s = Sprite.new(@sprite.viewport)
  773.         s.x, s.y, s.ox, s.oy = 320, 240, 320, 240
  774.         s.bitmap = @sprite.bitmap
  775.         s.blend_type = 1
  776.         s.opacity = 128
  777.         s.visible = false
  778.         @sprites.push(s)}
  779.       count = 0
  780.       loop {
  781.           @sprites[count].visible = true
  782.           count += 1 if count < times * 3 / 2 - 1
  783.           (frames / times / 2).times {
  784.               @sprites.each {|s|
  785.                   break if s.not.visible
  786.                   s.zoom_x += max_zoom
  787.                   s.zoom_y += max_zoom
  788.                   s.opacity -= spr_opacity}
  789.               @sprite.opacity -= unit_opacity
  790.           Graphics.update}
  791.           break if @sprite.opacity == 0}
  792.       @sprites.each {|s| s.dispose}
  793.     end
  794.     #--------------------------------------------------------------------------
  795.     # * Shutter
  796.     #       open_gap : How much the shutters open before moving away
  797.     #       flip_dir : Whether or not the direction of shutters if reversed
  798.     #       slowness : How slow the screens move out
  799.     #    start_speed : Speed of first step in pixels
  800.     #--------------------------------------------------------------------------
  801.     def shutter(flip_dir=true, open_gap=16, slowness=4, start_speed=8)
  802.       # Shred screen
  803.       sprite2 = Sprite.new(@sprite.viewport)
  804.       sprite2.bitmap = Bitmap.new(@sprite.bitmap.width, @sprite.bitmap.height)
  805.       sprite2.x = sprite2.ox = sprite2.bitmap.width / 2
  806.       sprite2.y = sprite2.oy = sprite2.bitmap.height / 2
  807.       if flip_dir
  808.         ver_step = 1
  809.         sprite2.bitmap.blt(0, 240, @sprite.bitmap, Rect.new(0, 240, 640, 240))
  810.         @sprite.bitmap.fill_rect(0, 240, 640, 240, Color.new(0, 0, 0, 0))
  811.       else
  812.         ver_step = -1
  813.         sprite2.bitmap.blt(0, 0, @sprite.bitmap, Rect.new(0, 0, 640, 240))
  814.         @sprite.bitmap.fill_rect(0, 0, 640, 240, Color.new(0, 0, 0, 0))
  815.       end
  816.       # Move the shutters apart
  817.       open_gap.times do
  818.         @sprite.y -= ver_step
  819.         sprite2.y += ver_step
  820.         Graphics.update
  821.       end
  822.       # Make sure starting step is not zero
  823.       start_speed = slowness if start_speed < slowness
  824.       # Move sprites
  825.       dist = 640 - @sprite.x + start_speed
  826.       loop do
  827.         x_diff = (dist - (640 - @sprite.x)) / slowness
  828.         @sprite.x += x_diff
  829.         sprite2.x -= x_diff
  830.         Graphics.update
  831.         break if @sprite.x >= 640 + 320
  832.       end
  833.       sprite2.bitmap.dispose
  834.       sprite2.dispose
  835.     end
  836.     #--------------------------------------------------------------------------
  837.     # * Drop Off
  838.     #     clink_sound : The SE filename to use for clinking sound
  839.     #--------------------------------------------------------------------------
  840.     def drop_off(clink_sound=Clink_Sound)
  841.       bitmap = @sprite.bitmap.clone
  842.       viewport = @sprite.viewport
  843.       @sprite.bitmap.dispose
  844.       @sprite.dispose
  845.       # Slice bitmap and create nodes (sprite parts)
  846.       max_time = 0
  847.       hor = []
  848.       10.times do |i|
  849.         ver = []
  850.         8.times do |j|
  851.           # Set node properties
  852.           s = Sprite.new(viewport)
  853.           s.ox = rand(32)
  854.           s.oy = 0
  855.           s.x = s.ox + 64 * i
  856.           s.y = s.oy + 64 * j
  857.           s.bitmap = Bitmap.new(64, 64)
  858.           s.bitmap.blt(0, 0, bitmap, Rect.new(i * 64, j * 64, 64, 64))
  859.           # Set node physics
  860.           angle = rand(4) * 2
  861.           angle *= rand(2) == 0 ? -1 : 1
  862.           start_time = rand(30)
  863.           max_time = start_time if max_time < start_time
  864.           # Store node and it's physics
  865.           ver.push([s, angle, start_time])
  866.         end
  867.         hor.push(ver)
  868.       end
  869.       bitmap.dispose
  870.       # Play sound
  871.       play_se(clink_sound) if clink_sound != nil
  872.       # Move pics
  873.       (40 + max_time).times do |k|
  874.         hor.each_with_index do |ver, i|
  875.           ver.each_with_index do |data, j|
  876.             # Get node and it's physics
  877.             s, angle, start_time = data[0], data[1], data[2]
  878.             # Manipulate node
  879.             if k > start_time
  880.               tone = s.tone.red - 6
  881.               s.tone.set(tone, tone, tone)
  882.               s.y += k - start_time
  883.               s.angle += angle % 360
  884.             elsif k == start_time
  885.               tone = 128
  886.               s.tone.set(tone, tone, tone)
  887.               play_se(clink_sound) if clink_sound != nil
  888.             end
  889.           end
  890.         end
  891.         Graphics.update
  892.       end
  893.       # Dispose
  894.       for ver in hor
  895.         for data in ver
  896.           data[0].bitmap.dispose
  897.           data[0].dispose
  898.         end
  899.       end
  900.       hor = nil
  901.     end
  902.     #--------------------------------------------------------------------------
  903.     # * ff_IV_style
  904.     #--------------------------------------------------------------------------
  905.     def ff_IV_style(zoom1 = 1.2, zoom2 = 32)
  906.       # Set number of frames and zoom rates for each stage.
  907.       stages = [4, 4, 4, 4, 20]
  908.       zooms = [zoom1, -zoom1, zoom1, -zoom1, zoom2]
  909.       zooms.each_index {|i| zooms[i] /= stages[i].to_f }
  910.       current_stage = 0
  911.       5.times do
  912.         # Begin processing.
  913.         stages[current_stage].times do
  914.           @sprite.zoom_x += zooms[current_stage]
  915.           @sprite.zoom_y += zooms[current_stage]
  916.           @sprite.opacity -= 12 if current_stage == 4
  917.           Graphics.update
  918.         end
  919.         # Increase current stage.
  920.         current_stage += 1
  921.       end
  922.     end
  923.     #--------------------------------------------------------------------------
  924.     # * downward_spiral
  925.     #--------------------------------------------------------------------------
  926.     def downward_spiral(frames = 40, rotation_speed = 15)
  927.       # Calculate the zoom to subtract each frame.
  928.       zoom, opacity = 1.0 / frames, 128.0 / frames
  929.       frames.times do
  930.         # Begin processing.
  931.         @sprite.zoom_x -= zoom
  932.         @sprite.zoom_y -= zoom
  933.         @sprite.opacity -= opacity
  934.         @sprite.angle += rotation_speed
  935.         Graphics.update
  936.       end
  937.     end
  938.     #--------------------------------------------------------------------------
  939.     # * blackhole
  940.     #--------------------------------------------------------------------------
  941.     def blackhole(speed = 4, tilesize = 12, source = [320, 240])
  942.       # Initialize squares array to hold each sprite.
  943.       tiles = tile_sprites(tilesize)
  944.       # Make each sprite slightly smaller than full size.
  945.       tiles.each {|tile| tile.zoom_x = tile.zoom_y = 0.85 }
  946.       # Begin looping until all sprites have been disposed.
  947.       until tiles.compact == []
  948.         # Iterate each tiles.
  949.         tiles.each_index {|i|
  950.           next if tiles[i] == nil
  951.           # Get distance of this sprite from the source for each axis.
  952.           sx = source[0] - tiles[i].x
  953.           sy = source[1] - tiles[i].y
  954.           # Calculate total distance and set base speed for each axis.
  955.           dist = Math.hypot(sx, sy).to_f
  956.           move_x = (dist / (sx == 0 ? 1 : sx))
  957.           move_y = (dist / (sy == 0 ? 1 : sy))
  958.           # Add a little randomness to the mix.
  959.           move_x += move_x < 0 ? -rand(speed) : rand(speed)
  960.           move_y += move_y < 0 ? -rand(speed) : rand(speed)
  961.           # Apply movement.
  962.           tiles[i].x += move_x
  963.           tiles[i].y += move_y
  964.           tiles[i].angle += rand(20)
  965.           # If tile is within its own size from source, dispose it.
  966.           if sx.abs <= tilesize && sy.abs <= tilesize
  967.              tiles[i].bitmap.dispose
  968.              tiles[i] = tiles[i].dispose
  969.           end
  970.         }
  971.         Graphics.update
  972.       end
  973.     end
  974.     #--------------------------------------------------------------------------
  975.     # * wave_distort
  976.     #--------------------------------------------------------------------------
  977.     def wave_distort(frames = 60, direction = 2, power = 0.4)
  978.       radius, tiles = 0, tile_sprites(16)
  979.       # Define starting point for zoom, depending on direction.
  980.       origin = case direction
  981.       when 2 then [@sprite.bitmap.width / 2, @sprite.bitmap.height]
  982.       when 4 then [0, @sprite.bitmap.height / 2]
  983.       when 6 then [@sprite.bitmap.width, @sprite.bitmap.height / 2]
  984.       when 8 then [@sprite.bitmap.width / 2, 0]
  985.       end
  986.       # Initialize local variable for the rate the radius will increase.
  987.       rate = Math.hypot(@sprite.bitmap.width, @sprite.bitmap.height) / frames
  988.       # Begin processing.
  989.       frames.times do
  990.         # Iterate through each tile, calculating distance from focal point.
  991.         tiles.each {|tile|
  992.           dist = Math.hypot((origin[0] - tile.x), (origin[1] - tile.y))
  993.           # Zoom tile on one axis, depending on direction.
  994.           next if radius < dist
  995.           [4, 6].include?(direction) ? tile.zoom_x += power : tile.zoom_y += power
  996.         }
  997.         # Increase radius for next iteration.
  998.         radius += rate
  999.         Graphics.update
  1000.       end
  1001.       # Dispose each bitmap and sprite used for the tiles.
  1002.       tiles.each {|tile| tile.bitmap.dispose; tile.dispose }
  1003.     end
  1004.     #--------------------------------------------------------------------------
  1005.     # * radial_break
  1006.     #--------------------------------------------------------------------------
  1007.     def radial_break(frames = 60, tilesize = 16, direction = 4, speed = 9)
  1008.       radius, tiles = 0, tile_sprites(tilesize)
  1009.       # Define starting point for zoom, depending on direction.
  1010.       origin = case direction
  1011.       when 2 then [@sprite.bitmap.width / 2, @sprite.bitmap.height]
  1012.       when 4 then [0, @sprite.bitmap.height / 2]
  1013.       when 6 then [@sprite.bitmap.width, @sprite.bitmap.height / 2]
  1014.       when 8 then [@sprite.bitmap.width / 2, 0]
  1015.       end
  1016.       # Initialize local variable for the rate the radius will increase.
  1017.       rate = Math.hypot(@sprite.bitmap.width, @sprite.bitmap.height) / frames
  1018.       # Begin processing.
  1019.       until tiles == []
  1020.         tiles.compact!
  1021.         # Iterate through each tile, calculating distance from focal point.
  1022.         tiles.each_index {|i|
  1023.           # Get distance of this sprite from the source for each axis.
  1024.           sx = origin[0] - tiles[i].x
  1025.           sy = origin[1] - tiles[i].y
  1026.           dist = Math.hypot(sx, sy).to_f
  1027.           # Zoom tile on one axis, depending on direction.
  1028.           next if radius < dist
  1029.           # Calculate total distance and set base speed for each axis.
  1030.           move_x = (dist / (sx == 0 ? 1 : sx))
  1031.           move_y = (dist / (sy == 0 ? 1 : sy))
  1032.           # Add a little randomness to the mix.
  1033.           move_x += move_x < 0 ? -rand(speed) : rand(speed)
  1034.           move_y += move_y < 0 ? -rand(speed) : rand(speed)
  1035.           # Half distance of one axis, depending on rate.
  1036.           [2, 8].include?(direction) ? move_x /= 2 : move_y /= 2
  1037.           # Apply movement.
  1038.           tiles[i].x += move_x
  1039.           tiles[i].y += move_y
  1040.           angle = (tiles[i].object_id % 2 == 0) ? rand(25) : -rand(25)
  1041.           tiles[i].angle += (angle + 5)
  1042.           # If tile is within its own size from source, dispose it.
  1043.           if sx.abs <= tilesize || sy.abs <= tilesize
  1044.              tiles[i].bitmap.dispose
  1045.              tiles[i] = tiles[i].dispose
  1046.           end
  1047.         }
  1048.         # Increase radius for next iteration.
  1049.         radius += rate / 2
  1050.         Graphics.update
  1051.       end
  1052.     end
  1053.   end
  1054. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement