summaryrefslogtreecommitdiffstats
path: root/qtruby/rubylib/examples/ruboids/ruboids/World.rb
diff options
context:
space:
mode:
Diffstat (limited to 'qtruby/rubylib/examples/ruboids/ruboids/World.rb')
-rw-r--r--qtruby/rubylib/examples/ruboids/ruboids/World.rb82
1 files changed, 82 insertions, 0 deletions
diff --git a/qtruby/rubylib/examples/ruboids/ruboids/World.rb b/qtruby/rubylib/examples/ruboids/ruboids/World.rb
new file mode 100644
index 00000000..17608bca
--- /dev/null
+++ b/qtruby/rubylib/examples/ruboids/ruboids/World.rb
@@ -0,0 +1,82 @@
+#
+# 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 '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
+