class Silo < Actor attr_accessor :stock def initialize(opts={}) super set_image 'silo2.png', opts @factor = @width / @image.width @y = $lotu.height - @height/2 @z = 5 @speed = opts[:speed] @platform = [] # How many missiles in stock? @stock = opts[:stock] # How many missiles on platform? @platform_capacity = Float(opts[:platform_capacity]) # Load one missile every n seconds @load_time = opts[:load_time] # Missiles configuration @missile_conf = { :force => opts[:missile_force] || 1000, :speed => opts[:missile_speed] || 1000, :mass => opts[:missile_mass] || 10 } # If negative, it adds some initial delay @elapsed_time = -2 # Platform configuration in pixels @head_width = 75 * @factor @tail_width = 35 * @factor @platform_height = 70 * @factor @missile_image_width = 22.0 @missile_animation_width = @missile_image_width * 20 / 15 @slot_width = platform_width/@platform_capacity end def platform_width @width - @head_width - @tail_width end def update super load_platform place_missiles end def load_platform if @platform.length < @platform_capacity && @stock > 0 @elapsed_time += dt while @platform.length < @platform_capacity && @elapsed_time >= @load_time && @stock > 0 @elapsed_time -= @load_time @platform.push(new_missile) @stock -= 1 end end end def new_missile missile = Missile.new(:mass => @missile_conf[:mass], :max_force => @missile_conf[:force], :max_speed => @missile_conf[:speed], :rand_color => true, :width => @missile_image_width*@factor) missile.pos.x = initial_place(missile) missile.pos.y = @y + @height/2 - missile.height/2 - @platform_height missile end def initial_place(missile) res = @x - @width/2 + @head_width + missile.width/2 + (@platform_capacity - 1) * @slot_width res += (@slot_width - missile.width) res -= @elapsed_time / @load_time * @slot_width res end def place_missiles @platform.each_with_index do |missile, i| place_to_be = @x - @width/2 + @head_width + missile.width/2 + i * @slot_width place_to_be += i/(@platform_capacity-1) * (@slot_width - missile.width) if missile.pos.x > initial_place(missile) missile.pos.x = initial_place(missile) end if missile.pos.x > place_to_be missile.pos.x -= @slot_width * dt / @load_time end if missile.pos.x <= place_to_be missile.pos.x = place_to_be end end end def launch_missile(x, y) if m = @platform.shift m.target = Vector2d.new(x,y) m.play_animation('missile.png', :width => @missile_animation_width*@factor) end end def move_left @x -= @speed * dt end def move_right @x += @speed * dt end def to_s ["@platform.length: #{@platform.length}", "Missiles in stock: #{@stock}", "Missiles on platform: #{@platform.length}", "Elapsed loading time: #{format '%.2f', @elapsed_time}", "Loading next missile in: #{format('%.2f', @load_time - @elapsed_time)}"] end end