You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
1.8 KiB
83 lines
1.8 KiB
#
|
|
# Copyright (c) 2001 by Jim Menard <jimm@io.com>
|
|
#
|
|
# Released under the same license as Ruby. See
|
|
# http://www.ruby-lang.org/en/LICENSE.txt.
|
|
#
|
|
|
|
require 'singleton'
|
|
require 'TQt'
|
|
require 'Params'
|
|
require 'Cloud'
|
|
require 'Flock'
|
|
require 'Boid'
|
|
require 'Camera'
|
|
require 'Canvas'
|
|
|
|
class World < TQt::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 = TQt::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
|
|
|