Código:
#===============================================================================
# Nuevo Motor de Partículas
# por arevulopapo
# 15 de Nov de 2007
#
# Este script permite crear efectos de partículas en tu juego.
# Las partículas se integran en "Spriteset_Map,
# para poder ser mostradas sobre/bajo un evento.
# Los efectos son usados desde "Llamar script" de esta forma:
# $scene.effect(ID_EVENTO, EFECTO, LOCK, X, Y)
# ID_EVENTO - ID del evento en el que se moverán las partículas
# (-1) para el personaje, (1) y superior para los eventos.
# EFECTO - Nombre del efecto a llamar. Los nombres se definen en Spriteset_Map.
# LOCK - Alineación de las partículas. 'event' para alinear partículas
# con la posición del evento en el mapa, y 'screen' para alinear con la
# posición del evento en pantalla.
# Para eventos estáticos, como fireplaces, teletransportes, etc. se
# recomienda la alineación'event'.
# Para eventos en movimiento usa el modo 'screen'.
# X, Y - Número de Píxeles que se añadirán a la posición del evento
# para determinar el punto inicial de partículas.
# esa es tu arma más poderosa;) Mira el demo para los ejemplos..
#===============================================================================
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