gamebox 0.4.1 → 0.5.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.
- checksums.yaml +7 -0
- data/README.md +3 -2
- data/gamebox.gemspec +1 -1
- data/lib/gamebox/actors/collidable_debugger.rb +3 -4
- data/lib/gamebox/actors/label.rb +2 -0
- data/lib/gamebox/actors/score.rb +4 -25
- data/lib/gamebox/behaviors/animated_with_spritemap.rb +97 -0
- data/lib/gamebox/behaviors/collidable.rb +6 -14
- data/lib/gamebox/behaviors/collidable/aabb_collidable.rb +2 -3
- data/lib/gamebox/behaviors/graphical.rb +2 -1
- data/lib/gamebox/behaviors/physical.rb +1 -1
- data/lib/gamebox/behaviors/positioned.rb +10 -4
- data/lib/gamebox/core/actor.rb +1 -1
- data/lib/gamebox/core/actor_factory.rb +2 -0
- data/lib/gamebox/core/arbiter.rb +2 -0
- data/lib/gamebox/core/font_style.rb +2 -2
- data/lib/gamebox/core/input_mapper.rb +4 -4
- data/lib/gamebox/core/resource_manager.rb +2 -2
- data/lib/gamebox/core/viewport.rb +78 -54
- data/lib/gamebox/spec/helper.rb +2 -3
- data/lib/gamebox/tasks/gamebox_tasks.rake +1 -90
- data/lib/gamebox/version.rb +2 -2
- data/lib/gamebox/views/graphical_actor_view.rb +11 -6
- data/spec/acceptance/input_mapper_spec.rb +14 -14
- data/spec/actors/label_spec.rb +13 -4
- data/spec/behaviors/collidable_spec.rb +2 -2
- data/spec/behaviors/positioned_spec.rb +27 -30
- data/spec/core/actor_spec.rb +2 -2
- data/spec/core/input_mapper_spec.rb +1 -1
- data/spec/core/resource_manager_spec.rb +20 -4
- data/spec/core/viewport_spec.rb +202 -108
- data/spec/views/graphical_actor_view_spec.rb +4 -1
- data/templates/app/Gemfile.tt +3 -1
- data/templates/app/Rakefile +51 -0
- data/templates/app/config/environment.rb +2 -1
- data/templates/app/config/game.yml +0 -1
- data/templates/app/spec/helper.rb +1 -1
- data/templates/app/src/views/.gitkeep +0 -0
- metadata +51 -97
data/lib/gamebox/spec/helper.rb
CHANGED
@@ -23,6 +23,7 @@ module GameboxSpecHelpers
|
|
23
23
|
before {
|
24
24
|
@_beh_mock_names = Behavior.object_definition.component_names
|
25
25
|
@actor = evented_stub(mock("actor_for_#{behavior_name}"))
|
26
|
+
@actor.stubs(has_attribute: nil, do_or_do_not: nil)
|
26
27
|
@_mocks_created = create_mocks *(@_beh_mock_names - [:actor])
|
27
28
|
@_mocks_created[:actor] = @actor
|
28
29
|
|
@@ -206,9 +207,7 @@ class EventedStub
|
|
206
207
|
def method_missing(name, *args)
|
207
208
|
@inner_stub.send name, *args
|
208
209
|
end
|
209
|
-
|
210
|
-
super
|
211
|
-
end
|
210
|
+
public :fire
|
212
211
|
end
|
213
212
|
|
214
213
|
module GameboxAcceptanceSpecHelpers
|
@@ -49,7 +49,7 @@ namespace :generate do
|
|
49
49
|
File.open(File.join(File.dirname(__FILE__), "../../..", "/templates/#{generator_name}_template.erb")) do |io|
|
50
50
|
template = ERB.new io.read
|
51
51
|
instance_variable_set("@#{generator_name}_name", args["#{generator_name}_name"])
|
52
|
-
File.open "#{APP_ROOT}src/#{ generator_name}s/#{args["#{generator_name}_name"]}
|
52
|
+
File.open "#{APP_ROOT}src/#{ generator_name}s/#{args["#{generator_name}_name"]}.rb", "w" do |out|
|
53
53
|
out.puts template.result binding
|
54
54
|
end
|
55
55
|
end
|
@@ -57,92 +57,3 @@ namespace :generate do
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
namespace :dist do
|
61
|
-
desc "Build a .app for your gamebox game"
|
62
|
-
task :mac do
|
63
|
-
GAME_NAME = "UntitledGame" unless defined?(GAME_NAME)
|
64
|
-
# DL template os x app
|
65
|
-
remote_file = "gosu-mac-wrapper-#{Gosu::VERSION}.tar.gz"
|
66
|
-
mac_build = "#{APP_ROOT}build/mac"
|
67
|
-
local_file = "#{mac_build}/#{remote_file}"
|
68
|
-
|
69
|
-
require 'net/http'
|
70
|
-
mkdir_p mac_build
|
71
|
-
# if false
|
72
|
-
Net::HTTP.start("www.libgosu.org") do |http|
|
73
|
-
resp = http.get("/downloads/#{remote_file}")
|
74
|
-
open(local_file, "wb") { |file| file.write(resp.body) }
|
75
|
-
end
|
76
|
-
# end
|
77
|
-
|
78
|
-
# Expand it
|
79
|
-
cd mac_build
|
80
|
-
`tar xzf #{remote_file}`
|
81
|
-
app_name = "#{GAME_NAME}.app"
|
82
|
-
contents = "#{app_name}/Contents"
|
83
|
-
resources = "#{contents}/Resources"
|
84
|
-
dot_app_lib = "#{resources}/lib"
|
85
|
-
gem_vendored = "#{mac_build}/#{resources}/gems"
|
86
|
-
|
87
|
-
mv 'RubyGosu App.app', app_name
|
88
|
-
%w(config data src).each do |src|
|
89
|
-
cp_r "../../#{src}", resources
|
90
|
-
end
|
91
|
-
|
92
|
-
# TODO remove chingu / chipmunk / etc
|
93
|
-
clean_em_out = %w(chingu chingu.rb).map{|it| "#{dot_app_lib}/#{it}"}
|
94
|
-
rm_rf clean_em_out#, :verbose => true, :noop => true
|
95
|
-
|
96
|
-
cd APP_ROOT
|
97
|
-
p `bundle --system package`
|
98
|
-
p `bundle package`
|
99
|
-
p `bundle --deployment`
|
100
|
-
mkdir_p gem_vendored
|
101
|
-
rejects = %w(chipmunk gosu)
|
102
|
-
Dir["vendor/bundle/ruby/**/gems/**/lib"].each do |gemmy|
|
103
|
-
cp_r gemmy, gem_vendored unless rejects.any?{|exclude| gemmy.match exclude}
|
104
|
-
end
|
105
|
-
|
106
|
-
cd mac_build
|
107
|
-
File.open "#{resources}/Main.rb", "w+" do |main|
|
108
|
-
main.puts <<-EOS
|
109
|
-
$: << "\#{File.dirname(__FILE__)}/config"
|
110
|
-
|
111
|
-
$: << "\#{File.dirname(__FILE__)}/gems/lib"
|
112
|
-
|
113
|
-
rejects = %w(spec src/app.rb vendor Main.rb)
|
114
|
-
ok_dirs = %w(config gems src)
|
115
|
-
REQUIRE_ALLS = ok_dirs.map{|dir| Dir.glob("\#{dir}/*.rb").reject{ |f| rejects.any?{|exclude| f.match exclude}}}.flatten
|
116
|
-
|
117
|
-
require 'environment'
|
118
|
-
|
119
|
-
GameboxApp.run ARGV, ENV
|
120
|
-
EOS
|
121
|
-
end
|
122
|
-
|
123
|
-
# modify plist file
|
124
|
-
# UntitledGame
|
125
|
-
cd "#{GAME_NAME}.app/Contents"
|
126
|
-
plist = File.open("Info.plist").read
|
127
|
-
File.open("Info.plist", 'w+') do |f|
|
128
|
-
f.puts plist.gsub "UntitledGame", GAME_NAME
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
task :win do
|
133
|
-
# create dist dir
|
134
|
-
FileUtils.mkdir "#{APP_ROOT}dist" unless File.exist? "dist"
|
135
|
-
# pull down windows app shell
|
136
|
-
# expand into place
|
137
|
-
sh 'cd #{APP_ROOT}dist; wget http://github.com/downloads/shawn42/gamebox/gamebox_app.zip; unzip gamebox_app.zip; mv gamebox_app/* .; rm gamebox_app.zip; rm -rf gamebox_app'
|
138
|
-
|
139
|
-
# copy config/src/lib/data into dist/src
|
140
|
-
%w{vendor config data }.each do |dir|
|
141
|
-
FileUtils.cp_r dir, File.join('dist','src', dir) if File.exist? dir
|
142
|
-
end
|
143
|
-
FileUtils.cp_r 'src', File.join('dist', 'src')
|
144
|
-
|
145
|
-
# create zip of dist?
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
data/lib/gamebox/version.rb
CHANGED
@@ -17,6 +17,14 @@ define_actor_view :graphical_actor_view do
|
|
17
17
|
x_scale = actor.do_or_do_not(:x_scale) || 1
|
18
18
|
y_scale = actor.do_or_do_not(:y_scale) || 1
|
19
19
|
|
20
|
+
anchor_x = 0.5
|
21
|
+
anchor_y = 0.5
|
22
|
+
anchor_point = actor.do_or_do_not(:anchor) || :center
|
23
|
+
if anchor_point == :top_left
|
24
|
+
anchor_x = 0
|
25
|
+
anchor_y = 0
|
26
|
+
end
|
27
|
+
|
20
28
|
if actor.do_or_do_not(:tiled)
|
21
29
|
x_tiles = actor.num_x_tiles
|
22
30
|
y_tiles = actor.num_y_tiles
|
@@ -25,16 +33,13 @@ define_actor_view :graphical_actor_view do
|
|
25
33
|
x_tiles.times do |col|
|
26
34
|
y_tiles.times do |row|
|
27
35
|
# TODO why is there a nasty black line between these that jitters?
|
36
|
+
# is it float precision vs integers for location?
|
28
37
|
img.draw offset_x+col*img_w, offset_y+row*img_h, z, x_scale, y_scale
|
29
38
|
end
|
30
39
|
end
|
31
40
|
else
|
32
|
-
rot = actor.do_or_do_not
|
33
|
-
|
34
|
-
img.draw_rot offset_x, offset_y, z, rot, 0.5, 0.5, x_scale, y_scale, color
|
35
|
-
else
|
36
|
-
img.draw offset_x, offset_y, z, x_scale, y_scale, color
|
37
|
-
end
|
41
|
+
rot = actor.do_or_do_not(:rotation) || 0
|
42
|
+
img.draw_rot offset_x, offset_y, z, rot, anchor_x, anchor_y, x_scale, y_scale, color
|
38
43
|
end
|
39
44
|
end
|
40
45
|
|
@@ -8,33 +8,33 @@ describe "Using input mapper", acceptance: true do
|
|
8
8
|
it 'sets actor state based on input' do
|
9
9
|
game.stage do |stage| # instance of TestingStage
|
10
10
|
foxy = create_actor :foxy
|
11
|
-
foxy.
|
12
|
-
|
13
|
-
|
11
|
+
foxy.controller.map_controls 'left' => :move_left,
|
12
|
+
'right' => :move_right,
|
13
|
+
'd' => :move_right
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
controller = game.actor(:foxy).controller
|
17
|
+
controller.move_left?.should be_false
|
18
|
+
controller.move_right?.should be_false
|
19
19
|
|
20
20
|
press_key KbLeft
|
21
21
|
press_key KbD
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
controller.move_left?.should be_true
|
24
|
+
controller.move_right?.should be_true
|
25
25
|
|
26
26
|
release_key KbD
|
27
|
-
|
28
|
-
|
27
|
+
controller.move_left?.should be_true
|
28
|
+
controller.move_right?.should be_false
|
29
29
|
|
30
30
|
|
31
31
|
press_key KbRight
|
32
|
-
|
33
|
-
|
32
|
+
controller.move_left?.should be_true
|
33
|
+
controller.move_right?.should be_true
|
34
34
|
|
35
35
|
release_key KbRight
|
36
|
-
|
37
|
-
|
36
|
+
controller.move_left?.should be_true
|
37
|
+
controller.move_right?.should be_false
|
38
38
|
end
|
39
39
|
|
40
40
|
end
|
data/spec/actors/label_spec.rb
CHANGED
@@ -12,10 +12,13 @@ describe :label do
|
|
12
12
|
describe "#behavior" do
|
13
13
|
subjectify_behavior(:label)
|
14
14
|
|
15
|
+
let(:stylish_font) { stub(calc_width: 22, height: 30) }
|
16
|
+
|
15
17
|
before do
|
16
|
-
@actor.stubs(has_attributes: nil, font_name: "fonty.ttf",
|
17
|
-
font_size: 22, color: :red)
|
18
|
+
@actor.stubs(has_attributes: nil, font_name: "fonty.ttf", text: "some text",
|
19
|
+
font_size: 22, color: :red, :width= => nil, :height= => nil)
|
18
20
|
@font_style_factory.stubs(:build)
|
21
|
+
@actor.stubs(:font_style).returns(stylish_font)
|
19
22
|
end
|
20
23
|
|
21
24
|
it 'sets up attributes on actor' do
|
@@ -27,8 +30,14 @@ describe :label do
|
|
27
30
|
width: 0,
|
28
31
|
height: 0,
|
29
32
|
layer: 1)
|
30
|
-
@font_style_factory.stubs(:build).with('fonty.ttf', 22, :red).returns(
|
31
|
-
@actor.expects(:has_attributes).with(font_style:
|
33
|
+
@font_style_factory.stubs(:build).with('fonty.ttf', 22, :red).returns(stylish_font)
|
34
|
+
@actor.expects(:has_attributes).with(font_style: stylish_font)
|
35
|
+
|
36
|
+
stylish_font.stubs(:calc_width).with("some text").returns(:some_stylish_width)
|
37
|
+
stylish_font.stubs(:height).returns(:some_stylish_height)
|
38
|
+
|
39
|
+
@actor.expects(:width=).with(:some_stylish_width)
|
40
|
+
@actor.expects(:height=).with(:some_stylish_height)
|
32
41
|
|
33
42
|
subject
|
34
43
|
end
|
@@ -22,12 +22,12 @@ describe :collidable do
|
|
22
22
|
let!(:actor) { subcontext[:actor] }
|
23
23
|
|
24
24
|
before do
|
25
|
-
@stage.stubs
|
25
|
+
@stage.stubs :register_collidable
|
26
26
|
end
|
27
27
|
|
28
28
|
describe "aabb shape" do
|
29
29
|
let(:opts) do
|
30
|
-
{:
|
30
|
+
{shape: :aabb,
|
31
31
|
:cw_world_points => [
|
32
32
|
[-15,10],[15,10],
|
33
33
|
[15,-10], [-15,10]
|
@@ -1,52 +1,49 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
describe :positioned do
|
4
|
+
subjectify_behavior :positioned
|
4
5
|
|
5
|
-
subject { subcontext[:behavior_factory].add_behavior actor, :positioned, opts }
|
6
|
-
let(:director) { evented_stub(stub_everything('director')) }
|
7
|
-
let(:subcontext) do
|
8
|
-
it = nil
|
9
|
-
Conject.default_object_context.in_subcontext{|ctx|it = ctx};
|
10
|
-
it[:director] = director
|
11
|
-
_mocks = create_mocks *(Actor.object_definition.component_names + ActorView.object_definition.component_names - [:actor, :behavior, :this_object_context])
|
12
|
-
_mocks.each do |k,v|
|
13
|
-
it[k] = v
|
14
|
-
end
|
15
|
-
it
|
16
|
-
end
|
17
|
-
let!(:actor) { subcontext[:actor] }
|
18
6
|
let(:opts) { {} }
|
7
|
+
before do
|
8
|
+
actor.stubs(:has_attributes)
|
9
|
+
end
|
19
10
|
|
20
11
|
context "empty options" do
|
21
|
-
it 'defines x,y on actor' do
|
12
|
+
it 'defines x,y,position on actor' do
|
13
|
+
actor.expects(:has_attributes).with(x: 0, y: 0, position: vec2(0,0))
|
22
14
|
subject
|
23
|
-
actor.x.should == 0
|
24
|
-
actor.y.should == 0
|
25
15
|
end
|
26
16
|
end
|
27
17
|
|
28
|
-
it '
|
18
|
+
it 'updates position on x change' do
|
29
19
|
subject
|
30
|
-
called = 0
|
31
|
-
actor.when(:position_changed) do
|
32
|
-
called += 1
|
33
|
-
end
|
34
|
-
actor.x = 99
|
35
|
-
called.should == 1
|
36
20
|
|
37
|
-
actor.
|
21
|
+
actor.expects(:position=).with(vec2(1,2))
|
22
|
+
actor.stubs(x: 1, y: 2)
|
23
|
+
actor.fire(:x_changed)
|
24
|
+
end
|
38
25
|
|
39
|
-
|
40
|
-
|
41
|
-
|
26
|
+
it 'updates position on y change' do
|
27
|
+
subject
|
28
|
+
|
29
|
+
actor.expects(:position=).with(vec2(1,2))
|
30
|
+
actor.stubs(x: 1, y: 2)
|
31
|
+
actor.fire(:y_changed)
|
42
32
|
end
|
43
33
|
|
44
34
|
context "options passed in" do
|
45
35
|
let(:opts) { { x: 5, y: 8} }
|
46
|
-
it 'defines x,y on actor' do
|
36
|
+
it 'defines x,y,position on actor' do
|
37
|
+
actor.expects(:has_attributes).with(x: 5, y: 8, position: vec2(5,8))
|
47
38
|
subject
|
48
|
-
actor.x.should == 5
|
49
|
-
actor.y.should == 8
|
50
39
|
end
|
51
40
|
end
|
41
|
+
|
42
|
+
it "keeps x and y up to date if position changes" do
|
43
|
+
subject
|
44
|
+
|
45
|
+
actor.expects(:update_attributes).with(x: 2, y: 3)
|
46
|
+
actor.stubs(position: vec2(2,3))
|
47
|
+
actor.fire(:position_changed)
|
48
|
+
end
|
52
49
|
end
|
data/spec/core/actor_spec.rb
CHANGED
@@ -48,10 +48,10 @@ describe Actor do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
describe "#
|
51
|
+
describe "#controller" do
|
52
52
|
it 'pulls an input mapper from the context' do
|
53
53
|
@this_object_context.stubs(:[]).with(:input_mapper).returns(:mapz)
|
54
|
-
subject.
|
54
|
+
subject.controller.should == :mapz
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -1,12 +1,28 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
describe 'A new resource manager' do
|
4
|
-
let(:actor) { stub 'actor', actor_type: 'string' }
|
5
4
|
subject { ResourceManager.new :wrapped_screen => stub(:screen => :fake_gosu) }
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
context 'no image_name' do
|
7
|
+
let(:actor) { stub 'actor', actor_type: 'string', do_or_do_not: nil }
|
8
|
+
|
9
|
+
it 'should load an actor image' do
|
10
|
+
subject.expects(:load_image).with("string.png").returns(:surf)
|
11
|
+
subject.load_actor_image(actor).should == :surf
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'with image_name' do
|
16
|
+
let(:actor) {
|
17
|
+
a = stub('actor')
|
18
|
+
a.stubs(:do_or_do_not).with(:image_name).returns('string')
|
19
|
+
a
|
20
|
+
}
|
21
|
+
|
22
|
+
it 'should load an actor image' do
|
23
|
+
subject.expects(:load_image).with("string.png").returns(:surf)
|
24
|
+
subject.load_actor_image(actor).should == :surf
|
25
|
+
end
|
10
26
|
end
|
11
27
|
|
12
28
|
end
|
data/spec/core/viewport_spec.rb
CHANGED
@@ -20,29 +20,205 @@ describe Viewport do
|
|
20
20
|
subject.x_offset.should == 0
|
21
21
|
subject.y_offset.should == 0
|
22
22
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
23
|
+
|
24
|
+
describe "#stay_centered_on" do
|
25
|
+
|
26
|
+
it 'should center the viewport on an actor when stay_centered_on' do
|
27
|
+
actor = Vec.new 900, 200
|
28
|
+
subject.stay_centered_on actor
|
29
|
+
|
30
|
+
subject.x_offset.should == -500
|
31
|
+
subject.y_offset.should == 100
|
32
|
+
subject.follow_target.should equal(actor)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should center the viewport on an actor (plus offset) when stay_centered_on' do
|
36
|
+
actor = Vec.new 900, 200
|
37
|
+
subject.stay_centered_on actor, x_offset: -40, y_offset: 20
|
38
|
+
|
39
|
+
subject.x_offset.should == -460
|
40
|
+
subject.y_offset.should == 80
|
41
|
+
subject.follow_target.should equal(actor)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should stay_centered_on a target if target has gone right;down of its buffer' do
|
45
|
+
actor = Vec.new 900, 200
|
46
|
+
subject.stay_centered_on actor, x_chain_length: 100, y_chain_length: 200
|
47
|
+
|
48
|
+
subject.update 100
|
49
|
+
actor.x = 990
|
50
|
+
actor.y = 390
|
51
|
+
|
52
|
+
subject.update 100
|
53
|
+
subject.x_offset.should == -500
|
54
|
+
subject.y_offset.should == 100
|
55
|
+
|
56
|
+
actor.x = 1001
|
57
|
+
actor.y = 401
|
58
|
+
subject.update 100
|
59
|
+
|
60
|
+
subject.x_offset.should == -501
|
61
|
+
subject.y_offset.should == 99
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should stay_centered_on a target if target has gone left;up of its buffer' do
|
65
|
+
actor = Vec.new 900, 200
|
66
|
+
subject.expects(:fire).with(:scrolled).twice
|
67
|
+
subject.stay_centered_on actor, x_chain_length: 100, y_chain_length: 200
|
68
|
+
|
69
|
+
subject.update 100
|
70
|
+
actor.x = 810
|
71
|
+
actor.y = 10
|
72
|
+
|
73
|
+
subject.update 100
|
74
|
+
subject.x_offset.should == -500
|
75
|
+
subject.y_offset.should == 100
|
76
|
+
|
77
|
+
actor.x = 799
|
78
|
+
actor.y = -1
|
79
|
+
subject.update 100
|
80
|
+
|
81
|
+
subject.x_offset.should == -499
|
82
|
+
subject.y_offset.should == 101
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should respect the speed setting' do
|
86
|
+
actor = Vec.new 900, 200
|
87
|
+
subject.speed = 0.5
|
88
|
+
subject.stay_centered_on actor, x_chain_length: 100, y_chain_length: 200
|
89
|
+
|
90
|
+
subject.update 100
|
91
|
+
actor.x = 990
|
92
|
+
actor.y = 390
|
93
|
+
|
94
|
+
subject.update 100
|
95
|
+
subject.x_offset.should == -500
|
96
|
+
subject.y_offset.should == 100
|
97
|
+
|
98
|
+
actor.x = 1002
|
99
|
+
actor.y = 402
|
100
|
+
subject.update 100
|
101
|
+
|
102
|
+
subject.x_offset.should == -501
|
103
|
+
subject.y_offset.should == 99
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'should fire :scrolled event when targeting an actor' do
|
108
|
+
actor = Vec.new 900, 200
|
109
|
+
subject.expects(:fire).with(:scrolled)
|
110
|
+
subject.stay_centered_on actor, x_chain_length: 100, y_chain_length: 200
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "#follow" do
|
115
|
+
|
116
|
+
it 'should center the viewport on an actor when follow' do
|
117
|
+
actor = Vec.new 900, 200
|
118
|
+
subject.follow actor
|
119
|
+
|
120
|
+
subject.x_offset.should == -500
|
121
|
+
subject.y_offset.should == 100
|
122
|
+
subject.follow_target.should equal(actor)
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should center the viewport on an actor (plus offset) when follow' do
|
126
|
+
actor = Vec.new 900, 200
|
127
|
+
subject.follow actor, [40,-20]
|
128
|
+
|
129
|
+
subject.x_offset.should == -460
|
130
|
+
subject.y_offset.should == 80
|
131
|
+
subject.follow_target.should equal(actor)
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'should follow a target if target has gone right;down of its buffer' do
|
135
|
+
actor = Vec.new 900, 200
|
136
|
+
subject.follow actor, [0,0], [100,200]
|
137
|
+
|
138
|
+
subject.update 100
|
139
|
+
actor.x = 990
|
140
|
+
actor.y = 390
|
141
|
+
|
142
|
+
subject.update 100
|
143
|
+
subject.x_offset.should == -500
|
144
|
+
subject.y_offset.should == 100
|
145
|
+
|
146
|
+
actor.x = 1001
|
147
|
+
actor.y = 401
|
148
|
+
subject.update 100
|
149
|
+
|
150
|
+
subject.x_offset.should == -501
|
151
|
+
subject.y_offset.should == 99
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'should follow a target if target has gone left;up of its buffer' do
|
155
|
+
actor = Vec.new 900, 200
|
156
|
+
subject.expects(:fire).with(:scrolled).twice
|
157
|
+
subject.follow actor, [0,0], [100,200]
|
158
|
+
|
159
|
+
subject.update 100
|
160
|
+
actor.x = 810
|
161
|
+
actor.y = 10
|
162
|
+
|
163
|
+
subject.update 100
|
164
|
+
subject.x_offset.should == -500
|
165
|
+
subject.y_offset.should == 100
|
166
|
+
|
167
|
+
actor.x = 799
|
168
|
+
actor.y = -1
|
169
|
+
subject.update 100
|
170
|
+
|
171
|
+
subject.x_offset.should == -499
|
172
|
+
subject.y_offset.should == 101
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'should respect the speed setting' do
|
176
|
+
actor = Vec.new 900, 200
|
177
|
+
subject.speed = 0.5
|
178
|
+
subject.follow actor, [0,0], [100,200]
|
179
|
+
|
180
|
+
subject.update 100
|
181
|
+
actor.x = 990
|
182
|
+
actor.y = 390
|
183
|
+
|
184
|
+
subject.update 100
|
185
|
+
subject.x_offset.should == -500
|
186
|
+
subject.y_offset.should == 100
|
187
|
+
|
188
|
+
actor.x = 1002
|
189
|
+
actor.y = 402
|
190
|
+
subject.update 100
|
191
|
+
|
192
|
+
subject.x_offset.should == -501
|
193
|
+
subject.y_offset.should == 99
|
194
|
+
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'should fire :scrolled event when targeting an actor' do
|
198
|
+
actor = Vec.new 900, 200
|
199
|
+
subject.expects(:fire).with(:scrolled)
|
200
|
+
subject.follow actor, [0,0], [100,200]
|
201
|
+
end
|
202
|
+
|
31
203
|
end
|
32
|
-
|
33
|
-
it '
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
subject.
|
38
|
-
|
39
|
-
subject.
|
204
|
+
|
205
|
+
it 'enforces speed is >= 0 and <= 1' do
|
206
|
+
subject.speed.should == 1
|
207
|
+
|
208
|
+
subject.speed = 0
|
209
|
+
subject.speed.should == 0
|
210
|
+
|
211
|
+
subject.speed = 2
|
212
|
+
subject.speed.should == 1
|
213
|
+
|
214
|
+
subject.speed = 0.1
|
215
|
+
subject.speed.should be_within(0.001).of(0.1)
|
40
216
|
end
|
41
|
-
|
217
|
+
|
42
218
|
it 'should respect parallax scrolling layers for offsets' do
|
43
219
|
subject.x_offset = -200
|
44
220
|
subject.y_offset = -300
|
45
|
-
|
221
|
+
|
46
222
|
subject.x_offset(2).should == -100
|
47
223
|
subject.y_offset(2).should == -150
|
48
224
|
end
|
@@ -50,102 +226,20 @@ describe Viewport do
|
|
50
226
|
it 'should return a zero offset on INFINITY' do
|
51
227
|
subject.x_offset = -200
|
52
228
|
subject.y_offset = -300
|
53
|
-
|
229
|
+
|
54
230
|
subject.x_offset(Float::INFINITY).should == 0
|
55
231
|
subject.y_offset(Float::INFINITY).should == 0
|
56
232
|
end
|
57
|
-
|
58
|
-
it
|
233
|
+
|
234
|
+
it "shouldn't update anything unless following a target" do
|
59
235
|
subject.x_offset = -200
|
60
236
|
subject.y_offset = -300
|
61
|
-
|
237
|
+
|
62
238
|
subject.update 3000
|
63
|
-
|
239
|
+
|
64
240
|
subject.x_offset.should == -200
|
65
241
|
subject.y_offset.should == -300
|
66
242
|
end
|
67
|
-
|
68
|
-
it 'should follow a target if target has gone right;down of its buffer' do
|
69
|
-
actor = Vec.new 900, 200
|
70
|
-
subject.follow actor, [0,0], [100,200]
|
71
|
-
|
72
|
-
subject.update 100
|
73
|
-
actor.x = 990
|
74
|
-
actor.y = 390
|
75
|
-
|
76
|
-
subject.update 100
|
77
|
-
subject.x_offset.should == -500
|
78
|
-
subject.y_offset.should == 100
|
79
|
-
|
80
|
-
actor.x = 1001
|
81
|
-
actor.y = 401
|
82
|
-
subject.update 100
|
83
|
-
|
84
|
-
subject.x_offset.should == -501
|
85
|
-
subject.y_offset.should == 99
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'should follow a target if target has gone left;up of its buffer' do
|
89
|
-
actor = Vec.new 900, 200
|
90
|
-
subject.expects(:fire).with(:scrolled).twice
|
91
|
-
subject.follow actor, [0,0], [100,200]
|
92
|
-
|
93
|
-
subject.update 100
|
94
|
-
actor.x = 810
|
95
|
-
actor.y = 10
|
96
|
-
|
97
|
-
subject.update 100
|
98
|
-
subject.x_offset.should == -500
|
99
|
-
subject.y_offset.should == 100
|
100
|
-
|
101
|
-
actor.x = 799
|
102
|
-
actor.y = -1
|
103
|
-
subject.update 100
|
104
|
-
|
105
|
-
subject.x_offset.should == -499
|
106
|
-
subject.y_offset.should == 101
|
107
|
-
end
|
108
|
-
|
109
|
-
it 'should respect the speed setting' do
|
110
|
-
actor = Vec.new 900, 200
|
111
|
-
subject.speed = 0.5
|
112
|
-
subject.follow actor, [0,0], [100,200]
|
113
|
-
|
114
|
-
subject.update 100
|
115
|
-
actor.x = 990
|
116
|
-
actor.y = 390
|
117
|
-
|
118
|
-
subject.update 100
|
119
|
-
subject.x_offset.should == -500
|
120
|
-
subject.y_offset.should == 100
|
121
|
-
|
122
|
-
actor.x = 1002
|
123
|
-
actor.y = 402
|
124
|
-
subject.update 100
|
125
|
-
|
126
|
-
subject.x_offset.should == -501
|
127
|
-
subject.y_offset.should == 99
|
128
|
-
|
129
|
-
end
|
130
|
-
|
131
|
-
it 'enforces speed is >= 0 and <= 1' do
|
132
|
-
subject.speed.should == 1
|
133
|
-
|
134
|
-
subject.speed = 0
|
135
|
-
subject.speed.should == 0
|
136
|
-
|
137
|
-
subject.speed = 2
|
138
|
-
subject.speed.should == 1
|
139
|
-
|
140
|
-
subject.speed = 0.1
|
141
|
-
subject.speed.should be_within(0.001).of(0.1)
|
142
|
-
end
|
143
|
-
|
144
|
-
it 'should fire :scrolled event when targeting an actor' do
|
145
|
-
actor = Vec.new 900, 200
|
146
|
-
subject.expects(:fire).with(:scrolled)
|
147
|
-
subject.follow actor, [0,0], [100,200]
|
148
|
-
end
|
149
243
|
|
150
244
|
describe "#bounds" do
|
151
245
|
it 'returns the bounds as [x1,y1,x2,y2]' do
|
@@ -157,9 +251,9 @@ describe Viewport do
|
|
157
251
|
bounds = subject.bounds
|
158
252
|
bounds.left.should == 10
|
159
253
|
bounds.top.should == 100
|
160
|
-
bounds.width.should ==
|
161
|
-
bounds.height.should ==
|
254
|
+
bounds.width.should == 800
|
255
|
+
bounds.height.should == 600
|
162
256
|
end
|
163
257
|
end
|
164
|
-
|
258
|
+
|
165
259
|
end
|