gamebox 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +14 -0
- data/Manifest.txt +40 -37
- data/README.txt +2 -2
- data/Rakefile +27 -20
- data/TODO.txt +8 -8
- data/bin/gamebox +7 -1
- data/docs/getting_started.rdoc +2 -5
- data/docs/logo.png +0 -0
- data/lib/gamebox.rb +12 -1
- data/lib/gamebox/actor.rb +34 -9
- data/lib/gamebox/actor_factory.rb +25 -14
- data/lib/gamebox/actor_view.rb +6 -6
- data/lib/gamebox/{logo.rb → actors/logo.rb} +0 -0
- data/lib/gamebox/{score.rb → actors/score.rb} +2 -1
- data/lib/gamebox/{svg_actor.rb → actors/svg_actor.rb} +3 -4
- data/lib/gamebox/ai/polaris.rb +2 -0
- data/lib/gamebox/behavior.rb +3 -0
- data/lib/gamebox/{animated.rb → behaviors/animated.rb} +13 -5
- data/lib/gamebox/{graphical.rb → behaviors/graphical.rb} +11 -1
- data/lib/gamebox/{layered.rb → behaviors/layered.rb} +14 -0
- data/lib/gamebox/{physical.rb → behaviors/physical.rb} +41 -14
- data/lib/gamebox/{updatable.rb → behaviors/updatable.rb} +1 -1
- data/lib/gamebox/{templates/template_app → data}/config/objects.yml +4 -2
- data/lib/gamebox/data/graphics/logo.png +0 -0
- data/lib/gamebox/event_compat.rb +285 -0
- data/lib/gamebox/ftor.rb +2 -0
- data/lib/gamebox/gamebox_application.rb +12 -1
- data/lib/gamebox/generators/actor_generator.rb +2 -2
- data/lib/gamebox/generators/view_generator.rb +42 -0
- data/lib/gamebox/input_manager.rb +88 -21
- data/lib/gamebox/{aliasing.rb → lib/aliasing.rb} +0 -0
- data/lib/gamebox/{templates/template_app/lib → lib}/diy.rb +0 -0
- data/lib/gamebox/{inflections.rb → lib/inflections.rb} +0 -0
- data/lib/gamebox/{inflector.rb → lib/inflector.rb} +2 -2
- data/lib/gamebox/{linked_list.rb → lib/linked_list.rb} +0 -0
- data/lib/gamebox/{metaclass.rb → lib/metaclass.rb} +0 -0
- data/lib/gamebox/lib/numbers_ext.rb +3 -0
- data/lib/gamebox/{platform.rb → lib/platform.rb} +0 -0
- data/lib/gamebox/{publisher_ext.rb → lib/publisher_ext.rb} +0 -0
- data/lib/gamebox/{sorted_list.rb → lib/sorted_list.rb} +0 -0
- data/lib/gamebox/lib/surface_ext.rb +76 -0
- data/lib/gamebox/physical_director.rb +1 -1
- data/lib/gamebox/{physical_level.rb → physical_stage.rb} +28 -18
- data/lib/gamebox/physics.rb +2 -2
- data/lib/gamebox/resource_manager.rb +77 -8
- data/lib/gamebox/sound_manager.rb +15 -17
- data/lib/gamebox/stage.rb +143 -0
- data/lib/gamebox/stage_manager.rb +110 -0
- data/lib/gamebox/svg_document.rb +1 -1
- data/lib/gamebox/tasks/gamebox_tasks.rb +1 -1
- data/lib/gamebox/templates/{test_actor.erb → actor_spec.erb} +2 -2
- data/lib/gamebox/templates/actor_view.erb +8 -0
- data/lib/gamebox/templates/actor_view_spec.erb +10 -0
- data/lib/gamebox/templates/template_app/Rakefile +4 -4
- data/lib/gamebox/templates/template_app/config/game.yml +1 -0
- data/lib/gamebox/templates/template_app/config/stage_config.yml +2 -0
- data/lib/gamebox/templates/template_app/script/generate +2 -1
- data/lib/gamebox/templates/template_app/{test → spec}/helper.rb +0 -0
- data/lib/gamebox/templates/template_app/src/{demo_level.rb → demo_stage.rb} +5 -3
- data/lib/gamebox/templates/template_app/src/game.rb +4 -6
- data/lib/gamebox/version.rb +3 -2
- data/lib/gamebox/viewport.rb +18 -9
- data/lib/gamebox/{graphical_actor_view.rb → views/graphical_actor_view.rb} +13 -1
- data/lib/gamebox/wrapped_screen.rb +2 -1
- data/spec/actor_spec.rb +57 -0
- data/{test/test_animated.rb → spec/animated_spec.rb} +5 -6
- data/spec/helper.rb +24 -0
- data/{test/test_line_of_site.rb → spec/line_of_site_spec.rb} +1 -1
- data/{test/test_physical.rb → spec/physical_spec.rb} +3 -4
- data/{test/test_polaris.rb → spec/polaris_spec.rb} +1 -1
- data/{test/test_viewport.rb → spec/viewport_spec.rb} +11 -8
- metadata +53 -50
- data/docs/gamebox04_big.png +0 -0
- data/lib/gamebox/level.rb +0 -65
- data/lib/gamebox/mode.rb +0 -123
- data/lib/gamebox/mode_manager.rb +0 -80
- data/lib/gamebox/numbers_ext.rb +0 -3
- data/lib/gamebox/surface_ext.rb +0 -37
- data/lib/gamebox/templates/template_app/config/mode_level_config.yml +0 -3
- data/test/helper.rb +0 -26
- data/test/test_actor.rb +0 -36
data/lib/gamebox/svg_document.rb
CHANGED
@@ -3,8 +3,8 @@ require '<%= Inflector.underscore @actor_name %>'
|
|
3
3
|
|
4
4
|
describe 'a new <%= @actor_name %>' do
|
5
5
|
before do
|
6
|
-
opts = {:
|
7
|
-
@test_me = <%= @actor_name %>.new opts
|
6
|
+
# opts = {:stage=>"stage", :input=>"input", :resources=>"resource"}
|
7
|
+
# @test_me = <%= @actor_name %>.new opts
|
8
8
|
end
|
9
9
|
|
10
10
|
it 'should do something'
|
@@ -21,8 +21,8 @@ end
|
|
21
21
|
|
22
22
|
require 'spec/rake/spectask'
|
23
23
|
desc "Run all specs"
|
24
|
-
Spec::Rake::SpecTask.new('
|
25
|
-
t.spec_opts = ["-r", "./
|
26
|
-
t.spec_files = FileList['
|
24
|
+
Spec::Rake::SpecTask.new('rspec') do |t|
|
25
|
+
t.spec_opts = ["-r", "./spec/helper"]
|
26
|
+
t.spec_files = FileList['spec//*_spec.rb']
|
27
27
|
end
|
28
|
-
task :test => :
|
28
|
+
task :test => :rspec
|
File without changes
|
@@ -1,7 +1,8 @@
|
|
1
|
-
require '
|
1
|
+
require 'stage'
|
2
2
|
require 'ftor'
|
3
|
-
class
|
3
|
+
class DemoStage < Stage
|
4
4
|
def setup
|
5
|
+
super
|
5
6
|
@my_actor = create_actor :my_actor
|
6
7
|
@my_actor.x = 10
|
7
8
|
@my_actor.y = 10
|
@@ -10,11 +11,12 @@ class DemoLevel < Level
|
|
10
11
|
20.times { @stars << Ftor.new(rand(viewport.width),rand(viewport.height)) }
|
11
12
|
end
|
12
13
|
|
13
|
-
def draw(target
|
14
|
+
def draw(target)
|
14
15
|
target.fill [25,25,25,255]
|
15
16
|
for star in @stars
|
16
17
|
target.draw_circle_s([star.x,star.y],1,[255,255,255,255])
|
17
18
|
end
|
19
|
+
super
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
@@ -1,21 +1,19 @@
|
|
1
1
|
class Game
|
2
2
|
|
3
3
|
constructor :wrapped_screen, :input_manager, :sound_manager,
|
4
|
-
:
|
4
|
+
:stage_manager
|
5
5
|
|
6
6
|
def setup
|
7
|
-
|
8
|
-
|
9
|
-
@mode_manager.change_mode_to :default
|
7
|
+
@stage_manager.change_stage_to :demo
|
10
8
|
end
|
11
9
|
|
12
10
|
def update(time)
|
13
|
-
@
|
11
|
+
@stage_manager.update time
|
14
12
|
draw
|
15
13
|
end
|
16
14
|
|
17
15
|
def draw
|
18
|
-
@
|
16
|
+
@stage_manager.draw @wrapped_screen
|
19
17
|
@wrapped_screen.flip
|
20
18
|
end
|
21
19
|
|
data/lib/gamebox/version.rb
CHANGED
data/lib/gamebox/viewport.rb
CHANGED
@@ -8,7 +8,7 @@ class Viewport
|
|
8
8
|
can_fire :scrolled
|
9
9
|
|
10
10
|
attr_accessor :x_offset, :y_offset, :follow_target, :width,
|
11
|
-
:height
|
11
|
+
:height, :x_offset_range, :y_offset_range
|
12
12
|
|
13
13
|
def debug
|
14
14
|
"xoff:#{@x_offset} yoff:#{@y_offset}"
|
@@ -23,13 +23,13 @@ class Viewport
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def x_offset(layer=1)
|
26
|
-
return 0 if layer == Float::
|
26
|
+
return 0 if layer == Float::INFINITY
|
27
27
|
return @x_offset if layer == 1
|
28
28
|
@x_offset / layer
|
29
29
|
end
|
30
30
|
|
31
31
|
def y_offset(layer=1)
|
32
|
-
return 0 if layer == Float::
|
32
|
+
return 0 if layer == Float::INFINITY
|
33
33
|
return @y_offset if layer == 1
|
34
34
|
@y_offset / layer
|
35
35
|
end
|
@@ -37,28 +37,37 @@ class Viewport
|
|
37
37
|
def update(time)
|
38
38
|
scrolled = false
|
39
39
|
if @follow_target
|
40
|
-
|
40
|
+
x = @follow_target.x
|
41
|
+
y = @follow_target.y
|
42
|
+
if @x_offset_range
|
43
|
+
x = @x_offset_range.min if @x_offset_range.min > x
|
44
|
+
x = @x_offset_range.max if @x_offset_range.max < x
|
45
|
+
end
|
46
|
+
if @y_offset_range
|
47
|
+
y = @y_offset_range.min if @y_offset_range.min > y
|
48
|
+
y = @y_offset_range.max if @y_offset_range.max < y
|
49
|
+
end
|
50
|
+
x_diff = @width/2 + @follow_offset_x - x - @x_offset
|
41
51
|
if x_diff.abs > @buffer_x
|
42
52
|
# move screen
|
43
53
|
if x_diff > 0
|
44
54
|
@x_offset += x_diff - @buffer_x
|
45
|
-
scrolled = true
|
46
55
|
else
|
47
56
|
@x_offset += x_diff + @buffer_x
|
48
|
-
scrolled = true
|
49
57
|
end
|
58
|
+
scrolled = true
|
50
59
|
end
|
51
60
|
|
52
|
-
|
61
|
+
|
62
|
+
y_diff = @height/2 + @follow_offset_y - y - @y_offset
|
53
63
|
if y_diff.abs > @buffer_y
|
54
64
|
# move screen
|
55
65
|
if y_diff > 0
|
56
66
|
@y_offset += y_diff - @buffer_y
|
57
|
-
scrolled = true
|
58
67
|
else
|
59
68
|
@y_offset += y_diff + @buffer_y
|
60
|
-
scrolled = true
|
61
69
|
end
|
70
|
+
scrolled = true
|
62
71
|
end
|
63
72
|
|
64
73
|
fire :scrolled if scrolled
|
@@ -27,7 +27,19 @@ class GraphicalActorView < ActorView
|
|
27
27
|
end
|
28
28
|
|
29
29
|
else
|
30
|
-
|
30
|
+
if @actor.is?(:graphical) && @actor.graphical.tiled?
|
31
|
+
x_tiles = @actor.graphical.num_x_tiles
|
32
|
+
y_tiles = @actor.graphical.num_y_tiles
|
33
|
+
img_w, img_h = *img.size
|
34
|
+
x_tiles.times do |col|
|
35
|
+
y_tiles.times do |row|
|
36
|
+
img.blit target.screen, [x+x_off+col*img_w,y+y_off+row*img_h]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
else
|
40
|
+
img.blit target.screen, [x+x_off,y+y_off]
|
41
|
+
end
|
42
|
+
|
31
43
|
end
|
32
44
|
end
|
33
45
|
end
|
@@ -7,7 +7,8 @@ class WrappedScreen
|
|
7
7
|
flags << HWSURFACE
|
8
8
|
flags << DOUBLEBUF
|
9
9
|
flags << FULLSCREEN if @config_manager[:fullscreen]
|
10
|
-
|
10
|
+
flags << OPENGL if @config_manager[:opengl]
|
11
|
+
@screen = Screen.open [w,h], 0, flags
|
11
12
|
end
|
12
13
|
def method_missing(name,*args)
|
13
14
|
@screen.send name, *args
|
data/spec/actor_spec.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__),'helper')
|
2
|
+
require 'actor'
|
3
|
+
require 'behavior'
|
4
|
+
|
5
|
+
describe 'A new actor' do
|
6
|
+
before do
|
7
|
+
opts = {:stage=>"stage", :input=>"input", :resources=>"resource"}
|
8
|
+
@actor = Actor.new opts
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should be alive' do
|
12
|
+
@actor.alive?.should be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should be at (0,0)' do
|
16
|
+
@actor.x.should equal(0)
|
17
|
+
@actor.y.should equal(0)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should have atts set' do
|
21
|
+
@actor.stage.should == "stage"
|
22
|
+
@actor.input_manager.should == "input"
|
23
|
+
@actor.resource_manager.should == "resource"
|
24
|
+
@actor.behaviors.size.should equal(0)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should fire anything' do
|
28
|
+
Proc.new {
|
29
|
+
@actor.when :foofoo_bar do
|
30
|
+
"blah"
|
31
|
+
end
|
32
|
+
}.should_not raise_error
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should inherit parents behaviors' do
|
36
|
+
@shawn = Shawn.new {}
|
37
|
+
@shawn.is?(:smart).should be_true
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should be able to override parents behaviors' do
|
41
|
+
@james = JamesKilton.new {}
|
42
|
+
@james.is?(:smart).should be_true
|
43
|
+
@james.instance_variable_get('@behaviors')[:smart].instance_variable_get('@opts').should == {:really=>true}
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should maintain order of behaviors'
|
47
|
+
|
48
|
+
end
|
49
|
+
class Cool < Behavior; end
|
50
|
+
class Smart < Behavior; end
|
51
|
+
class Coder < Actor
|
52
|
+
has_behavior :smart, :cool
|
53
|
+
end
|
54
|
+
class Shawn < Coder; end
|
55
|
+
class JamesKilton < Coder
|
56
|
+
has_behavior :smart => {:really => true}
|
57
|
+
end
|
@@ -1,12 +1,11 @@
|
|
1
|
-
require 'helper'
|
1
|
+
require File.join(File.dirname(__FILE__),'helper')
|
2
2
|
require 'animated'
|
3
|
-
require 'mocha'
|
4
3
|
|
5
4
|
describe 'A new animated behavior' do
|
6
5
|
before do
|
7
6
|
@rm = stub(:load_animation_set => ['1.png_img_obj','2.png_img_obj'])
|
8
7
|
|
9
|
-
opts = {:
|
8
|
+
opts = {:stage=>"stage", :input=>"input", :resources=>@rm}
|
10
9
|
@actor = Actor.new opts
|
11
10
|
@animated = Animated.new @actor
|
12
11
|
end
|
@@ -22,14 +21,14 @@ describe 'A new animated behavior' do
|
|
22
21
|
it 'shouldn\'t update frame for non-animating' do
|
23
22
|
@animated.stop_animating
|
24
23
|
|
25
|
-
@animated.update
|
24
|
+
@animated.update @animated.frame_update_time+1
|
26
25
|
|
27
26
|
@animated.frame_time.should equal(0)
|
28
27
|
@animated.frame_num.should equal(0)
|
29
28
|
end
|
30
29
|
|
31
30
|
it 'should update frame for animating' do
|
32
|
-
time_passed =
|
31
|
+
time_passed = @animated.frame_update_time-1
|
33
32
|
@animated.update time_passed
|
34
33
|
@animated.frame_time.should equal(time_passed)
|
35
34
|
@animated.frame_num.should equal(0)
|
@@ -40,7 +39,7 @@ describe 'A new animated behavior' do
|
|
40
39
|
@animated.frame_time.should equal(1)
|
41
40
|
@animated.frame_num.should equal(1)
|
42
41
|
|
43
|
-
time_passed_again =
|
42
|
+
time_passed_again = @animated.frame_update_time
|
44
43
|
@animated.update time_passed_again
|
45
44
|
# we rolled over the time
|
46
45
|
@animated.frame_time.should equal(1)
|
data/spec/helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
here = File.dirname(__FILE__)
|
2
|
+
gamebox_root = File.expand_path(File.join(here, '..', 'lib'))
|
3
|
+
|
4
|
+
#$LOAD_PATH.unshift File.expand_path(gamebox_root, 'gamebox')
|
5
|
+
require 'rubygems'
|
6
|
+
require 'spec'
|
7
|
+
|
8
|
+
# TODO this lives in both gamebox.rb and here... seems strange
|
9
|
+
[
|
10
|
+
"gamebox",
|
11
|
+
"gamebox/actors",
|
12
|
+
"gamebox/ai",
|
13
|
+
"gamebox/behaviors",
|
14
|
+
"gamebox/generators",
|
15
|
+
"gamebox/lib",
|
16
|
+
"gamebox/tasks",
|
17
|
+
"gamebox/views"
|
18
|
+
].each do |path|
|
19
|
+
$LOAD_PATH.unshift File.join(gamebox_root,path)
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'metaclass'
|
23
|
+
require 'actor'
|
24
|
+
|
@@ -1,7 +1,6 @@
|
|
1
|
-
require 'helper'
|
1
|
+
require File.join(File.dirname(__FILE__),'helper')
|
2
2
|
require 'physical'
|
3
3
|
require 'actor'
|
4
|
-
require 'mocha'
|
5
4
|
|
6
5
|
class CircleActor < Actor
|
7
6
|
has_behaviors :physical => {:shape => :circle,
|
@@ -11,9 +10,9 @@ end
|
|
11
10
|
|
12
11
|
describe 'A new physical behavior' do
|
13
12
|
before do
|
14
|
-
@
|
13
|
+
@stage = stub(:load_animation_set => ['1.png_img_obj','2.png_img_obj'],:register_physical_object => true)
|
15
14
|
|
16
|
-
opts = {:
|
15
|
+
opts = {:stage=>@stage, :input=>"input", :resources=>"rm"}
|
17
16
|
@actor = CircleActor.new opts
|
18
17
|
@physical = @actor.physical
|
19
18
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'helper'
|
1
|
+
require File.join(File.dirname(__FILE__),'helper')
|
2
2
|
require 'viewport'
|
3
3
|
|
4
4
|
class Vec
|
@@ -47,12 +47,12 @@ describe 'A new viewport' do
|
|
47
47
|
@viewport.y_offset(2).should equal(-150)
|
48
48
|
end
|
49
49
|
|
50
|
-
it 'should return a zero offset on
|
50
|
+
it 'should return a zero offset on INFINITY' do
|
51
51
|
@viewport.x_offset = -200
|
52
52
|
@viewport.y_offset = -300
|
53
53
|
|
54
|
-
@viewport.x_offset(Float::
|
55
|
-
@viewport.y_offset(Float::
|
54
|
+
@viewport.x_offset(Float::INFINITY).should equal(0)
|
55
|
+
@viewport.y_offset(Float::INFINITY).should equal(0)
|
56
56
|
end
|
57
57
|
|
58
58
|
it 'shouldn\'t update anything unless following a target' do
|
@@ -87,12 +87,13 @@ describe 'A new viewport' do
|
|
87
87
|
|
88
88
|
it 'should follow a target if target has gone left;up of its buffer' do
|
89
89
|
actor = Vec.new 900, 200
|
90
|
+
@viewport.should_receive(:fire).with(:scrolled).twice
|
90
91
|
@viewport.follow actor, [0,0], [100,200]
|
91
92
|
|
92
93
|
@viewport.update 100
|
93
94
|
actor.x = 810
|
94
95
|
actor.y = 10
|
95
|
-
|
96
|
+
|
96
97
|
@viewport.update 100
|
97
98
|
@viewport.x_offset.should equal(-500)
|
98
99
|
@viewport.y_offset.should equal(100)
|
@@ -105,8 +106,10 @@ describe 'A new viewport' do
|
|
105
106
|
@viewport.y_offset.should equal(101)
|
106
107
|
end
|
107
108
|
|
108
|
-
it 'should fire :scrolled event when targeting an actor'
|
109
|
+
it 'should fire :scrolled event when targeting an actor' do
|
110
|
+
actor = Vec.new 900, 200
|
111
|
+
@viewport.should_receive(:fire).with(:scrolled)
|
112
|
+
@viewport.follow actor, [0,0], [100,200]
|
113
|
+
end
|
109
114
|
|
110
|
-
it 'should fire :scrolled event from update when the actor moves'
|
111
|
-
|
112
115
|
end
|