# # Copyright (c) 2001 by Jim Menard # # Released under the same license as Ruby. See # http://www.ruby-lang.org/en/LICENSE.txt. # require 'singleton' require 'Qt' require 'Params' require 'Cloud' require 'Flock' require 'Boid' require 'Camera' require 'Canvas' class World < Qt::Object slots 'slotMove()' include Singleton attr_accessor :canvas attr_reader :width, :height, :depth, :camera, :clouds, :flock def initialize super @width = $PARAMS['world_width'] @height = $PARAMS['world_height'] @depth = $PARAMS['world_depth'] @clouds = [] minAltitude = $PARAMS['cloud_min_altitude'] $PARAMS['cloud_count'].times { c = Cloud.new c.position = Point.new(rand(@width) - @width / 2, rand(@height) - @height / 2, rand(@depth - minAltitude) - @depth / 2 + minAltitude) @clouds << c } # Sort clouds by height so lower/darker shadows are drawn last @clouds.sort { |a, b| a.position.y <=> b.position.y } @flock = Flock.new $PARAMS['flock_boids'].times { b = Boid.new b.position = Point.new(rand(@width) - @width / 2, rand(@height) - @height / 2, rand(@depth) - @depth / 2) @flock.add(b) # flock will delete boid } @clock = Qt::Timer.new() connect(@clock, SIGNAL('timeout()'), self, SLOT('slotMove()')) @camera = Camera.new # Reads values from params setupTranslation() end # Should be called whenever camera or screen changes. def setupTranslation @canvas.update() if @canvas end def start @clock.start($PARAMS['world_sleep_millis']) end def slotMove @clouds.each { | c | c.move() } @flock.move() @canvas.update() if @canvas # Camera follow boid. # b = @flock.members.first # @camera.position = b.position # @camera.rotation = Graphics.rotations(b.vector) # @camera.zoom = 1.0 end end