mkxp/scripts/Particles.rb

110 lines
2.2 KiB
Ruby
Raw Normal View History

2015-11-17 20:35:51 +00:00
class Particle
def initialize(viewport, bitmap)
@sprite = Sprite.new(viewport)
@sprite.bitmap = bitmap
@sprite.ox = bitmap.width / 2
@sprite.oy = bitmap.height / 2
self.x = rand(640)
self.y = rand(480)
end
# Link various things to the sprite
def x
@x
end
def x=(val)
@x = val
width = @sprite.bitmap.width * @sprite.zoom_x
if @x < -width
@x = 640 + width
elsif @x > 640 + width
@x = -width
end
@sprite.x = @x
end
def y
@y
end
def y=(val)
@y = val
height = @sprite.bitmap.height * @sprite.zoom_y
if @y < -height
@y = 480 + height
elsif @y > 480 + height
@y = -height
end
@sprite.y = @y
end
def scale
@sprite.zoom_x
end
def scale=(val)
@sprite.zoom_x = val
@sprite.zoom_y = val
end
def opacity
@sprite.opacity
end
def opacity=(val)
@sprite.opacity = val
end
def dispose
@sprite.dispose
@sprite = nil
end
end
class Particle_Firefly < Particle
@@bitmap = RPG::Cache.picture('firefly')
def initialize(viewport)
super(viewport, @@bitmap)
@phase = rand(120)
@wavelength = rand(120..240)
@vx = rand(0.2..1.5) * (rand(2) * 2 - 1)
@vy = rand(0.2..1.5) * (rand(2) * 2 - 1)
self.scale = rand(0.02..0.08)
end
def update
self.x += @vx
self.y += @vy
self.opacity = Math.sin((@phase / @wavelength.to_f) * Math::PI) * 255
@phase = (@phase + 1) % @wavelength
end
end
# A layer of moving particle objects, useful for fireflies and shrimp
class ParticleLayer
def initialize(viewport, klass, count)
@particles = Array.new(count)
count.times do |i|
@particles[i] = klass.new(viewport)
end
@last_map_x = $game_map.display_x / 4
@last_map_y = $game_map.display_y / 4
end
def update
return unless @particles
map_x = $game_map.display_x / 4
map_y = $game_map.display_y / 4
@particles.each do |p|
p.x += @last_map_x - map_x
p.y += @last_map_y - map_y
p.update
end
@last_map_x = map_x
@last_map_y = map_y
end
def dispose
return unless @particles
@particles.each do |p|
p.dispose
end
@particles = nil
end
end