New Particle Engine by Arevulopapo - arevulopapo - 06-21-2009
New Particle Engine
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)
New Particle Engine by Arevulopapo - Prof. Meow Meow - 11-11-2009
This sounds awesome.. Can we have a screenshot?
New Particle Engine by Arevulopapo - Bolt - 11-12-2009
The real question is, does this work in RMXP or RMVX?
If RMXP, I'm all over it ^_^
New Particle Engine by Arevulopapo - DerVVulfman - 11-12-2009
It's dated 2007, and has the prefix reading RMXP in our forum.
Enjoy, Bolt.
New Particle Engine by Arevulopapo - EJlol - 11-13-2009
just 2 days... and then there will be a new particle system :)
New Particle Engine by Arevulopapo - computerwizoo7 - 11-13-2009
I thought that it was a 2009 version!
oh well...
RE: New Particle Engine by Arevulopapo - Ahzoh - 07-29-2013
so..how do you use it? the script doesn't exactly show me where to put stuff. or I missed it
RE: New Particle Engine by Arevulopapo - DerVVulfman - 07-29-2013
Code: # Effects are called from "Script" command like this:
# $scene.effect(EVENT_ID, EFFECT, LOCK, X, Y)
And it mentions having to look at the spriteset map for a list of 'effects'
For example
$scene.effect(12, 'blue', 'event', 15, 8)
would place the blue particle effect (as listed in the Spriteset Map), around event 12. the effect is tied to the event ('event') rather than the spriteset itself (there are differences in how it behaves), and initially puts it over the event (again event 12) about 15 pixels off horizontally and 8 vertically.
RE: New Particle Engine by Arevulopapo - Ahzoh - 07-29-2013
i knew that part, i just didn't know where put that information(found where)
so where would i put this "$scene.effect" in the script? at the bottom?
RE: New Particle Engine by Arevulopapo - DerVVulfman - 07-29-2013
Oh.... it's called a script call.
When you make an event on the map, set the trigger to 'parallel process' (NOT 'autorun') and go to the right window in the screen to create a command. The 'third' page tab has a command called 'Script call' (bottom right).
From there, you enter your RGSS script command... namely that.
|