#===============================================================================
# New Particle Engine
# by arevulopapo
# Nov 15th 2007
#
# This script lets you create particle effects in your game.
# Particles are integrated into "Spriteset_Map,
# so the can be displayed over/under an event.
# Effects are called from "Script" command like this:
# $scene.effect(EVENT_ID, EFFECT, LOCK, X, Y)
# EVENT_ID - ID of an event the particles will flow from.
# (-1) for player, (1) and above for events.
# EFFECT - name of the effect to call. Names are defined in the Spriteset_Map.
# LOCK - alignment of the particles. 'event' to align particles
# with event's map position, 'screen' to align with event's screen position.
# For static events, like fireplaces, teleports, etc. 'event' alignment is recommended.
# For moving events use 'screen' mode.
# X, Y - number of pixels that will be added to the event's position
# to determine the starting point of particles.
# That's your most powerful weapon ;) See the demo for examples.
#===============================================================================
class Scene_Map
def effect(event=1, effect='', lock='event', x=0, y=0)
@spriteset.add_effect(event, effect, lock, x, y)
end
end
#===============================================================================
#
#===============================================================================
class Spriteset_Map
attr_reader :particles
alias particle_ssm_init initialize
alias particle_ssm_update update
alias particle_ssm_dispose dispose
#-----------------------------------------------------------------------------
def initialize
@particles = []
particle_ssm_init
end
#-----------------------------------------------------------------------------
def dispose
@particles.each{ |d| d.dispose }
particle_ssm_dispose
end
#-----------------------------------------------------------------------------
def update
@particles.each_with_index{ |p,i|
@particles[i].update
if p.opacity == 0
p.dispose
@particles.delete_at(i)
end
}
particle_ssm_update
end
#-----------------------------------------------------------------------------
def add_effect(event=1, effect='', lock='event', x=0, y=0)
case event
when -1
object = $game_player
else
object = $game_map.events[event]
end
case effect
# (sprite, acceleration[x,y], gravity[x,y], opacity[base,loss], blending)
when 'blue'
sprite='star_blue'
add_particles(object, x, y, sprite, [1.00*(-15+rand(30))/10, 1.00*(-15+rand(30))/10], [0,0], [160,5+rand(15)], lock, 1)
when 'red'
sprite='star_red'
add_particles(object, x, y, sprite, [1.00*(-15+rand(30))/10, 1.00*(-15+rand(30))/10], [0,0], [160,5+rand(15)], lock, 1)
when 'green'
sprite='star_green'
add_particles(object, x, y, sprite, [1.00*(-15+rand(30))/10, 1.00*(-15+rand(30))/10], [0,0], [160,5+rand(15)], lock, 1)
when 'yellow'
sprite='star_yellow'
add_particles(object, x, y, sprite, [1.00*(-15+rand(30))/10, 1.00*(-15+rand(30))/10], [0,0], [160,5+rand(15)], lock, 1)
when 'smash'
sprite='smash'
add_particles(object, x, y, sprite, [1.00*(-15+rand(30))/10, 1.00*(-15+rand(30))/10], [0,0], [160,5+rand(15)], lock, 1)
when 'fire'
sprite='particle_yellow'
add_particles(object, x, y, sprite, [(rand(7)-3)*0.2, 0], [0,0.15], [255,8+rand(5)], lock, 1)
when 'fire2'
sprite='particle_orange'
add_particles(object, x, y, sprite, [(rand(7)-3)*0.2, 0], [0,0.15], [255,8+rand(5)], lock, 1)
when 'sparks'
sprite='particle_red'
add_particles(object, x, y, sprite, [0.5*(-25+rand(50))/10, -4], [0,-0.5], [255,20], lock, 1)
when 'smoke'
sprite='smoke'
add_particles(object, x, y, sprite, [0.1*(-25+rand(50))/10, 0], [0,0.13], [128,3], lock, 1)
when 'cells'
sprite='particle_red'
dx = 1.00*(-100 + rand(200))/100
dy = 1.00*(-100 + rand(200))/100
add_particles(object, x, y, sprite, [5*dx, 5*dy], [0.3*dx,0.3*dy], [255,10], lock, 1)
end
end
#-----------------------------------------------------------------------------
def add_particles(object=$game_player, x=0, y=0, sprite='', acc=[0,0], grav=[0,0], opacity=[255,0], lock='event', blend=0)
if lock=='event'
@particles << Particle_Event.new(@viewport1, object, x, y, sprite, acc, grav, opacity, blend)
elsif lock=='screen'
@particles << Particle_Screen.new(@viewport1, object, x, y, sprite, acc, grav, opacity, blend)
end
end
end
#===============================================================================
#
#===============================================================================
class Particle_Screen < Sprite
def initialize(viewport=Viewport.new(0,0,800,600), object=$game_player, x=0, y=0, sprite='', acc=[0,0], grav=[0,0], opacity=[255,3], blend=0)
super(viewport)
self.bitmap = RPG::Cache.picture('Particles/' + sprite)
self.x = object.screen_x + x
self.y = object.screen_y - 16 + y
self.ox = self.oy = self.bitmap.width/2
self.blend_type = blend
self.opacity = opacity[0]
@object = object
@origin = [self.x, self.y]
@acceleration = acc
@gravity = grav
@coords = [0.00, 0.00]
@opacity = opacity[1]
update
end
def update
@acceleration[0] -= @gravity[0] if @gravity[0] != 0
@acceleration[1] -= @gravity[1] if @gravity[1] != 0
@coords[0] += @acceleration[0]
@coords[1] += @acceleration[1]
self.opacity -= @opacity
self.x = @origin[0] + @coords[0]
self.y = @origin[1] + @coords[1]
if self.y > (@object.screen_y - 16)
self.z = @object.screen_z + 32
else
self.z = @object.screen_z - 32
end
end
end
class Particle_Event < Sprite
def initialize(viewport=Viewport.new(0,0,800,600), object=$game_player, x=0, y=0, sprite='', acc=[0,0], grav=[0,0], opacity=[255,3], blend=0)
super(viewport)
self.bitmap = RPG::Cache.picture('Particles/' + sprite)
self.x = object.x*32 + 16 - $game_map.display_x / 4 + x
self.y = object.y*32 + 32 - $game_map.display_y / 4 + y
self.ox = self.oy = self.bitmap.width/2
self.blend_type = blend
self.opacity = opacity[0]
@object = object
@origin = [object.x*32 + x + 16, object.y*32 + y + 32]
@acceleration = acc
@gravity = grav
@coords = [0.00, 0.00]
@opacity = opacity[1]
update
end
def update
@acceleration[0] -= @gravity[0] if @gravity[0] != 0
@acceleration[1] -= @gravity[1] if @gravity[1] != 0
@coords[0] += @acceleration[0]
@coords[1] += @acceleration[1]
self.opacity -= @opacity
self.x = @origin[0] + @coords[0] - $game_map.display_x / 4
self.y = @origin[1] + @coords[1] - $game_map.display_y / 4 - 16
if self.y > (@object.screen_y - 16)
self.z = @object.screen_z + 32
else
self.z = @object.screen_z - 32
end
end
end