ray 0.0.0.pre2 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rspec +3 -0
- data/README.md +62 -0
- data/Rakefile +33 -23
- data/VERSION +1 -1
- data/ext/audio.c +473 -0
- data/ext/color.c +4 -4
- data/ext/event.c +25 -3
- data/ext/extconf.rb +35 -22
- data/ext/font.c +287 -0
- data/ext/image.c +682 -33
- data/ext/joystick.c +9 -9
- data/ext/ray.c +166 -55
- data/ext/ray.h +120 -9
- data/ext/ray_osx.m +161 -0
- data/ext/rect.c +31 -4
- data/lib/ray/audio.rb +52 -0
- data/lib/ray/color.rb +16 -0
- data/lib/ray/dsl.rb +1 -3
- data/lib/ray/dsl/event.rb +1 -39
- data/lib/ray/dsl/event_listener.rb +38 -0
- data/lib/ray/dsl/event_runner.rb +3 -1
- data/lib/ray/dsl/event_translator.rb +74 -8
- data/lib/ray/dsl/handler.rb +3 -33
- data/lib/ray/dsl/matcher.rb +129 -23
- data/lib/ray/font.rb +108 -0
- data/lib/ray/font_set.rb +37 -0
- data/lib/ray/game.rb +171 -34
- data/lib/ray/helper.rb +43 -5
- data/lib/ray/image.rb +90 -3
- data/lib/ray/image_set.rb +35 -0
- data/lib/ray/joystick.rb +30 -0
- data/lib/ray/music_set.rb +35 -0
- data/lib/ray/ray.rb +17 -9
- data/lib/ray/rect.rb +51 -0
- data/lib/ray/resource_set.rb +92 -0
- data/lib/ray/scene.rb +220 -51
- data/lib/ray/sound_set.rb +35 -0
- data/lib/ray/sprite.rb +184 -0
- data/psp/ext.c +4 -0
- data/samples/hello_world/hello.rb +35 -0
- data/samples/hello_world/hello_dsl.rb +24 -0
- data/samples/pong/pong.rb +128 -0
- data/samples/sokoban/level_1 +7 -0
- data/samples/sokoban/sokoban.rb +370 -0
- data/spec/ray/audio_spec.rb +146 -0
- data/spec/ray/color_spec.rb +13 -0
- data/spec/ray/event_spec.rb +57 -168
- data/spec/ray/font_spec.rb +93 -0
- data/spec/ray/image_set_spec.rb +48 -0
- data/spec/ray/image_spec.rb +130 -44
- data/spec/ray/joystick_spec.rb +13 -9
- data/spec/ray/matcher_spec.rb +32 -55
- data/spec/ray/ray_spec.rb +33 -31
- data/spec/ray/rect_spec.rb +80 -0
- data/spec/ray/resource_set_spec.rb +105 -0
- data/spec/ray/sprite_spec.rb +163 -0
- data/spec/res/VeraMono.ttf +0 -0
- data/spec/res/aqua2.bmp +0 -0
- data/spec/res/pop.wav +0 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +8 -0
- data/yard_ext.rb +91 -0
- metadata +104 -38
- data/bin/ray +0 -5
- data/bin/ray_irb +0 -4
- data/ext/SDLMain.h +0 -17
- data/ext/SDLMain.m +0 -381
- data/lib/ray/config.rb +0 -84
- data/lib/ray/dsl/converter.rb +0 -65
- data/lib/ray/dsl/listener.rb +0 -30
- data/lib/ray/dsl/type.rb +0 -58
- data/spec/ray/config_spec.rb +0 -90
- data/spec/ray/conversion_spec.rb +0 -43
- data/spec/ray/type_spec.rb +0 -17
- data/spec_runner.rb +0 -27
data/lib/ray/helper.rb
CHANGED
@@ -1,17 +1,55 @@
|
|
1
1
|
module Ray
|
2
|
-
#
|
3
|
-
# It allows you to play with events (listen to them, raise them) and
|
4
|
-
# includes the matchers you described, which you may want to use when
|
5
|
-
# you want to listen to the events matching a condition.
|
2
|
+
# Module including many helpful modules and methods.
|
6
3
|
module Helper
|
7
4
|
include Ray::DSL::EventRaiser
|
8
|
-
include Ray::DSL::
|
5
|
+
include Ray::DSL::EventListener
|
9
6
|
|
10
7
|
include Ray::Matchers
|
11
8
|
|
9
|
+
# Sets the event runner for this object.
|
12
10
|
def event_runner=(value)
|
13
11
|
self.listener_runner = value
|
14
12
|
self.raiser_runner = value
|
15
13
|
end
|
14
|
+
|
15
|
+
# @return [DSL::EventRunner] The event runner used to handle event.
|
16
|
+
def event_runner
|
17
|
+
listener_runner
|
18
|
+
end
|
19
|
+
|
20
|
+
# Creates an event runner for this object
|
21
|
+
def create_event_runner
|
22
|
+
self.event_runner = Ray::DSL::EventRunner.new
|
23
|
+
end
|
24
|
+
|
25
|
+
# @see Ray::ImageSet.[]
|
26
|
+
def image(name)
|
27
|
+
Ray::ImageSet[name]
|
28
|
+
end
|
29
|
+
|
30
|
+
# @see Ray::Sprite#initialize
|
31
|
+
def sprite(image, opts = {})
|
32
|
+
Ray::Sprite.new(image, opts)
|
33
|
+
end
|
34
|
+
|
35
|
+
# @see Ray::Channel#initialize
|
36
|
+
def channel(id)
|
37
|
+
Ray::Channel.new(id)
|
38
|
+
end
|
39
|
+
|
40
|
+
# @see Ray::MusicSet.[]
|
41
|
+
def sound(file)
|
42
|
+
Ray::SoundSet[file]
|
43
|
+
end
|
44
|
+
|
45
|
+
# @see Ray::MusicSet.[]
|
46
|
+
def music(file)
|
47
|
+
Ray::MusicSet[file]
|
48
|
+
end
|
49
|
+
|
50
|
+
# @see Ray::FontSet.[]
|
51
|
+
def font(name, size)
|
52
|
+
Ray::FontSet[name, size]
|
53
|
+
end
|
16
54
|
end
|
17
55
|
end
|
data/lib/ray/image.rb
CHANGED
@@ -1,11 +1,98 @@
|
|
1
1
|
module Ray
|
2
2
|
class Image
|
3
3
|
def inspect
|
4
|
-
"#<#{self} w=#{w} h=#{h}
|
4
|
+
"#<#{self.class} w=#{w} h=#{h}>"
|
5
5
|
end
|
6
6
|
|
7
7
|
alias :bits_per_pixel :bpp
|
8
|
-
alias :
|
9
|
-
alias :
|
8
|
+
alias :w :width
|
9
|
+
alias :h :height
|
10
|
+
|
11
|
+
alias :draw :blit
|
12
|
+
alias :update :flip
|
13
|
+
|
14
|
+
extend Ray::ResourceSet
|
15
|
+
add_set(/^(.*)$/) { |filename| new(filename) }
|
16
|
+
|
17
|
+
# @yield [pixel]
|
18
|
+
# @yieldparam [Ray::Color] pixel Color of a point
|
19
|
+
def each
|
20
|
+
return Enumerator.new(self, :each) unless block_given?
|
21
|
+
|
22
|
+
(0...w).each do |x|
|
23
|
+
(0...h).each do |y|
|
24
|
+
yield self[x, y]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
# Same as each, but also yields the position of each point.
|
32
|
+
# @yield [x, y, pixel]
|
33
|
+
def each_with_pos
|
34
|
+
return Enumerator.new(self, :each_with_pos) unless block_given?
|
35
|
+
|
36
|
+
(0...w).each do |x|
|
37
|
+
(0...h).each do |y|
|
38
|
+
yield x, y, self[x, y]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
# @yield [pixel] Block returning the new color of this pixel.
|
46
|
+
def map!
|
47
|
+
return Enumerator.new(self, :map!) unless block_given?
|
48
|
+
|
49
|
+
lock do
|
50
|
+
(0...w).each do |x|
|
51
|
+
(0...h).each do |y|
|
52
|
+
self[x, y] = yield self[x, y]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
self
|
58
|
+
end
|
59
|
+
|
60
|
+
# @yield [x, y, pixel] Block returning the new color of this pixel
|
61
|
+
def map_with_pos!
|
62
|
+
return Enumerator.new(self, :map_with_pos!) unless block_given?
|
63
|
+
|
64
|
+
lock do
|
65
|
+
(0...w).each do |x|
|
66
|
+
(0...h).each do |y|
|
67
|
+
self[x, y] = yield x, y, self[x, y]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
# @return [Ray::Image] New image created according to a block.
|
76
|
+
def map(&block)
|
77
|
+
dup.map!(&block)
|
78
|
+
end
|
79
|
+
|
80
|
+
# @return [Ray::Image] New image created according to a block.
|
81
|
+
def map_with_pos(&block)
|
82
|
+
dup.map_with_pos!(&block)
|
83
|
+
end
|
84
|
+
|
85
|
+
def to_image
|
86
|
+
self
|
87
|
+
end
|
88
|
+
|
89
|
+
include Enumerable
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class String
|
94
|
+
# Converts the string to an image using Ray::ImageSet.[]
|
95
|
+
def to_image
|
96
|
+
Ray::ImageSet[self]
|
10
97
|
end
|
11
98
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Ray
|
2
|
+
module ImageSet
|
3
|
+
extend Ray::ResourceSet
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def missing_pattern(string)
|
7
|
+
Ray::Image[string]
|
8
|
+
end
|
9
|
+
|
10
|
+
def select!(&block)
|
11
|
+
super(&block)
|
12
|
+
Ray::Image.select!(&block)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Creates a new image set.
|
18
|
+
#
|
19
|
+
# @param [Regexp] regex Regular expression used to match file
|
20
|
+
# @yield [*args] Block returning the image
|
21
|
+
# @yieldparam args Regex captures
|
22
|
+
def self.image_set(regex, &block)
|
23
|
+
Ray::ImageSet.add_set(regex, &block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
begin
|
28
|
+
require 'open-uri'
|
29
|
+
|
30
|
+
Ray.image_set(/^(http|ftp):\/\/(\S+)$/) do |protocol, address|
|
31
|
+
open("#{protocol}://#{address}") { |io| Ray::Image.new(io) }
|
32
|
+
end
|
33
|
+
rescue LoadError
|
34
|
+
# that image set is not needed
|
35
|
+
end
|
data/lib/ray/joystick.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Ray
|
2
|
+
class Joystick
|
3
|
+
@@joysticks = Hash.new { |h, k| h[k] = new(k) }
|
4
|
+
|
5
|
+
class << self
|
6
|
+
# @return [Ray::Joystick] an opened joystick
|
7
|
+
def [](id)
|
8
|
+
joy = @@joysticks[id]
|
9
|
+
joy.open if joy.closed?
|
10
|
+
joy
|
11
|
+
end
|
12
|
+
|
13
|
+
# Enumerates through all the joysitcks.
|
14
|
+
#
|
15
|
+
# @yield [joystick]
|
16
|
+
# @yieldparam [Ray::Joystick] joystick
|
17
|
+
def each
|
18
|
+
return Enumerator.new(self, :each) unless block_given?
|
19
|
+
|
20
|
+
(0...count).each do |i|
|
21
|
+
yield self[i]
|
22
|
+
end
|
23
|
+
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
include Enumerable
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Ray
|
2
|
+
module MusicSet
|
3
|
+
extend Ray::ResourceSet
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def missing_pattern(string)
|
7
|
+
Ray::Music[string, size]
|
8
|
+
end
|
9
|
+
|
10
|
+
def select!(&block)
|
11
|
+
super(&block)
|
12
|
+
Ray::Music.select!(&block)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Creates a new music set.
|
18
|
+
#
|
19
|
+
# @param [Regexp] regex Regular expression used to match file
|
20
|
+
# @yield [*args] Block returning the music
|
21
|
+
#
|
22
|
+
# @yieldparam args Regex captures
|
23
|
+
def self.music_set(regex, &block)
|
24
|
+
Ray::MusicSet.add_set(regex, &block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'open-uri'
|
30
|
+
|
31
|
+
Ray.music_set(/^(http|ftp):\/\/(\S+)$/) do |protocol, address|
|
32
|
+
open("#{protocol}://#{address}") { |io| Ray::Music.new(io) }
|
33
|
+
end
|
34
|
+
rescue LoadError
|
35
|
+
end
|
data/lib/ray/ray.rb
CHANGED
@@ -1,19 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
end
|
1
|
+
require 'enumerator'
|
2
|
+
|
3
|
+
# 'ray_ext' doesn't exist on the PSP.
|
4
|
+
# We assume that Ray isn't defined in other cases.
|
5
|
+
require 'ray_ext' unless defined? Ray
|
6
|
+
|
7
|
+
require 'ray/resource_set'
|
9
8
|
|
10
9
|
require 'ray/color'
|
11
10
|
require 'ray/rect'
|
11
|
+
require 'ray/image'
|
12
|
+
require 'ray/joystick'
|
13
|
+
require 'ray/font' if Ray.has_font_support?
|
14
|
+
require 'ray/audio' if Ray.has_audio_support?
|
12
15
|
|
13
|
-
require 'ray/
|
16
|
+
require 'ray/image_set'
|
17
|
+
require 'ray/font_set' if Ray.has_font_support?
|
18
|
+
require 'ray/sound_set' if Ray.has_audio_support?
|
19
|
+
require 'ray/music_set' if Ray.has_audio_support?
|
14
20
|
|
15
21
|
require 'ray/dsl'
|
16
22
|
require 'ray/helper'
|
17
23
|
|
24
|
+
require 'ray/sprite'
|
25
|
+
|
18
26
|
require 'ray/scene'
|
19
27
|
require 'ray/game'
|
data/lib/ray/rect.rb
CHANGED
@@ -4,6 +4,43 @@ module Ray
|
|
4
4
|
"#<#{self.class} {{#{x}, #{y}}, {#{w}, #{h}}}>"
|
5
5
|
end
|
6
6
|
|
7
|
+
# @return [true, false] True if the receiver is inside the rect.
|
8
|
+
# (false if they just collide)
|
9
|
+
def inside?(rect)
|
10
|
+
(x >= rect.x) && (y >= rect.y) &&
|
11
|
+
(x + w) <= (rect.x + rect.w) &&
|
12
|
+
(y + h) <= (rect.y + rect.h)
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [true, false] True if the receiver is outside the rect.
|
16
|
+
def outside?(rect)
|
17
|
+
!rect.contain?(x, y) &&
|
18
|
+
!rect.contain?(x, y + h) &&
|
19
|
+
!rect.contain?(x + w, y) &&
|
20
|
+
!rect.contain?(x + w, y + h)
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [true, false] True if the receiver collides with the rect.
|
24
|
+
def collide?(rect)
|
25
|
+
!outside?(rect)
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [true, false] True if the receiver contians this point
|
29
|
+
def contain?(p_x, p_y)
|
30
|
+
(p_x >= x) && (p_y >= y) &&
|
31
|
+
(p_x < x + w) && (p_y < y + h)
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [true, false] True if the two rects are equal
|
35
|
+
def ==(rect)
|
36
|
+
return false unless rect.is_a? Rect
|
37
|
+
x == rect.x && y == rect.y && w == rect.w && h == rect.h
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_rect
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
7
44
|
alias :w :width
|
8
45
|
alias :h :height
|
9
46
|
|
@@ -11,3 +48,17 @@ module Ray
|
|
11
48
|
alias :h= :height=
|
12
49
|
end
|
13
50
|
end
|
51
|
+
|
52
|
+
class Array
|
53
|
+
# Converts an Array to a rect
|
54
|
+
def to_rect
|
55
|
+
Ray::Rect.new(*self)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class Hash
|
60
|
+
# Converts a Hash to a rect
|
61
|
+
def to_rect
|
62
|
+
Ray::Rect.new(self)
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Ray
|
2
|
+
# Exception raised when a pattern isn't found in ResourceSet
|
3
|
+
class NoPatternError < StandardError; end
|
4
|
+
|
5
|
+
# Mixin used to cache resources. It allows to register different block
|
6
|
+
# to create the resources using a regexp:
|
7
|
+
# add_set(/^http://(.+)$/) do |url| # captures are passed to the block
|
8
|
+
# ...
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# Custom arguments can also be specified:
|
12
|
+
# add_set(/^http://(.+)/) do |url, priority| # arguments are passed at the end
|
13
|
+
# ...
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# Notice you would usually use extend instead of include to use this module.
|
17
|
+
#
|
18
|
+
module ResourceSet
|
19
|
+
# Registers a block for handling some resources.
|
20
|
+
def add_set(regexp, &block)
|
21
|
+
set_hash[regexp] = Hash.new do |hash, args|
|
22
|
+
regexp =~ args.first
|
23
|
+
|
24
|
+
block_args = $~.captures + args[1..-1]
|
25
|
+
hash[args] = block.call(*block_args)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_hash
|
30
|
+
(@set_hash ||= {})
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return The object corresponding to a given list of parameters.
|
34
|
+
def [](value, *params)
|
35
|
+
if params.size != required_argument_count
|
36
|
+
raise(ArgumentError, "wrong number of arguments (%d for %d)" %
|
37
|
+
[params.size, required_argument_count])
|
38
|
+
end
|
39
|
+
|
40
|
+
set_hash.each do |regexp, hash|
|
41
|
+
return hash[([value] + params)] if regexp =~ value
|
42
|
+
end
|
43
|
+
|
44
|
+
missing_pattern(value, *params)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Selects objects matching a condition.
|
48
|
+
#
|
49
|
+
# @yield *arguments, object
|
50
|
+
# @yieldparam *arguments All the arguments used to access that object
|
51
|
+
# @yieldparam object the actual resource
|
52
|
+
def select!(&block)
|
53
|
+
return Enumerator.new(self, :select!) unless block_given?
|
54
|
+
|
55
|
+
set_hash.each do |regexp, hash|
|
56
|
+
hash.delete_if do |key, val|
|
57
|
+
!block.call(*(key + [val]))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Removes all the objects from the array but those for which
|
63
|
+
# block returned true.
|
64
|
+
#
|
65
|
+
# @yield *arguments, object (See #select!)
|
66
|
+
def reject!(&block)
|
67
|
+
return Enumerator.new(self, :reject!) unless block_given?
|
68
|
+
select! { |*args| !block.call(*args) }
|
69
|
+
end
|
70
|
+
|
71
|
+
alias :delete_if :reject!
|
72
|
+
|
73
|
+
# Sets the required argument count. The number of arguments passed to []
|
74
|
+
# must be equal to this + 1 (the first argument isn't counted and is required)
|
75
|
+
#
|
76
|
+
# Defaulted to 0.
|
77
|
+
def need_argument_count(n)
|
78
|
+
@set_argument_count = n
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns the required argument count.
|
82
|
+
def required_argument_count
|
83
|
+
@set_argument_count ||= 0
|
84
|
+
end
|
85
|
+
|
86
|
+
# Method called when a string isn't matched by any pattern.
|
87
|
+
# Raises a NoPatternError excpetion by default.
|
88
|
+
def missing_pattern(string, *args)
|
89
|
+
raise NoPatternError, "#{string.inspect} not macthed by any pattern"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|