lotu 0.1.16 → 0.1.18

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.16
1
+ 0.1.18
@@ -36,7 +36,6 @@ end
36
36
 
37
37
  # Let's subclass the Game class and write some code!
38
38
  class MyPortraits < Game
39
- use StalkerSystem, :stalk => [Actor, TextBox, Portrait, Object]
40
39
 
41
40
  def initialize
42
41
  # This will call the hooks:
@@ -80,10 +79,11 @@ class MyPortraits < Game
80
79
 
81
80
  # Create a TextBox so we can display a message on screen
82
81
  @info = TextBox.new
82
+
83
83
  # Add some text
84
84
  @info.text("Hello world!")
85
85
  @info.watch lambda{ "FPS: #{ fps }" }
86
- @info.watch( @systems[StalkerSystem] )
86
+
87
87
  # Add more text, but specify the color and size in pixels
88
88
  @info.text("Move the portraits around with arrow keys", :size => 16, :color => 0xff33ccff)
89
89
  end
@@ -26,7 +26,6 @@ class Lobo < Actor
26
26
  end
27
27
 
28
28
  class Cursors < Game
29
- use StalkerSystem, :stalk => [Actor, Cursor, TextBox, Lobo, Object]
30
29
 
31
30
  def load_resources
32
31
  with_path_from_file(__FILE__) do
@@ -102,14 +101,14 @@ class Cursors < Game
102
101
  # Create a TextBox with default option :size => 15
103
102
  @info = TextBox.new(:size => 15)
104
103
  @info.text("Press F1 to hide this text", :size => 24)
104
+
105
105
  # Watch the FPS, so we get a nice FPS report on the screen
106
106
  @info.watch(lambda{ "FPS: #{ fps }" }, :size => 20)
107
- # Watch the Stalker system, so we know how many objects of the
108
- # classes we specified up in "use StalkerSystem" are around
109
- @info.watch( @systems[StalkerSystem], :color => 0xff3ffccf )
107
+
110
108
  # We can change the size for a specific line of text
111
109
  @info.text("@cursor1 data:", :size => 20)
112
110
  @info.text("move with Mouse | click with LeftMouseButton")
111
+
113
112
  # And color
114
113
  @info.watch(@cursor1, :color => @cursor1.color)
115
114
 
@@ -6,8 +6,10 @@ require File.expand_path(LIB_PATH)
6
6
  include Lotu
7
7
  include Gosu
8
8
 
9
- class Box < Actor
10
- collides_as :box
9
+ class Painting < Actor
10
+ # available collision shapes include :circle and :box
11
+ # if no :shape is specified, :circle is assumed
12
+ collides_as :canvas, :shape => :box
11
13
 
12
14
  def initialize( opts )
13
15
  # It's important to call super so we take advantage of automatic
@@ -16,7 +18,14 @@ class Box < Actor
16
18
  # Use the image which filename is "lobo_tuerto.png", and scale
17
19
  # it's size to half width and half height
18
20
  set_image 'lobo_tuerto.png', :factor_x => 0.5, :factor_y => 0.5
19
- calc_radius
21
+ end
22
+
23
+ # if you want to try the :shape => :circle thing
24
+ # you are going to need a function that specifies
25
+ # the collision radius called:
26
+
27
+ def collision_radius
28
+ @width / 2.0 * @factor_x
20
29
  end
21
30
 
22
31
  # Let's define some basic movement methods
@@ -28,12 +37,10 @@ end
28
37
 
29
38
  class Example < Game
30
39
  use CollisionSystem
31
- use StalkerSystem, :stalk => [Game, Box, Actor, BaseSystem, Object]
32
40
 
33
41
  def initialize
34
42
  super
35
- set_keys(KbEscape => :close,
36
- KbD => [:debug!, false])
43
+ set_keys(KbEscape => :close, KbD => [:debug!, false])
37
44
  end
38
45
 
39
46
  # This method is called when we call super inside initialize
@@ -46,7 +53,7 @@ class Example < Game
46
53
  end
47
54
 
48
55
  def setup_events
49
- when_colliding( :box, :box ) do |b1, b2|
56
+ when_colliding( :canvas, :canvas ) do |b1, b2|
50
57
  b1.color = Gosu::Color.from_hsv(rand(360), 1, 1)
51
58
  b2.color = Gosu::Color.from_hsv(rand(360), 1, 1)
52
59
  end
@@ -55,7 +62,7 @@ class Example < Game
55
62
  # This method is called when we call super inside initialize
56
63
  def setup_actors
57
64
  # Create a portrait in the middle of the screen
58
- @lobo1 = Box.new(:x => width/2 - 100, :y => height/2)
65
+ @lobo1 = Painting.new(:x => width/2 - 100, :y => height/2)
59
66
  # Map keys to some methods
60
67
  @lobo1.set_keys(KbRight => :move_right,
61
68
  KbLeft => :move_left,
@@ -63,18 +70,19 @@ class Example < Game
63
70
  KbDown => :move_down)
64
71
 
65
72
  # Rinse and repeat... but invert some keys
66
- @lobo2 = Box.new(:x => width/2 + 100, :y => height/2)
73
+ @lobo2 = Painting.new(:x => width/2 + 100, :y => height/2)
67
74
  @lobo2.set_keys(KbRight => :move_left,
68
75
  KbLeft => :move_right,
69
- KbUp => :move_up,
70
- KbDown => :move_down)
76
+ KbUp => :move_down,
77
+ KbDown => :move_up)
71
78
 
72
79
  # Create a TextBox so we can display a message on screen
73
80
  @info = TextBox.new
81
+
74
82
  # Add some text
75
83
  @info.text("Hello world!")
76
84
  @info.watch lambda{ "FPS: #{ fps }" }
77
- @info.watch( @systems[StalkerSystem] )
85
+
78
86
  # Add more text, but specify the color and size in pixels
79
87
  @info.text("Move the portraits around with arrow keys", :size => 16, :color => 0xff33ccff)
80
88
  end
@@ -15,6 +15,7 @@ include Lotu
15
15
  # control it's movement
16
16
  class Missile < Actor
17
17
  use SteeringSystem
18
+ use AnimationSystem
18
19
 
19
20
  def teleport(x, y)
20
21
  @pos.x, @pos.y = x, y
@@ -23,7 +24,6 @@ end
23
24
 
24
25
  # The main app class
25
26
  class SteeringMissiles < Game
26
- use StalkerSystem, :stalk => [Actor, Missile, Vector2d, Object]
27
27
 
28
28
  # Let's load some images and animations, check out the animations
29
29
  # directory, the animation there was created with:
@@ -59,7 +59,6 @@ class SteeringMissiles < Game
59
59
  @window_info = TextBox.new(:size => 15)
60
60
  @window_info.text("Press F1 to hide this text", :size => 24)
61
61
  @window_info.watch(lambda{ "FPS: #{fps}" }, :size => 20)
62
- @window_info.watch( @systems[StalkerSystem], :color => 0xff33ccff)
63
62
  @window_info.watch(@cursor, :color => @cursor.color)
64
63
  @window_info.text("Click to start the simulation", :color => 0xffffff00)
65
64
  @window_info.text("One will pursuit while the other evades, right click to center evader on screen")
@@ -15,6 +15,7 @@ include Lotu
15
15
  # control it's movement
16
16
  class Missile < Actor
17
17
  use SteeringSystem
18
+ use AnimationSystem
18
19
 
19
20
  def teleport(x, y)
20
21
  @pos.x, @pos.y = x, y
@@ -23,7 +24,6 @@ end
23
24
 
24
25
  # The main app class
25
26
  class EvadeMultiple < Game
26
- use StalkerSystem, :stalk => [Actor, Missile, Vector2d, Object]
27
27
 
28
28
  # Let's load some images and animations, check out the animations
29
29
  # directory, the animation there was created with:
@@ -63,7 +63,6 @@ class EvadeMultiple < Game
63
63
  @window_info = TextBox.new(:size => 15)
64
64
  @window_info.text("Press F1 to hide this text", :size => 24)
65
65
  @window_info.watch(lambda{ "FPS: #{fps}" }, :size => 20)
66
- @window_info.watch( @systems[StalkerSystem], :color => 0xff33ccff)
67
66
  @window_info.watch(@cursor, :color => @cursor.color)
68
67
  @window_info.text("Click to start the simulation", :color => 0xffffff00)
69
68
  @window_info.text("Little missiles will pursuit while the big one evades, right click to center big one on screen")
data/lib/lotu/actor.rb CHANGED
@@ -1,14 +1,12 @@
1
1
  module Lotu
2
2
  class Actor
3
- extend Behavior
3
+ include Lotu::Helpers::Util
4
+ extend Lotu::Behavior
4
5
 
5
- behave_like SystemUser
6
- use AnimationSystem
7
- use InterpolationSystem
8
-
9
- behave_like Eventful
10
- behave_like Collidable
11
- behave_like Controllable
6
+ behave_like Lotu::SystemUser
7
+ behave_like Lotu::Eventful
8
+ behave_like Lotu::Collidable
9
+ behave_like Lotu::Controllable
12
10
 
13
11
  attr_accessor :parent, :x, :y,
14
12
  :z, :angle, :center_x, :center_y,
@@ -16,6 +14,9 @@ module Lotu
16
14
  :width, :height
17
15
 
18
16
  def initialize(opts={})
17
+ # if debug is set, print out class info
18
+ class_debug_info
19
+
19
20
  default_opts = {
20
21
  :x => 0,
21
22
  :y => 0,
@@ -38,8 +39,11 @@ module Lotu
38
39
  @color = rand_color if opts[:rand_color]
39
40
  set_keys(opts[:keys]) unless opts[:keys].nil?
40
41
 
41
- # so it can start behaving
42
+ # start behaving as
42
43
  init_behavior opts
44
+
45
+ # if debug is set, print out instance info
46
+ instance_debug_info
43
47
  end
44
48
 
45
49
  # Easy access to delta-time
@@ -118,6 +122,9 @@ module Lotu
118
122
 
119
123
  # Remove ourselves from the update queue
120
124
  def die
125
+ # to call die on behaviors (that in turn wil call
126
+ # die on systems, for example)
127
+ super
121
128
  @parent.kill_me(self)
122
129
  end
123
130
 
data/lib/lotu/behavior.rb CHANGED
@@ -2,17 +2,15 @@ module Lotu
2
2
  module Behavior
3
3
 
4
4
  def behave_like something
5
+ include something
5
6
  class << self
6
7
  attr_accessor :behavior_options
7
8
  end
8
- include something
9
-
10
- @behavior_options ||= Hash.new{ |h,k| h[k] = {} }
9
+ @behavior_options ||= Hash.new
11
10
  end
12
11
 
13
12
  def inherited subclass
14
- subclass.behavior_options =
15
- behavior_options.inject({}){ |hash, opts| hash[opts[0]] = opts[1].deep_copy; hash }
13
+ subclass.behavior_options = behavior_options.deep_copy
16
14
  end
17
15
 
18
16
  end
@@ -1,6 +1,8 @@
1
1
  module Lotu
2
2
  module Collidable
3
3
 
4
+ attr_accessor :collision_tags
5
+
4
6
  def self.included base
5
7
  base.extend ClassMethods
6
8
  end
@@ -17,30 +19,52 @@ module Lotu
17
19
 
18
20
  def init_behavior opts
19
21
  super if defined? super
22
+ @collision_tags = self.class.behavior_options[Collidable]
23
+ setup_tags
24
+ end
20
25
 
21
- calc_radius
22
- class << self
23
- attr_accessor :collision_radius
24
- end
25
-
26
- @collision_tag = self.class.behavior_options[Collidable]
26
+ def setup_tags
27
27
  # TODO: Change @parent for @manager (could be a Game or a Scene)
28
- @parent.systems[CollisionSystem].add_entity(self, @collision_tag) if @parent.systems[CollisionSystem]
28
+ @collision_tags.each do |tag, opts|
29
+ @parent.systems[CollisionSystem].add_entity(self, tag) if @parent.systems[CollisionSystem]
30
+ end if @collision_tags
29
31
  end
30
32
 
31
- def collides_with(other)
33
+ def collides_with?(other, tag)
32
34
  return false if self.equal? other
33
- Gosu.distance(@x, @y, other.x, other.y) < @collision_radius + other.collision_radius
35
+ strategy = self.class.behavior_options[Collidable][tag][:shape]
36
+ send(strategy, other)
37
+ end
38
+
39
+ def box other
40
+ # horizontal checks
41
+ return false if @x > other.x + other.width * other.factor_x
42
+ return false if @x + width * @factor_x < other.x
43
+
44
+ # vertical checks
45
+ return false if @y > other.y + other.height * other.factor_y
46
+ return false if @y + height * @factor_y < other.y
47
+ true
48
+ end
49
+
50
+ def circle other
51
+ # distance between them is smaller than the sum of their radii?
52
+ Gosu.distance(@x, @y, other.x, other.y) < collision_radius + other.collision_radius
34
53
  end
35
54
 
36
55
  def die
37
- super
38
- @parent.systems[CollisionSystem].remove_entity(self, @collision_tag) if @parent.systems[CollisionSystem]
56
+ super if defined? super
57
+ @collision_tags.each do |tag, options|
58
+ @parent.systems[CollisionSystem].remove_entity(self, tag) if @parent.systems[CollisionSystem]
59
+ end if @collision_tags
39
60
  end
40
61
 
41
62
  module ClassMethods
42
- def collides_as tag
43
- behavior_options[Collidable] = tag
63
+ def collides_as tag, opts={}
64
+ default_opts = { :shape => :circle }
65
+ opts = default_opts.merge!(opts)
66
+ behavior_options[Collidable] ||= Hash.new
67
+ behavior_options[Collidable][tag] = opts
44
68
  end
45
69
  end
46
70
 
@@ -41,6 +41,7 @@ module Lotu
41
41
  # Allows to activate a system in the host
42
42
  module ClassMethods
43
43
  def use( klass, opts={} )
44
+ behavior_options[SystemUser] ||= Hash.new
44
45
  behavior_options[SystemUser][klass] = opts
45
46
  end
46
47
  end
data/lib/lotu/cursor.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  # Provides a mouse pointer usable through mouse or keyboard
2
2
  module Lotu
3
3
  class Cursor < Actor
4
+ use InterpolationSystem
5
+
4
6
  attr_reader :clicked_x, :clicked_y
5
7
  attr_accessor :speed, :use_mouse
6
8
 
data/lib/lotu/game.rb CHANGED
@@ -1,36 +1,54 @@
1
1
  module Lotu
2
2
  class Game < Gosu::Window
3
- extend Behavior
3
+ include Lotu::Helpers::Util
4
+ extend Lotu::Behavior
4
5
 
5
- behave_like SystemUser
6
- use InputManagerSystem
6
+ behave_like Lotu::SystemUser
7
+ use Lotu::InputManagerSystem
7
8
 
8
- behave_like ResourceManager
9
+ behave_like Lotu::ResourceManager
9
10
 
10
- # Accessors for elapsed time since last update (time delta) and fonts
11
- attr_reader :dt
11
+ # Accessors for elapsed time since last update (time delta) and debug
12
+ attr_reader :dt, :debug
12
13
  # Accessors for queues
13
14
  attr_accessor :update_queue, :draw_queue, :input_listeners
14
15
 
15
16
  def initialize(opts={})
17
+ # parse and merge options passed from
18
+ # the CLI (Command Line Interface)
19
+ # CLI options have the greatest precedence
20
+ if opts[:parse_cli_options] || opts[:parse_cli_options].nil?
21
+ opts.merge!(parse_cli_options)
22
+ end
23
+
24
+ # set some sane default opts
16
25
  default_opts = {
17
26
  :width => 1024,
18
27
  :height => 768,
19
- :fullscreen => false
28
+ :fullscreen => false,
29
+ :debug => false
20
30
  }
31
+ # fill in any missing options using the defaults
21
32
  opts = default_opts.merge!(opts)
22
- super(opts[:width], opts[:height], opts[:fullscreen])
23
33
 
24
34
  # Handy global window variable
25
35
  $lotu = self
26
- @debug = opts[:debug] || false
36
+
37
+ # Game setup
38
+ @debug = opts[:debug]
27
39
  @pause = false
28
40
  setup_containers
29
41
 
42
+ # if debug is set, print out class info
43
+ class_debug_info
44
+
45
+ # call the Gosu::Window constructor
46
+ super(opts[:width], opts[:height], opts[:fullscreen])
47
+
30
48
  # For timer initialization
31
49
  @last_time = Gosu::milliseconds
32
50
 
33
- # so it can start behaving
51
+ # start behaving as
34
52
  init_behavior opts
35
53
 
36
54
  # Call hook methods
@@ -38,6 +56,9 @@ module Lotu
38
56
  setup_actors
39
57
  setup_input
40
58
  setup_events
59
+
60
+ # if debug is set, print out instance info
61
+ instance_debug_info
41
62
  end
42
63
 
43
64
  def fps
@@ -8,7 +8,7 @@ class String
8
8
  def yellow; colorize(self, "\e[1m\e[33m") end
9
9
  def blue; colorize(self, "\e[1m\e[34m") end
10
10
  def dark_blue; colorize(self, "\e[34m") end
11
- def pur; colorize(self, "\e[1m\e[35m") end
11
+ def purple; colorize(self, "\e[1m\e[35m") end
12
12
  def colorize(text, color_code) "#{color_code}#{text}\e[0m" end
13
13
 
14
14
  end
@@ -0,0 +1,64 @@
1
+ require 'optparse'
2
+
3
+ module Lotu
4
+ module Helpers
5
+ module Util
6
+
7
+ def class_debug_info
8
+ if $lotu.debug
9
+ puts "[#{self.class.to_s.green}] Behavior options: #{self.class.behavior_options}\n" if self.class.respond_to? :behavior_options
10
+ end
11
+ end
12
+
13
+ def instance_debug_info
14
+ if $lotu.debug
15
+ puts "[#{self.class.to_s.yellow}] Systems: #{systems.keys}\n" if systems
16
+ end
17
+ end
18
+
19
+ # As seen in: http://ruby.about.com/od/advancedruby/a/optionparser.htm
20
+ def parse_cli_options
21
+ # This hash will hold all of the options
22
+ # parsed from the command-line by
23
+ # OptionParser.
24
+ options = {}
25
+
26
+ optparse = OptionParser.new do|opts|
27
+ # Set a banner, displayed at the top
28
+ # of the help screen.
29
+ opts.banner = "Usage: #{$0} [options]"
30
+
31
+ # Define the options, and what they do
32
+ options[:debug] = false
33
+ opts.on( '-d', '--debug', 'Output debug info' ) do
34
+ options[:debug] = true
35
+ end
36
+
37
+ options[:fullscreen] = false
38
+ opts.on( '-f', '--fullscreen', 'Runs the game in fullscreen mode' ) do
39
+ options[:fullscreen] = true
40
+ end
41
+
42
+ # This displays the help screen, all programs are
43
+ # assumed to have this option.
44
+ opts.on( '-h', '--help', 'Display this screen' ) do
45
+ puts opts
46
+ exit
47
+ end
48
+ end
49
+
50
+ # Parse the command-line. Remember there are two forms
51
+ # of the parse method. The 'parse' method simply parses
52
+ # ARGV, while the 'parse!' method parses ARGV and removes
53
+ # any options found there, as well as any parameters for
54
+ # the options. What's left is the list of files to resize.
55
+ optparse.parse!
56
+
57
+ puts "Showing debug info".red if options[:debug]
58
+ puts "Running in fullscreen mode".red if options[:fullscreen]
59
+ options
60
+ end
61
+
62
+ end
63
+ end
64
+ end
@@ -24,7 +24,7 @@ module Lotu
24
24
  @actions.each do |tags, blk|
25
25
  @entities[tags[0]].each do |ent1|
26
26
  @entities[tags[1]].each do |ent2|
27
- blk.call(ent1, ent2) if ent1.collides_with(ent2)
27
+ blk.call(ent1, ent2) if ent1.collides_with?(ent2, tags[0])
28
28
  end
29
29
  end
30
30
  end
data/lib/lotu.rb CHANGED
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(LOTU_ROOT)
3
3
 
4
4
  require 'rubygems'
5
5
  require 'gosu'
6
- %w{vector2d string kernel}.each{|file| require "helpers/#{file}"}
6
+ %w{vector2d string kernel util}.each{|file| require "helpers/#{file}"}
7
7
  %w{resource_manager system_user collidable controllable eventful}.each{|file| require "behaviors/#{file}"}
8
8
  %w{base interpolation animation input_manager stalker collision steering}.map{|s| "#{s}_system"}.each{|file| require "systems/#{file}"}
9
9
  %w{behavior actor cursor text_box game}.each{|file| require file}
data/lotu.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{lotu}
8
- s.version = "0.1.16"
8
+ s.version = "0.1.18"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["lobo_tuerto"]
12
- s.date = %q{2011-02-24}
12
+ s.date = %q{2011-02-25}
13
13
  s.description = %q{lotu aims to bring an agile and simple game development framework to life. It provides useful abstractions so you can concentrate on developing your game.}
14
14
  s.email = %q{dev@lobotuerto.com}
15
15
  s.extra_rdoc_files = [
@@ -52,6 +52,7 @@ Gem::Specification.new do |s|
52
52
  "lib/lotu/game.rb",
53
53
  "lib/lotu/helpers/kernel.rb",
54
54
  "lib/lotu/helpers/string.rb",
55
+ "lib/lotu/helpers/util.rb",
55
56
  "lib/lotu/helpers/vector2d.rb",
56
57
  "lib/lotu/systems/animation_system.rb",
57
58
  "lib/lotu/systems/base_system.rb",
@@ -69,7 +70,7 @@ Gem::Specification.new do |s|
69
70
  ]
70
71
  s.homepage = %q{http://github.com/lobo-tuerto/lotu}
71
72
  s.require_paths = ["lib"]
72
- s.rubygems_version = %q{1.5.0}
73
+ s.rubygems_version = %q{1.5.2}
73
74
  s.summary = %q{A simple, agile Ruby game development framework.}
74
75
  s.test_files = [
75
76
  "examples/01_hello_world/moving_portraits.rb",
@@ -1,20 +1,54 @@
1
1
  require 'lotu'
2
2
 
3
3
  class Actress < Lotu::Actor
4
+ collides_as :actress_in_distress
4
5
  use Lotu::SteeringSystem
5
6
  end
6
7
 
8
+ class Fan < Actress
9
+ use Lotu::StalkerSystem
10
+ end
11
+
7
12
  describe "Actor" do
8
13
 
9
14
  before :each do
10
- @game = Lotu::Game.new
15
+ @game = Lotu::Game.new(:parse_cli_options => false)
11
16
  @actor = Lotu::Actor.new
12
17
  @actress = Actress.new
18
+ @fan = Fan.new
13
19
  @user = @actor
14
20
  end
15
21
 
16
22
  after :each do
17
23
  @actor.die
24
+ @actress.die
25
+ @fan.die
26
+ end
27
+
28
+ describe "When just created" do
29
+ it "should have the appropiate number of systems" do
30
+ @actor.systems.length.should be 0
31
+ end
32
+
33
+ it "should have the appropiate type of systems" do
34
+ @actor.systems.keys.should == []
35
+ end
36
+
37
+ it "should have the appropiate behavior options set" do
38
+ @actor.class.behavior_options.should == {}
39
+ end
40
+
41
+ it "#x == 0" do
42
+ @actor.x.should == 0
43
+ end
44
+
45
+ it "#y == 0" do
46
+ @actor.y.should == 0
47
+ end
48
+
49
+ it "#z == 0" do
50
+ @actor.z.should == 0
51
+ end
18
52
  end
19
53
 
20
54
  describe "Behavior" do
@@ -24,45 +58,58 @@ describe "Actor" do
24
58
  it_should_behave_like "controllable"
25
59
  end
26
60
 
27
- describe "Descendants" do
61
+ describe "Actor subclasses" do
62
+ before :each do
63
+ @user = @actress
64
+ end
65
+
66
+ describe "Behavior" do
67
+ it_should_behave_like "system user"
68
+ it_should_behave_like "eventful"
69
+ it_should_behave_like "collidable"
70
+ it_should_behave_like "controllable"
71
+ end
72
+
28
73
  it "should have a different object hash for behavior_options" do
29
- @actress.class.behavior_options[Actress].should_not be @actor.class.behavior_options[Lotu::Actor]
74
+ @user.class.behavior_options.should_not be @actor.class.behavior_options
30
75
  end
31
76
 
32
77
  it "should have different values in behavior_options" do
33
- @actress.class.behavior_options[Actress].should_not == @actor.class.behavior_options[Lotu::Actor]
78
+ @user.class.behavior_options.should_not == @actor.class.behavior_options
34
79
  end
35
- end
36
80
 
37
- it "should have the appropiate number of systems" do
38
- @actor.systems.length.should be 2
39
- end
81
+ describe "When just created" do
82
+ it "should have the appropiate number of systems" do
83
+ @user.systems.length.should be 1
84
+ end
40
85
 
41
- it "should have the appropiate type of systems" do
42
- @actor.systems.keys.should == [Lotu::AnimationSystem, Lotu::InterpolationSystem]
43
- end
86
+ it "should have the appropiate type of systems" do
87
+ @user.systems.keys.should == [Lotu::SteeringSystem]
88
+ end
44
89
 
45
- it "should have the appropiate behavior options set" do
46
- @actor.class.behavior_options.should == {Lotu::SystemUser=>{Lotu::AnimationSystem=>{}, Lotu::InterpolationSystem=>{}}, Lotu::Collidable=>{}}
47
- end
90
+ it "should have the appropiate behavior options set" do
91
+ @user.class.behavior_options.should == {Lotu::Collidable=>{:actress_in_distress=>{:shape=>:circle}},
92
+ Lotu::SystemUser=>{Lotu::SteeringSystem=>{}}}
93
+ end
48
94
 
49
- it{ @actor.should respond_to :x }
50
- it{ @actor.should respond_to :y }
51
- it{ @actor.should respond_to :parent }
52
- it{ @actor.should respond_to :color }
95
+ it "#x == 0" do
96
+ @user.x.should == 0
97
+ end
53
98
 
54
- describe "at creation" do
55
- it "#x == 0" do
56
- @actor.x.should == 0
57
- end
99
+ it "#y == 0" do
100
+ @user.y.should == 0
101
+ end
58
102
 
59
- it "#y == 0" do
60
- @actor.y.should == 0
103
+ it "#z == 0" do
104
+ @user.z.should == 0
105
+ end
61
106
  end
107
+ end
62
108
 
63
- it "#z == 0" do
64
- @actor.z.should == 0
65
- end
109
+ describe "Basic methods and properties" do
110
+ it{ @actor.should respond_to :x }
111
+ it{ @actor.should respond_to :y }
112
+ it{ @actor.should respond_to :parent }
113
+ it{ @actor.should respond_to :color }
66
114
  end
67
-
68
115
  end
@@ -5,14 +5,15 @@ describe "Game" do
5
5
  it_should_behave_like "resource manager"
6
6
 
7
7
  before :all do
8
- @game = Lotu::Game.new #:debug => true
8
+ @game = Lotu::Game.new(:parse_cli_options => false)
9
9
  @game.with_path_from_file(__FILE__) do |g|
10
10
  load_images '../../examples/media/images'
11
11
  end
12
-
13
12
  @user = @game
14
13
  end
15
14
 
15
+ it "should spec the collision system"
16
+
16
17
  it{ @game.should respond_to :update }
17
18
  it{ @game.should respond_to :draw }
18
19
  it{ @game.should respond_to :dt }
@@ -13,7 +13,7 @@ end
13
13
 
14
14
  shared_examples_for "collidable" do
15
15
  it{ @user.should be_kind_of Lotu::Collidable }
16
- it{ @user.should respond_to :collides_with }
16
+ it{ @user.should respond_to :collides_with? }
17
17
  describe "the user class" do
18
18
  it{ @user.class.should respond_to :collides_as }
19
19
  end
metadata CHANGED
@@ -1,20 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lotu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.16
5
- prerelease: !!null
4
+ version: 0.1.18
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - lobo_tuerto
9
- autorequire: !!null
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-02-24 00:00:00.000000000 -06:00
13
- default_executable: !!null
12
+ date: 2011-02-25 00:00:00.000000000 -06:00
13
+ default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: gosu
17
- requirement: &9788600 !ruby/object:Gem::Requirement
17
+ requirement: &23259460 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 0.7.27.1
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *9788600
25
+ version_requirements: *23259460
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rspec
28
- requirement: &9787880 !ruby/object:Gem::Requirement
28
+ requirement: &23258660 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: 2.5.0
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *9787880
36
+ version_requirements: *23258660
37
37
  description: lotu aims to bring an agile and simple game development framework to
38
38
  life. It provides useful abstractions so you can concentrate on developing your
39
39
  game.
@@ -79,6 +79,7 @@ files:
79
79
  - lib/lotu/game.rb
80
80
  - lib/lotu/helpers/kernel.rb
81
81
  - lib/lotu/helpers/string.rb
82
+ - lib/lotu/helpers/util.rb
82
83
  - lib/lotu/helpers/vector2d.rb
83
84
  - lib/lotu/systems/animation_system.rb
84
85
  - lib/lotu/systems/base_system.rb
@@ -97,7 +98,7 @@ files:
97
98
  has_rdoc: true
98
99
  homepage: http://github.com/lobo-tuerto/lotu
99
100
  licenses: []
100
- post_install_message: !!null
101
+ post_install_message:
101
102
  rdoc_options: []
102
103
  require_paths:
103
104
  - lib
@@ -114,9 +115,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
115
  - !ruby/object:Gem::Version
115
116
  version: '0'
116
117
  requirements: []
117
- rubyforge_project: !!null
118
- rubygems_version: 1.5.0
119
- signing_key: !!null
118
+ rubyforge_project:
119
+ rubygems_version: 1.5.2
120
+ signing_key:
120
121
  specification_version: 3
121
122
  summary: A simple, agile Ruby game development framework.
122
123
  test_files: