#encoding:utf-8
#==============================================================================
# ■ Spriteset_Weather
#------------------------------------------------------------------------------
# 天气效果(雨、风、雪)的精灵。在 Spriteset_Map 内部使用。
#==============================================================================
class Spriteset_Weather
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_accessor :type # 天气类型
attr_accessor :ox # 原点 X 坐标
attr_accessor :oy # 原点 Y 坐标
attr_reader :power # 强度
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
def initialize(viewport = nil)
@viewport = viewport
init_members
create_rain_bitmap
create_storm_bitmap
create_snow_bitmap
end
#--------------------------------------------------------------------------
# ● 初始化成员变量
#--------------------------------------------------------------------------
def init_members
@type = :none
@ox = 0
@oy = 0
@power = 0
@sprites = []
end
#--------------------------------------------------------------------------
# ● 释放
#--------------------------------------------------------------------------
def dispose
@sprites.each {|sprite| sprite.dispose }
@rain_bitmap.dispose
@storm_bitmap.dispose
@snow_bitmap.dispose
end
#--------------------------------------------------------------------------
# ● 粒子的颜色 1
#--------------------------------------------------------------------------
def particle_color1
Color.new(255, 255, 255, 192)
end
#--------------------------------------------------------------------------
# ● 粒子的颜色 2
#--------------------------------------------------------------------------
def particle_color2
Color.new(255, 255, 255, 96)
end
#--------------------------------------------------------------------------
# ● 生成天气“雨”的位图
#--------------------------------------------------------------------------
def create_rain_bitmap
@rain_bitmap = Bitmap.new(7, 42)
7.times {|i| @rain_bitmap.fill_rect(6-i, i*6, 1, 6, particle_color1) }
end
#--------------------------------------------------------------------------
# ● 生成天气“风”的位图
#--------------------------------------------------------------------------
def create_storm_bitmap
@storm_bitmap = Bitmap.new(34, 64)
32.times do |i|
@storm_bitmap.fill_rect(33-i, i*2, 1, 2, particle_color2)
@storm_bitmap.fill_rect(32-i, i*2, 1, 2, particle_color1)
@storm_bitmap.fill_rect(31-i, i*2, 1, 2, particle_color2)
end
end
#--------------------------------------------------------------------------
# ● 生成天气“雪”的位图
#--------------------------------------------------------------------------
def create_snow_bitmap
@snow_bitmap = Bitmap.new(6, 6)
@snow_bitmap.fill_rect(0, 1, 6, 4, particle_color2)
@snow_bitmap.fill_rect(1, 0, 4, 6, particle_color2)
@snow_bitmap.fill_rect(1, 2, 4, 2, particle_color1)
@snow_bitmap.fill_rect(2, 1, 2, 4, particle_color1)
end
#--------------------------------------------------------------------------
# ● 设置天气的强度
#--------------------------------------------------------------------------
def power=(power)
@power = power
(sprite_max - @sprites.size).times { add_sprite }
(@sprites.size - sprite_max).times { remove_sprite }
end
#--------------------------------------------------------------------------
# ● 获取精灵的最大数
#--------------------------------------------------------------------------
def sprite_max
(@power * 10).to_i
end
#--------------------------------------------------------------------------
# ● 添加精灵
#--------------------------------------------------------------------------
def add_sprite
sprite = Sprite.new(@viewport)
sprite.opacity = 0
@sprites.push(sprite)
end
#--------------------------------------------------------------------------
# ● 删除精灵
#--------------------------------------------------------------------------
def remove_sprite
sprite = @sprites.pop
sprite.dispose if sprite
end
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
update_screen
@sprites.each {|sprite| update_sprite(sprite) }
end
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update_screen
@viewport.tone.set(-dimness, -dimness, -dimness)
end
#--------------------------------------------------------------------------
# ● 获取灰暗度
#--------------------------------------------------------------------------
def dimness
(@power * 6).to_i
end
#--------------------------------------------------------------------------
# ● 更新精灵
#--------------------------------------------------------------------------
def update_sprite(sprite)
sprite.ox = @ox
sprite.oy = @oy
case @type
when :rain
update_sprite_rain(sprite)
when :storm
update_sprite_storm(sprite)
when :snow
update_sprite_snow(sprite)
end
create_new_particle(sprite) if sprite.opacity < 64
end
#--------------------------------------------------------------------------
# ● 更新精灵 “雨”
#--------------------------------------------------------------------------
def update_sprite_rain(sprite)
sprite.bitmap = @rain_bitmap
sprite.x -= 1
sprite.y += 6
sprite.opacity -= 12
end
#--------------------------------------------------------------------------
# ● 更新精灵 “风”
#--------------------------------------------------------------------------
def update_sprite_storm(sprite)
sprite.bitmap = @storm_bitmap
sprite.x -= 3
sprite.y += 6
sprite.opacity -= 12
end
#--------------------------------------------------------------------------
# ● 更新精灵 “雪”
#--------------------------------------------------------------------------
def update_sprite_snow(sprite)
sprite.bitmap = @snow_bitmap
sprite.x -= 1
sprite.y += 3
sprite.opacity -= 12
end
#--------------------------------------------------------------------------
# ● 生成新的粒子
#--------------------------------------------------------------------------
def create_new_particle(sprite)
sprite.x = rand(Graphics.width + 100) - 100 + @ox
sprite.y = rand(Graphics.height + 200) - 200 + @oy
sprite.opacity = 160 + rand(96)
end
end