moonpxi-nimo 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +15 -0
- data/Rakefile +47 -0
- data/VERSION +1 -0
- data/examples/bouncy.rb +101 -0
- data/examples/eventy.rb +19 -0
- data/examples/images/dg_classm32.png +0 -0
- data/examples/images/dg_dungeon32.png +0 -0
- data/examples/images/jeeklabs.png +0 -0
- data/examples/images/tcheco.png +0 -0
- data/examples/imagey.rb +82 -0
- data/examples/screeny.rb +80 -0
- data/examples/simplest.rb +23 -0
- data/examples/sounds/KDE-Sys-Log-Out.ogg +0 -0
- data/examples/sounds/k3b_error1.wav +0 -0
- data/examples/soundy.rb +40 -0
- data/examples/spritey.rb +90 -0
- data/lib/nimo.rb +35 -0
- data/lib/nimo/behavior/deflector.rb +39 -0
- data/lib/nimo/behavior/moveable.rb +33 -0
- data/lib/nimo/behavior/projectile.rb +23 -0
- data/lib/nimo/behavior/with_velocity.rb +28 -0
- data/lib/nimo/game_object.rb +58 -0
- data/lib/nimo/game_window.rb +59 -0
- data/lib/nimo/listeners/event_listener.rb +27 -0
- data/lib/nimo/listeners/input_listener.rb +70 -0
- data/lib/nimo/representations/image_representation.rb +18 -0
- data/lib/nimo/representations/object_representation.rb +67 -0
- data/lib/nimo/representations/quad_representation.rb +23 -0
- data/lib/nimo/representations/sprite_representation.rb +78 -0
- data/lib/nimo/representations/text_representation.rb +27 -0
- data/lib/nimo/screen.rb +103 -0
- data/lib/nimo/utils/game.rb +63 -0
- data/lib/nimo/utils/intersection.rb +30 -0
- data/lib/nimo/utils/object_extension.rb +17 -0
- data/lib/nimo/utils/resources.rb +51 -0
- data/nimo.gemspec +117 -0
- data/spec/nimo/behavior/deflector_spec.rb +51 -0
- data/spec/nimo/behavior/moveable_spec.rb +81 -0
- data/spec/nimo/behavior/projectile_spec.rb +34 -0
- data/spec/nimo/behavior/with_velocity_spec.rb +18 -0
- data/spec/nimo/game_object_spec.rb +169 -0
- data/spec/nimo/game_window_spec.rb +88 -0
- data/spec/nimo/listeners/event_listener_spec.rb +34 -0
- data/spec/nimo/listeners/input_listener_spec.rb +87 -0
- data/spec/nimo/representations/image_representation_spec.rb +41 -0
- data/spec/nimo/representations/object_representation_spec.rb +74 -0
- data/spec/nimo/representations/sprite_representation_spec.rb +73 -0
- data/spec/nimo/representations/text_representation_spec.rb +21 -0
- data/spec/nimo/screen_spec.rb +114 -0
- data/spec/nimo/utils/game_spec.rb +44 -0
- data/spec/nimo/utils/object_extension_spec.rb +21 -0
- data/spec/nimo/utils/resources_spec.rb +59 -0
- data/spec/spec_helper.rb +9 -0
- metadata +133 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe Nimo::GameWindow do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@game_window = Nimo::GameWindow.new("Test", 640, 480)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "(screen transition)" do
|
10
|
+
before(:each) do
|
11
|
+
@game_window.add_screen(:first, Nimo::Screen.new(:first, nil, nil))
|
12
|
+
@game_window.add_screen(:second, Nimo::Screen.new(:second, nil, nil))
|
13
|
+
@game_window.add_screen(:third, Nimo::Screen.new(:third, nil, nil))
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should have the first screen added as the current screen" do
|
17
|
+
@game_window.current_screen.id.should == :first
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should cycle through available screens" do
|
21
|
+
@game_window.go_to(:second)
|
22
|
+
@game_window.current_screen.id.should == :second
|
23
|
+
@game_window.go_to(:third)
|
24
|
+
@game_window.current_screen.id.should == :third
|
25
|
+
@game_window.go_to(:first)
|
26
|
+
@game_window.current_screen.id.should == :first
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should open and close a 'menu' screen" do
|
30
|
+
@game_window.open_menu(:second)
|
31
|
+
@game_window.current_screen.id.should == :second
|
32
|
+
@game_window.open_menu(:third)
|
33
|
+
@game_window.current_screen.id.should == :third
|
34
|
+
@game_window.close_menu
|
35
|
+
@game_window.current_screen.id.should == :second
|
36
|
+
@game_window.close_menu
|
37
|
+
@game_window.current_screen.id.should == :first
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should throw error if screen is not available" do
|
41
|
+
lambda { @game_window.go_to(:wrong_screen) }.should raise_error("There is no screen named wrong_screen")
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "(game loop)" do
|
47
|
+
it "should proxy updates and draws to current screen" do
|
48
|
+
mock_screen = new_mock_screen("screen")
|
49
|
+
|
50
|
+
expect(:update, mock_screen)
|
51
|
+
expect(:draw, mock_screen)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should proxy draws to background screens" do
|
55
|
+
mock_screen1 = new_mock_screen("mock1")
|
56
|
+
mock_screen2 = new_mock_screen("mock2")
|
57
|
+
|
58
|
+
@game_window.open_menu("mock2")
|
59
|
+
|
60
|
+
expect(:update, mock_screen2)
|
61
|
+
expect(:draw, mock_screen1, mock_screen2)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should not proxy draw for background screen after closing the menu" do
|
65
|
+
mock_screen1 = new_mock_screen("mock1")
|
66
|
+
mock_screen2 = new_mock_screen("mock2")
|
67
|
+
|
68
|
+
@game_window.open_menu("mock2")
|
69
|
+
@game_window.close_menu
|
70
|
+
|
71
|
+
expect(:update, mock_screen1)
|
72
|
+
expect(:draw, mock_screen1)
|
73
|
+
end
|
74
|
+
|
75
|
+
def new_mock_screen(name)
|
76
|
+
mock_screen = mock(name)
|
77
|
+
mock_screen.should_receive(:notify).once
|
78
|
+
@game_window.add_screen(name, mock_screen)
|
79
|
+
return mock_screen
|
80
|
+
end
|
81
|
+
|
82
|
+
def expect(method_name, *instances)
|
83
|
+
instances.each { |instance| instance.should_receive(method_name) }
|
84
|
+
@game_window.send(method_name)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe "Nimo::EventListener module" do
|
4
|
+
|
5
|
+
class SomeEventListener
|
6
|
+
include Nimo::EventListener
|
7
|
+
attr_accessor :was_notified
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@was_notified = false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should register and execute event" do
|
15
|
+
listener = new_listener(:an_event)
|
16
|
+
|
17
|
+
listener.notify(:an_event)
|
18
|
+
listener.was_notified.should be_true
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should not execute action for different event" do
|
22
|
+
listener = new_listener(:an_event)
|
23
|
+
|
24
|
+
listener.notify(:another_event)
|
25
|
+
listener.was_notified.should be_false
|
26
|
+
end
|
27
|
+
|
28
|
+
def new_listener(event)
|
29
|
+
listener = SomeEventListener.new
|
30
|
+
listener.listen_to(event) { listener.was_notified = true }
|
31
|
+
return listener
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe "Nimo::InputListener module" do
|
4
|
+
|
5
|
+
class SomeInputListener
|
6
|
+
include Nimo::InputListener
|
7
|
+
attr_reader :num_of_updates
|
8
|
+
|
9
|
+
def initialize(acting_upon = self)
|
10
|
+
@num_of_updates = 0
|
11
|
+
@acting_upon = acting_upon
|
12
|
+
end
|
13
|
+
|
14
|
+
def act_upon
|
15
|
+
@acting_upon
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
before(:each) do
|
20
|
+
@mock_window = mock("game window")
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "(key actions)" do
|
24
|
+
it "should not execute key event when key was not pressed" do
|
25
|
+
listener = new_listener(false)
|
26
|
+
listener.process_inputs(@mock_window)
|
27
|
+
|
28
|
+
listener.num_of_updates.should == 0
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should execute key event when key is pressed" do
|
32
|
+
listener = new_listener(true)
|
33
|
+
listener.process_inputs(@mock_window)
|
34
|
+
|
35
|
+
listener.num_of_updates.should == 1
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should execute key event multiple times when it is repeatable" do
|
39
|
+
listener = new_listener(true)
|
40
|
+
2.times { listener.process_inputs(@mock_window) }
|
41
|
+
|
42
|
+
listener.num_of_updates.should == 2
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should execute non repeatable key event once before clearing the button" do
|
46
|
+
listener = new_listener(true, :repeatable => false)
|
47
|
+
2.times { listener.process_inputs(@mock_window) }
|
48
|
+
|
49
|
+
listener.num_of_updates.should == 1
|
50
|
+
end
|
51
|
+
|
52
|
+
def new_listener(is_button_down, options = {})
|
53
|
+
@mock_window.should_receive(:button_down?).with(Gosu::Button::KbLeft).at_least(1).and_return(is_button_down)
|
54
|
+
listener = SomeInputListener.new
|
55
|
+
listener.when_key(Gosu::Button::KbLeft, options) { @num_of_updates += 1 }
|
56
|
+
return listener
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "(any key actions)" do
|
61
|
+
it "should execute the 'any key' action when any button is pressed" do
|
62
|
+
was_called = false
|
63
|
+
listener = SomeInputListener.new(nil)
|
64
|
+
listener.any_key { was_called = true }
|
65
|
+
|
66
|
+
listener.button_down(nil)
|
67
|
+
|
68
|
+
was_called.should be_true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "(acting upon an external object)" do
|
73
|
+
it "should act upon an external object" do
|
74
|
+
external = Struct.new(:count).new
|
75
|
+
external.count = 0
|
76
|
+
|
77
|
+
@mock_window.should_receive(:button_down?).with(Gosu::Button::KbLeft).and_return(true)
|
78
|
+
listener = SomeInputListener.new(external)
|
79
|
+
listener.when_key(Gosu::Button::KbLeft, options) { self.count += 1 }
|
80
|
+
|
81
|
+
listener.process_inputs(@mock_window)
|
82
|
+
|
83
|
+
external.count.should == 1
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe Nimo::ImageRepresentation do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@resources = mock("resources")
|
7
|
+
@image_file = mock("image file")
|
8
|
+
@game_object = Nimo::GameObject.new(:x => 0, :y => 0, :width => 10, :height => 10)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should load image from resources and draw it" do
|
12
|
+
expect_image_access(:some_file_tag, @image_file)
|
13
|
+
representation = load_representation(:image => :some_file_tag)
|
14
|
+
|
15
|
+
@image_file.should_receive(:draw)
|
16
|
+
representation.draw
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should load image from tile resource and draw it" do
|
20
|
+
expect_image_access(:some_file_tag, [nil, @image_file, nil])
|
21
|
+
representation = load_representation(:image => :some_file_tag, :index => 1)
|
22
|
+
|
23
|
+
@image_file.should_receive(:draw)
|
24
|
+
representation.draw
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should raise exception when loading with a missing :image param" do
|
28
|
+
lambda { load_representation({}) }.should raise_error("Must provide :image param for image loading")
|
29
|
+
end
|
30
|
+
|
31
|
+
def load_representation(params)
|
32
|
+
representation = Nimo::ImageRepresentation.new(nil, @game_object)
|
33
|
+
representation.load(@resources, params)
|
34
|
+
return representation
|
35
|
+
end
|
36
|
+
|
37
|
+
def expect_image_access(tag, image)
|
38
|
+
@resources.should_receive(:image).with(tag).and_return(image)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe Nimo::ObjectRepresentation do
|
4
|
+
|
5
|
+
describe "(always actions)" do
|
6
|
+
it "should execute registered update event" do
|
7
|
+
was_updated = false
|
8
|
+
representation = Nimo::ObjectRepresentation.new(nil, nil)
|
9
|
+
representation.always { was_updated = true }
|
10
|
+
|
11
|
+
representation.update
|
12
|
+
|
13
|
+
was_updated.should be_true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "(listener actions)" do
|
18
|
+
it "should execute action when receive notification" do
|
19
|
+
was_updated = false
|
20
|
+
mock_object = mock("object")
|
21
|
+
|
22
|
+
representation = Nimo::ObjectRepresentation.new(nil, mock_object)
|
23
|
+
mock_object.should_receive(:register_listener).with(:some_event, representation)
|
24
|
+
|
25
|
+
representation.listen_to(:some_event) { was_updated = true }
|
26
|
+
representation.notify(:some_event)
|
27
|
+
|
28
|
+
was_updated.should be_true
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should ignore event if not registered" do
|
32
|
+
was_updated = false
|
33
|
+
mock_object = mock("object")
|
34
|
+
|
35
|
+
representation = Nimo::ObjectRepresentation.new(nil, mock_object)
|
36
|
+
mock_object.should_receive(:register_listener).with(:some_event, representation)
|
37
|
+
|
38
|
+
representation.listen_to(:some_event) { was_updated = true }
|
39
|
+
representation.notify(:another_event)
|
40
|
+
|
41
|
+
was_updated.should be_false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "(observer actions)" do
|
46
|
+
it "observer called after actions" do
|
47
|
+
always_called = false
|
48
|
+
key_called = false
|
49
|
+
was_updated = false
|
50
|
+
|
51
|
+
mock_window = mock("game window")
|
52
|
+
mock_window.should_receive(:button_down?).with(Gosu::Button::KbLeft).and_return(true)
|
53
|
+
|
54
|
+
representation = Nimo::ObjectRepresentation.new(mock_window, nil)
|
55
|
+
representation.always { always_called = true }
|
56
|
+
representation.when_key(Gosu::Button::KbLeft) { key_called = true }
|
57
|
+
representation.with_observer { |rep, obj| was_updated = true }
|
58
|
+
|
59
|
+
representation.update
|
60
|
+
|
61
|
+
was_updated.should be_true
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "(exceptions for methods that should be overriden)" do
|
66
|
+
it "should raise exception when load was not override" do
|
67
|
+
lambda { Nimo::ObjectRepresentation.new(nil, nil).load(nil, nil) }.should raise_error("Load should be overriden by representation")
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should raise exception when draw was not override" do
|
71
|
+
lambda { Nimo::ObjectRepresentation.new(nil, nil).draw }.should raise_error("Draw should be overriden by representation")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe Nimo::SpriteRepresentation do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@mock_window = mock("game window")
|
7
|
+
mock_resources = mock("resources")
|
8
|
+
@tiles = [mock("sprite tile 1"), mock("sprite tile 2"), mock("sprite tile 3"), mock("sprite tile 4")]
|
9
|
+
|
10
|
+
mock_resources.should_receive(:image).with(:test_tiles).and_return(@tiles)
|
11
|
+
|
12
|
+
obj = Nimo::GameObject.new(:x => 0, :y => 0, :width => 20, :height => 20, :current_state => :state_one)
|
13
|
+
@sprite = Nimo::SpriteRepresentation.new(@mock_window, obj).
|
14
|
+
with_animation(:state_one, [0, 1]).
|
15
|
+
with_animation(:state_two, [2, 3], :loop => false)
|
16
|
+
@sprite.load(mock_resources, :image => :test_tiles)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should draw animation based on game object's current state" do
|
20
|
+
@tiles[0].should_receive(:draw).with(0, 0, 0)
|
21
|
+
@sprite.draw
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should draw the same frame when draw called before frame timeout" do
|
25
|
+
@tiles[0].should_receive(:draw).twice.with(0, 0, 0)
|
26
|
+
|
27
|
+
2.times { @sprite.draw }
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should cycle to the next frame of animation after the frame timeout" do
|
31
|
+
@tiles[0].should_receive(:draw).with(0, 0, 0)
|
32
|
+
@tiles[1].should_receive(:draw).with(0, 0, 0)
|
33
|
+
|
34
|
+
2.times { @sprite.draw; sleep 0.2 }
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should cycle to beginning if it loops animation (by default it should loop)" do
|
38
|
+
@tiles[0].should_receive(:draw).twice.with(0, 0, 0)
|
39
|
+
@tiles[1].should_receive(:draw).with(0, 0, 0)
|
40
|
+
|
41
|
+
3.times { @sprite.draw; sleep 0.2 }
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should change animation when changing state" do
|
45
|
+
@tiles[0].should_receive(:draw).with(0, 0, 0)
|
46
|
+
@tiles[2].should_receive(:draw).with(0, 0, 0)
|
47
|
+
|
48
|
+
@sprite.draw
|
49
|
+
@sprite.change_to(:state_two)
|
50
|
+
@sprite.draw
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should not change animation when game object changes to a state with no animation" do
|
54
|
+
@tiles[0].should_receive(:draw).twice.with(0, 0, 0)
|
55
|
+
|
56
|
+
@sprite.draw
|
57
|
+
@sprite.change_to(:state_none)
|
58
|
+
@sprite.draw
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should keep drawing last frame animation do not loop" do
|
62
|
+
@tiles[2].should_receive(:draw).with(0, 0, 0)
|
63
|
+
@tiles[3].should_receive(:draw).twice.with(0, 0, 0)
|
64
|
+
|
65
|
+
@sprite.change_to(:state_two)
|
66
|
+
3.times { @sprite.draw; sleep 0.2 }
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should raise exception when trying to load sprite with missing :image param" do
|
70
|
+
empty_resources = mock("resources")
|
71
|
+
lambda { @sprite.load(empty_resources, {}) }.should raise_error("Must provide :image param for sprite loading")
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe Nimo::TextRepresentation do
|
4
|
+
|
5
|
+
it "should raise exception when loading with a missing :image param" do
|
6
|
+
lambda { load_representation_with(:text => :some_text, :color => :some_color) }.should raise_error("Must provide :font param for font loading")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should raise exception when loading with a missing :color param" do
|
10
|
+
lambda { load_representation_with(:text => :some_text, :font => :some_font) }.should raise_error("Must provide :color param for font loading")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should raise exception when loading with a missing :text param" do
|
14
|
+
lambda { load_representation_with(:font => :some_font, :color => :some_color) }.should raise_error("Must provide :text param for font loading")
|
15
|
+
end
|
16
|
+
|
17
|
+
def load_representation_with(params)
|
18
|
+
Nimo::TextRepresentation.new(nil, nil).load(nil, params)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe Nimo::Screen do
|
4
|
+
|
5
|
+
it "should register and execute event" do
|
6
|
+
event_called = false
|
7
|
+
|
8
|
+
screen = Nimo::Screen.new(:id, nil, nil)
|
9
|
+
screen.listen_to(:on_enter) { event_called = true }
|
10
|
+
|
11
|
+
event_called.should == false
|
12
|
+
screen.notify(:on_enter)
|
13
|
+
event_called.should == true
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should register new representation" do
|
17
|
+
screen = Nimo::Screen.new(:id, nil, nil)
|
18
|
+
screen.respond_to?(:new_representation).should be_false
|
19
|
+
|
20
|
+
Nimo::Screen.register_representation(:new_representation, nil)
|
21
|
+
|
22
|
+
screen.respond_to?(:new_representation).should be_true
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "(loading representations)" do
|
26
|
+
before(:each) do
|
27
|
+
@representation_class = mock("representation class")
|
28
|
+
@representation = mock("representation")
|
29
|
+
@representation_class.should_receive(:new).and_return(@representation)
|
30
|
+
@screen = Nimo::Screen.new(:id, nil, nil)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should load representation using the :with params" do
|
34
|
+
with_params = { :blah => "something" }
|
35
|
+
@representation.should_receive(:load).with(nil, with_params)
|
36
|
+
@screen.add(@representation_class, {:with => with_params})
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should forward updates and draws to representations" do
|
40
|
+
@representation.should_receive(:load).with(nil, {})
|
41
|
+
@screen.add(@representation_class, {})
|
42
|
+
|
43
|
+
@representation.should_receive(:update)
|
44
|
+
@screen.update
|
45
|
+
|
46
|
+
@representation.should_receive(:draw)
|
47
|
+
@screen.draw
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "(timer events)" do
|
52
|
+
it "should not execute timer action before it's time" do
|
53
|
+
was_called = false
|
54
|
+
|
55
|
+
screen = screen_with_timer(100) { was_called = true }
|
56
|
+
screen.update
|
57
|
+
|
58
|
+
was_called.should be_false
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should execute timer action only once" do
|
62
|
+
number_of_executions = 0
|
63
|
+
|
64
|
+
screen = screen_with_timer(0.1) { number_of_executions += 1 }
|
65
|
+
sleep 0.2
|
66
|
+
5.times { screen.update }
|
67
|
+
|
68
|
+
number_of_executions.should == 1
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should define and execute multiple timers" do
|
72
|
+
first_called = second_called = false
|
73
|
+
|
74
|
+
screen = screen_with_timer(0.1) { first_called = true }
|
75
|
+
screen.timer_for(0.1) { second_called = true }
|
76
|
+
|
77
|
+
sleep 0.2
|
78
|
+
screen.update
|
79
|
+
|
80
|
+
first_called.should be_true
|
81
|
+
second_called.should be_true
|
82
|
+
end
|
83
|
+
|
84
|
+
def screen_with_timer(delay, &action)
|
85
|
+
screen = Nimo::Screen.new(:id, nil, nil)
|
86
|
+
screen.timer_for(delay, &action)
|
87
|
+
return screen
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "(forwarding screen transition methods to game window)" do
|
93
|
+
[:go_to, :open_menu, :close_menu].each do |method_name|
|
94
|
+
it "should forward #{method_name} method to game_window" do
|
95
|
+
mock_window = mock("window")
|
96
|
+
mock_window.should_receive(method_name)
|
97
|
+
|
98
|
+
Nimo::Screen.new(:id, mock_window, nil).send(method_name)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "(forwarding resource usage methods to resources)" do
|
104
|
+
[:sounds, :images, :fonts].each do |method_name|
|
105
|
+
it "should forward #{method_name} method to game_window" do
|
106
|
+
resources = mock("resources")
|
107
|
+
resources.should_receive(method_name)
|
108
|
+
|
109
|
+
Nimo::Screen.new(:id, nil, resources).send(method_name)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|