ray 0.0.0.pre2 → 0.0.1

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.
Files changed (76) hide show
  1. data/.gitignore +1 -0
  2. data/.rspec +3 -0
  3. data/README.md +62 -0
  4. data/Rakefile +33 -23
  5. data/VERSION +1 -1
  6. data/ext/audio.c +473 -0
  7. data/ext/color.c +4 -4
  8. data/ext/event.c +25 -3
  9. data/ext/extconf.rb +35 -22
  10. data/ext/font.c +287 -0
  11. data/ext/image.c +682 -33
  12. data/ext/joystick.c +9 -9
  13. data/ext/ray.c +166 -55
  14. data/ext/ray.h +120 -9
  15. data/ext/ray_osx.m +161 -0
  16. data/ext/rect.c +31 -4
  17. data/lib/ray/audio.rb +52 -0
  18. data/lib/ray/color.rb +16 -0
  19. data/lib/ray/dsl.rb +1 -3
  20. data/lib/ray/dsl/event.rb +1 -39
  21. data/lib/ray/dsl/event_listener.rb +38 -0
  22. data/lib/ray/dsl/event_runner.rb +3 -1
  23. data/lib/ray/dsl/event_translator.rb +74 -8
  24. data/lib/ray/dsl/handler.rb +3 -33
  25. data/lib/ray/dsl/matcher.rb +129 -23
  26. data/lib/ray/font.rb +108 -0
  27. data/lib/ray/font_set.rb +37 -0
  28. data/lib/ray/game.rb +171 -34
  29. data/lib/ray/helper.rb +43 -5
  30. data/lib/ray/image.rb +90 -3
  31. data/lib/ray/image_set.rb +35 -0
  32. data/lib/ray/joystick.rb +30 -0
  33. data/lib/ray/music_set.rb +35 -0
  34. data/lib/ray/ray.rb +17 -9
  35. data/lib/ray/rect.rb +51 -0
  36. data/lib/ray/resource_set.rb +92 -0
  37. data/lib/ray/scene.rb +220 -51
  38. data/lib/ray/sound_set.rb +35 -0
  39. data/lib/ray/sprite.rb +184 -0
  40. data/psp/ext.c +4 -0
  41. data/samples/hello_world/hello.rb +35 -0
  42. data/samples/hello_world/hello_dsl.rb +24 -0
  43. data/samples/pong/pong.rb +128 -0
  44. data/samples/sokoban/level_1 +7 -0
  45. data/samples/sokoban/sokoban.rb +370 -0
  46. data/spec/ray/audio_spec.rb +146 -0
  47. data/spec/ray/color_spec.rb +13 -0
  48. data/spec/ray/event_spec.rb +57 -168
  49. data/spec/ray/font_spec.rb +93 -0
  50. data/spec/ray/image_set_spec.rb +48 -0
  51. data/spec/ray/image_spec.rb +130 -44
  52. data/spec/ray/joystick_spec.rb +13 -9
  53. data/spec/ray/matcher_spec.rb +32 -55
  54. data/spec/ray/ray_spec.rb +33 -31
  55. data/spec/ray/rect_spec.rb +80 -0
  56. data/spec/ray/resource_set_spec.rb +105 -0
  57. data/spec/ray/sprite_spec.rb +163 -0
  58. data/spec/res/VeraMono.ttf +0 -0
  59. data/spec/res/aqua2.bmp +0 -0
  60. data/spec/res/pop.wav +0 -0
  61. data/spec/spec.opts +4 -0
  62. data/spec/spec_helper.rb +8 -0
  63. data/yard_ext.rb +91 -0
  64. metadata +104 -38
  65. data/bin/ray +0 -5
  66. data/bin/ray_irb +0 -4
  67. data/ext/SDLMain.h +0 -17
  68. data/ext/SDLMain.m +0 -381
  69. data/lib/ray/config.rb +0 -84
  70. data/lib/ray/dsl/converter.rb +0 -65
  71. data/lib/ray/dsl/listener.rb +0 -30
  72. data/lib/ray/dsl/type.rb +0 -58
  73. data/spec/ray/config_spec.rb +0 -90
  74. data/spec/ray/conversion_spec.rb +0 -43
  75. data/spec/ray/type_spec.rb +0 -17
  76. data/spec_runner.rb +0 -27
@@ -1,3 +1,5 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
1
3
  describe Ray::Rect do
2
4
  [:x, :y, :width, :height].each do |meth|
3
5
  describe "##{meth}=" do
@@ -71,4 +73,82 @@ describe Ray::Rect do
71
73
  end
72
74
  end
73
75
  end
76
+
77
+ describe "#inside?" do
78
+ it "should return true if the rect is the receiver itself" do
79
+ rect = Ray::Rect.new(10, 15, 20, 30)
80
+ rect.should be_inside(rect)
81
+ end
82
+
83
+ it "should return true if the rect inside the receiver" do
84
+ rect = Ray::Rect.new(10, 15, 30, 40)
85
+ Ray::Rect.new(13, 17, 10, 20).should be_inside(rect)
86
+ end
87
+
88
+ it "should return false if the rect only collides with the receiver" do
89
+ rect = Ray::Rect.new(10, 15, 30, 40)
90
+
91
+ Ray::Rect.new(5, 10, 20, 20).should_not be_inside(rect)
92
+ Ray::Rect.new(11, 16, 40, 50).should_not be_inside(rect)
93
+ end
94
+
95
+ it "should return false if the rect is outside the receiver" do
96
+ rect = Ray::Rect.new(10, 15, 20, 30)
97
+
98
+ Ray::Rect.new(1, 2, 3, 5).should_not be_inside(rect)
99
+ Ray::Rect.new(100, 150, 350, 450).should_not be_inside(rect)
100
+ end
101
+ end
102
+
103
+ describe "#outside?" do
104
+ it "should return false if the rect is the receiver itself" do
105
+ rect = Ray::Rect.new(10, 15, 20, 30)
106
+ rect.should_not be_outside(rect)
107
+ end
108
+
109
+ it "should return true if the rect is outside the receiver" do
110
+ rect = Ray::Rect.new(10, 15, 20, 30)
111
+
112
+ Ray::Rect.new(1, 2, 3, 5).should be_outside(rect)
113
+ Ray::Rect.new(100, 150, 350, 450).should be_outside(rect)
114
+ end
115
+
116
+ it "should return false if the rect is inside the receiver" do
117
+ rect = Ray::Rect.new(10, 15, 30, 40)
118
+ Ray::Rect.new(13, 17, 10, 20).should_not be_outside(rect)
119
+ end
120
+
121
+ it "should return false if the rect collides with the receiver" do
122
+ rect = Ray::Rect.new(10, 15, 30, 40)
123
+
124
+ Ray::Rect.new(5, 10, 20, 20).should_not be_outside(rect)
125
+ Ray::Rect.new(11, 16, 40, 50).should_not be_outside(rect)
126
+ end
127
+ end
128
+
129
+ describe "#colllide?" do
130
+ it "should return true if the rect is the receiver itself" do
131
+ rect = Ray::Rect.new(10, 15, 20, 30)
132
+ rect.collide?(rect).should be_true
133
+ end
134
+
135
+ it "should return false if the rect is outside the receiver" do
136
+ rect = Ray::Rect.new(10, 15, 20, 30)
137
+
138
+ Ray::Rect.new(1, 2, 3, 5).collide?(rect).should_not be_true
139
+ Ray::Rect.new(100, 150, 350, 450).collide?(rect).should_not be_true
140
+ end
141
+
142
+ it "should return true if the rect is inside the receiver" do
143
+ rect = Ray::Rect.new(10, 15, 30, 40)
144
+ Ray::Rect.new(13, 17, 10, 20).collide?(rect).should be_true
145
+ end
146
+
147
+ it "should return true if the rect collides with the receiver" do
148
+ rect = Ray::Rect.new(10, 15, 30, 40)
149
+
150
+ Ray::Rect.new(5, 10, 20, 20).collide?(rect).should be_true
151
+ Ray::Rect.new(11, 16, 40, 50).collide?(rect).should be_true
152
+ end
153
+ end
74
154
  end
@@ -0,0 +1,105 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ module TestSet
4
+ extend Ray::ResourceSet
5
+
6
+ def self.missing_pattern(string)
7
+ "unknown"
8
+ end
9
+
10
+ add_set(/^string:(.+)$/) do |str|
11
+ str
12
+ end
13
+ end
14
+
15
+ module DefaultMissingPattern
16
+ extend Ray::ResourceSet
17
+ end
18
+
19
+ module MultipleArgumentsSet
20
+ extend Ray::ResourceSet
21
+
22
+ need_argument_count 1
23
+
24
+ add_set(/^string:(.+)$/) do |str, times|
25
+ str * times
26
+ end
27
+
28
+ def self.missing_pattern(*args)
29
+ args
30
+ end
31
+ end
32
+
33
+ module CacheTestSet
34
+ extend Ray::ResourceSet
35
+
36
+ add_set(/(.+)/) { |str| str }
37
+ end
38
+
39
+ describe Ray::ResourceSet do
40
+ it "should use the block we passed to create a string" do
41
+ TestSet["string:test"].should == "test"
42
+ end
43
+
44
+ it "should always return the same object for the same key" do
45
+ str = TestSet["string:my string"]
46
+ str.object_id.should == TestSet["string:my string"].object_id
47
+ end
48
+
49
+ it "should call the missing_pattern method when a string isn't matched" do
50
+ TestSet["Hello world"].should == "unknown"
51
+ end
52
+
53
+ it "should raise NoPatternError for unmatched string by default" do
54
+ lambda {
55
+ DefaultMissingPattern["unknown"]
56
+ }.should raise_exception(Ray::NoPatternError)
57
+ end
58
+
59
+ it "should allow more arguments in []" do
60
+ lambda {
61
+ MultipleArgumentsSet["string:test", 3]
62
+ }.should_not raise_exception
63
+ end
64
+
65
+ it "should raise an error when using an invalid argument count" do
66
+ lambda {
67
+ TestSet["string:foo", 3]
68
+ }.should raise_exception
69
+ end
70
+
71
+ it "should provide user arguments at the end" do
72
+ MultipleArgumentsSet.add_set(/my_(.)/) do |char, times|
73
+ char.should == "a"
74
+ times.should == 3
75
+
76
+ true
77
+ end
78
+
79
+ MultipleArgumentsSet["my_a", 3]
80
+ end
81
+
82
+ it "should be able to select objects from the cache" do
83
+ first = CacheTestSet["first"]
84
+ sec = CacheTestSet["sec"]
85
+
86
+ CacheTestSet.select! { |key, val| key == "first" }
87
+
88
+ first.object_id.should == CacheTestSet["first"].object_id
89
+ sec.object_id.should_not == CacheTestSet["sec"].object_id
90
+ end
91
+
92
+ it "should be able to reject objects from the cache" do
93
+ first = CacheTestSet["first"]
94
+ sec = CacheTestSet["sec"]
95
+
96
+ CacheTestSet.reject! { |key, val| key == "first" }
97
+
98
+ first.object_id.should_not == CacheTestSet["first"].object_id
99
+ sec.object_id.should == CacheTestSet["sec"].object_id
100
+ end
101
+
102
+ it "should pass all the arguments to missing_pattern" do
103
+ MultipleArgumentsSet["a", 3].should == ["a", 3]
104
+ end
105
+ end
@@ -0,0 +1,163 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Ray::Sprite do
4
+ before :all do
5
+ Ray.init
6
+ @win = Ray.create_window(:w => 100, :h => 100)
7
+ end
8
+
9
+ it "should wrap an image" do
10
+ image = Ray::Image.new(:w => 10, :h => 10)
11
+
12
+ sprite = Ray::Sprite.new(image)
13
+ sprite.image.should == image
14
+ end
15
+
16
+ it "should convert strings to images" do
17
+ image = Ray::ImageSet[path_of("aqua.bmp")]
18
+
19
+ sprite = Ray::Sprite.new(path_of("aqua.bmp"))
20
+ sprite.image.should == image
21
+ end
22
+
23
+ it "should blit its image when drawn" do
24
+ image = mock("image")
25
+ image.stub!(:to_image).and_return(image)
26
+ image.stub!(:is_a?).and_return(true)
27
+ image.should_receive(:blit).and_return(@win)
28
+
29
+ sprite = Ray::Sprite.new(image)
30
+ sprite.draw_on(@win)
31
+ end
32
+
33
+ it "should draw on the screen by default" do
34
+ image = mock("image")
35
+ image.stub!(:to_image).and_return(image)
36
+ image.stub!(:is_a?).and_return(true)
37
+ image.should_receive(:blit).with(hash_including(:on => @win)).and_return(@win)
38
+
39
+ sprite = Ray::Sprite.new(image)
40
+ sprite.draw
41
+ end
42
+
43
+ it "should have a position" do
44
+ sprite = Ray::Sprite.new(@win, :at => [10, 15])
45
+ sprite.is_at?(10, 15).should be_true
46
+ end
47
+
48
+ it "should not be at a position it wan't assigned to" do
49
+ sprite = Ray::Sprite.new(@win, :at => [13, 20])
50
+ sprite.is_at?(10, 15).should be_false
51
+ end
52
+
53
+ it "should be at (0, 0) by default" do
54
+ sprite = Ray::Sprite.new(@win)
55
+ sprite.is_at?(0, 0).should be_true
56
+ end
57
+
58
+ it "should draw the image at its position" do
59
+ image = mock("image")
60
+ image.stub!(:to_image).and_return(image)
61
+ image.stub!(:is_a?).and_return(true)
62
+ image.should_receive(:blit).with(hash_including(:at => [10, 15])).
63
+ and_return(@win)
64
+
65
+ sprite = Ray::Sprite.new(image, :at => [10, 15])
66
+ sprite.draw
67
+ end
68
+
69
+ it "should allow to draw only a small rect of the image" do
70
+ image = mock("image")
71
+ image.stub!(:to_image).and_return(image)
72
+ image.stub!(:is_a?).and_return(true)
73
+ rect = Ray::Rect.new(50, 30, 100, 120)
74
+ image.should_receive(:blit).with(hash_including(:rect => rect)).
75
+ and_return(@win)
76
+
77
+ sprite = Ray::Sprite.new(image, :rect => [50, 30, 100, 120])
78
+ sprite.draw
79
+ end
80
+
81
+ it "should default to an empty rect" do
82
+ sprite = Ray::Sprite.new(@win)
83
+ sprite.from_rect.should == Ray::Rect.new(0, 0, 0, 0)
84
+ end
85
+
86
+ describe "#rect" do
87
+ it "should return the rect where the image will be drawn" do
88
+ sprite = Ray::Sprite.new(@win, :rect => [70, 80, 80, 80],
89
+ :at => [50, 30])
90
+ sprite.rect.should == Ray::Rect.new(50, 30, 80, 80)
91
+ end
92
+
93
+ it "should return the image size if the rect is not set" do
94
+ sprite = Ray::Sprite.new(@win)
95
+ sprite.rect.should == Ray::Rect.new(0, 0, 100, 100)
96
+ end
97
+ end
98
+
99
+ it "should allow to set an angle" do
100
+ sprite = Ray::Sprite.new(@win, :angle => 30)
101
+ sprite.angle.should == 30
102
+ end
103
+
104
+ it "should draw using its angle" do
105
+ image = mock("image")
106
+ image.stub!(:to_image).and_return(image)
107
+ image.stub!(:is_a?).and_return(true)
108
+ image.should_receive(:blit).with(hash_including(:angle => 40))
109
+
110
+ sprite = Ray::Sprite.new(image, :angle => 40)
111
+ sprite.draw
112
+ end
113
+
114
+ it "should allow to zoom" do
115
+ sprite = Ray::Sprite.new(@win, :zoom => 3)
116
+ sprite.zoom.should == 3
117
+ end
118
+
119
+ it "should draw using its zoom level" do
120
+ image = mock("image")
121
+ image.stub!(:to_image).and_return(image)
122
+ image.stub!(:is_a?).and_return(true)
123
+ image.should_receive(:blit).with(hash_including(:zoom => 3))
124
+
125
+ sprite = Ray::Sprite.new(image, :zoom => 3)
126
+ sprite.draw
127
+ end
128
+
129
+ it "should allow to set its position using an array" do
130
+ sprite = Ray::Sprite.new(@win)
131
+ sprite.pos = [10, 15]
132
+ sprite.pos.to_rect.should == Ray::Rect.new(10, 15)
133
+ end
134
+
135
+ it "should allow to use a sprite sheet" do
136
+ sprite = Ray::Sprite.new(@win)
137
+ sprite.sheet_size = [10, 10]
138
+
139
+ sprite.rect.w.should == (@win.w / 10)
140
+ sprite.rect.h.should == (@win.h / 10)
141
+ end
142
+
143
+ it "should allow to change the cell which will be drawn" do
144
+ sprite = Ray::Sprite.new(@win)
145
+ sprite.sheet_size = [10, 10]
146
+ sprite.sheet_pos = [3, 6]
147
+
148
+ sprite.from_rect.should == Ray::Rect.new((@win.w / 10) * 3,
149
+ (@win.h / 10) * 6,
150
+ @win.w / 10, @win.h / 10)
151
+ end
152
+
153
+ it "should allow to disable the use of a sprite sheet" do
154
+ sprite = Ray::Sprite.new(@win)
155
+ sprite.sheet_size = [10, 10]
156
+ sprite.disable_sprite_sheet
157
+ sprite.from_rect.should == Ray::Rect.new(0, 0, @win.w, @win.h)
158
+ end
159
+
160
+ after :all do
161
+ Ray.stop
162
+ end
163
+ end
Binary file
Binary file
data/spec/res/pop.wav ADDED
Binary file
data/spec/spec.opts ADDED
@@ -0,0 +1,4 @@
1
+ --format html:report.html
2
+ --format p
3
+ -c
4
+ --diff
@@ -0,0 +1,8 @@
1
+ $: << File.expand_path(File.join(File.dirname(__FILE__), "..", "ext"))
2
+ $: << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
3
+
4
+ def path_of(res)
5
+ File.expand_path(File.join(File.dirname(__FILE__), "res", res))
6
+ end
7
+
8
+ require 'ray'
data/yard_ext.rb ADDED
@@ -0,0 +1,91 @@
1
+ require 'yard'
2
+
3
+ class MatcherHandler < YARD::Handlers::Ruby::Base
4
+ handles method_call(:describe_matcher)
5
+
6
+ def process
7
+ src = statement.parameters.children.first.source[1..-1]
8
+ MethodObject.new(P("Ray::Matchers"), src) do |o|
9
+ register(o)
10
+
11
+ args = statement.last.first
12
+ if args
13
+ o.parameters = [args.source]
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ class CustomCParser < YARD::Parser::CParser
20
+ include YARD
21
+
22
+ def parse
23
+ super
24
+ parse_constants
25
+ end
26
+
27
+ private
28
+
29
+ def find_method_body(object, func_name, content = @content)
30
+ case content
31
+ when %r"((?>/\*.*?\*/\s*))(?:(?:static|SWIGINTERN)\s+)?(?:intern\s+)?VALUE\s+#{func_name}
32
+ \s*(\([^)]*\))([^;]|$)"xm
33
+ comment, params = $1, $2
34
+ body_text = $&
35
+
36
+ remove_private_comments(comment) if comment
37
+
38
+ # see if we can find the whole body
39
+
40
+ re = Regexp.escape(body_text.strip) + '[^(]*\{.*?^\}'
41
+ if /#{re}/m =~ content
42
+ body_text = $&
43
+ end
44
+
45
+ # The comment block may have been overridden with a 'Document-method'
46
+ # block. This happens in the interpreter when multiple methods are
47
+ # vectored through to the same C method but those methods are logically
48
+ # distinct (for example Kernel.hash and Kernel.object_id share the same
49
+ # implementation
50
+
51
+ # override_comment = find_override_comment(object)
52
+ # comment = override_comment if override_comment
53
+
54
+ object.docstring = parse_comments(object, comment) if comment
55
+ object.source = body_text
56
+ when %r{((?>/\*.*?\*/\s*))^\s*\#\s*define\s+#{func_name}\s+(\w+)}m
57
+ comment = $1
58
+ find_method_body(object, $2, content)
59
+ else
60
+ # No body, but might still have an override comment
61
+ # comment = find_override_comment(object)
62
+ comment = nil
63
+ object.docstring = parse_comments(object, comment) if comment
64
+ end
65
+ end
66
+
67
+ def handle_constants(type, var_name, const_name, definition)
68
+ namespace = @namespaces[var_name]
69
+ obj = CodeObjects::ConstantObject.new(namespace, const_name)
70
+ obj.value = definition
71
+ end
72
+
73
+ def parse_constants
74
+ @content.scan(%r{\Wrb_define_
75
+ ( variable |
76
+ readonly_variable |
77
+ const |
78
+ global_const | )
79
+ \s*\(
80
+ (?:\s*(\w+),)?
81
+ \s*"(\w+)",
82
+ \s*(.*?)\s*\)\s*;
83
+ }xm) do |type, var_name, const_name, definition|
84
+ var_name = "rb_cObject" if !var_name or var_name == "rb_mKernel"
85
+ handle_constants type, var_name, const_name, definition
86
+ end
87
+ end
88
+ end
89
+
90
+ YARD::Parser::SourceParser.register_parser_type(:c, CustomCParser,
91
+ ['c', 'cc', 'cxx', 'cpp'])