class Silo < Actor collides_as :silo attr_accessor :stock def initialize(opts={}) super set_image 'silo-b.png', opts @factor = @width / @image.width @y = $lotu.height - @height/2 @z = ZOrder::Silo @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 @left_padding = 13 * @factor @right_padding = 24 * @factor @bottom_padding = 18 * @factor @missile_image_width = 26 @missile_animation_width = @missile_image_width * 20 / 15 @slot_width = platform_width/@platform_capacity end def collision_radius 50 end def platform_width @width - @left_padding - @right_padding 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 = PlayerMissile.new(:mass => @missile_conf[:mass], :max_force => @missile_conf[:force], :max_speed => @missile_conf[:speed], :width => @missile_image_width*@factor) missile.x = initial_place(missile) missile.y = @y + @height/2 - missile.height/2 - @bottom_padding missile.interpolate(missile, :y, :init => missile.y+20, :end => missile.y, :duration => 0.5) missile end def initial_place(missile) res = @x - @width/2 + @left_padding + 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 + @left_padding + missile.width/2 + i * @slot_width place_to_be += i/(@platform_capacity-1) * (@slot_width - missile.width) if missile.x > initial_place(missile) missile.x = initial_place(missile) end if missile.x > place_to_be missile.x -= @slot_width * dt / @load_time end if missile.x <= place_to_be missile.x = place_to_be end end end def launch_missile(x, y) if m = @platform.shift m.save_init_pos m.stop_interpolations target = Vector2d.new(x,y) m.align_to target m.target = target m.play_animation('missile.png', :width => @missile_animation_width*@factor) end 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