06-21-2009, 05:41 AM
New Particle Engine
by Arevulopapo
Posted by PK8, sorries!
by Arevulopapo
Posted by PK8, sorries!
Introduction
Quoting from Anaryu's particles topic because it just fits the description.
Anaryu Wrote:You've seen these effects all over, in sprite or 3D games, from console to MMOs like World of Warcraft, a Particle Engine is just a fancy term for taking a series of pictures and making them change size, fade out, and move around many times over to make it look like a flame or a bolt of lightning
Script
Code:
#===============================================================================
# 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)
#sines
when 'black'
sprite='star_sine'
add_particles(object, x, y, sprite, [(rand(7)-3)*0.2, 0], [0,0.15], [255,8+rand(5)], lock, 1)
#sines end
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
Instructions
Instructions on how to use are in the script. If you're looking to create your own particle effects, refer to line 74 and below to see how these effects are made.
Compatibility
This script aliases the following:
- Spriteset_Map's initialize
- Spriteset_Map's update
- Spriteset_Map's dispose
Other
The particle graphics should be put into the Graphics/Pictures/Particles/ directory.
Downloads
Download these sample particles for this script. Note, they must be placed within the Graphics/Pictures/Particles/ directory.
Particles.zip (Size: 136.69 KB / Downloads: 184)