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/config.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
require 'singleton'
|
2
|
-
|
3
|
-
module Ray
|
4
|
-
# A class holding program wide settings.
|
5
|
-
# @example
|
6
|
-
# Ray::Config.config do
|
7
|
-
# set :value, :string => 3 # Conversion
|
8
|
-
# set :value, "3"
|
9
|
-
# set :value, {3 => 4} # Ray::Config[:value] == {3 => 4}
|
10
|
-
# set :value, :string => 3, :hash => {} # No conversion either
|
11
|
-
# unest :value # set to nil
|
12
|
-
# end
|
13
|
-
class Config
|
14
|
-
include Singleton
|
15
|
-
|
16
|
-
class << self
|
17
|
-
# @return [Object] the value for key
|
18
|
-
def [](key)
|
19
|
-
instance[key]
|
20
|
-
end
|
21
|
-
|
22
|
-
# Yields the instance of Config if the block takes an argument.
|
23
|
-
# Uses instance_eval in other cases.
|
24
|
-
def config(&block)
|
25
|
-
if block.arity == 1
|
26
|
-
block.call(instance)
|
27
|
-
else
|
28
|
-
instance.instance_eval(&block)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
# Clears all the settings, and then calls config.
|
33
|
-
def config!(&block)
|
34
|
-
instance.clear
|
35
|
-
config(&block)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def initialize
|
40
|
-
@settings = {}
|
41
|
-
end
|
42
|
-
|
43
|
-
# @return [Object] The value for key
|
44
|
-
def [](key)
|
45
|
-
@settings[key]
|
46
|
-
end
|
47
|
-
|
48
|
-
# Sets the value for key
|
49
|
-
def []=(key, value)
|
50
|
-
@settings[key] = value
|
51
|
-
end
|
52
|
-
|
53
|
-
# Clears all the settings
|
54
|
-
def clear
|
55
|
-
@settings.clear
|
56
|
-
end
|
57
|
-
|
58
|
-
# Sets the value for a key.
|
59
|
-
# If value is a Hash, and if it contains only one element, and if the
|
60
|
-
# only key of this hash is a known type, it will convert the value to
|
61
|
-
# the one represented by the key.
|
62
|
-
#
|
63
|
-
# @example A conversion
|
64
|
-
# set :foo, :string => 3 # set :foo, "3"
|
65
|
-
def set(key, value)
|
66
|
-
if value.is_a?(Hash) && value.size == 1
|
67
|
-
type, val = value.keys.first, value.values.first
|
68
|
-
|
69
|
-
if Ray.know_type? type
|
70
|
-
self[key] = Ray.convert(val, type)
|
71
|
-
else
|
72
|
-
self[key] = value
|
73
|
-
end
|
74
|
-
else
|
75
|
-
self[key] = value
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
# Removes the value for this key.
|
80
|
-
def unset(key)
|
81
|
-
@settings.delete(key)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
data/lib/ray/dsl/converter.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
module Ray
|
2
|
-
module DSL
|
3
|
-
# Module sroing all the regitred converters. You should never
|
4
|
-
# need to use it directly.
|
5
|
-
module Converter
|
6
|
-
@@converters = {}
|
7
|
-
|
8
|
-
class << self
|
9
|
-
def add_converter(from, to, &block)
|
10
|
-
@@converters[Ray.resolve_type(from) => Ray.resolve_type(to)] = block
|
11
|
-
end
|
12
|
-
|
13
|
-
def convert(obj, target)
|
14
|
-
unless target.is_a? Module
|
15
|
-
return convert(obj, Ray.resolve_type(target))
|
16
|
-
end
|
17
|
-
|
18
|
-
if converter = @@converters[obj.class => target] # Direct converter
|
19
|
-
return converter.call(obj)
|
20
|
-
end
|
21
|
-
|
22
|
-
@@converters.each do |hash, converter|
|
23
|
-
from, to = hash.keys.first, hash.values.first
|
24
|
-
|
25
|
-
if obj.is_a?(from) && to.ancestors.include?(target)
|
26
|
-
return converter.call(obj)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
if target == Integer
|
31
|
-
return obj.to_i if obj.respond_to? :to_i
|
32
|
-
elsif target == Float
|
33
|
-
return obj.to_f if obj.respond_to? :to_f
|
34
|
-
elsif target == String
|
35
|
-
return obj.to_s if obj.respond_to? :to_s
|
36
|
-
end
|
37
|
-
|
38
|
-
raise TypeError, "Can't convert #{obj.class} into #{target}"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Converts an object to a given type. target can be a Module or
|
45
|
-
# an object registred as a type.
|
46
|
-
#
|
47
|
-
# If there is a converter that can directly convert from obj.class to target,
|
48
|
-
# it will be used. If there isn't, it will see it will search in
|
49
|
-
# obj.class.ancestors and in target's subclasses.
|
50
|
-
def self.convert(obj, target)
|
51
|
-
DSL::Converter.convert(obj, target)
|
52
|
-
end
|
53
|
-
|
54
|
-
# Adds a block telling to ray how to convert from a type to another one.
|
55
|
-
# @example Converting from String to Array
|
56
|
-
# Ray.describe_conversion(:string => Array) do |s| # registred type or module
|
57
|
-
# s.split('')
|
58
|
-
# end
|
59
|
-
# @example declaring multiple conversions at once
|
60
|
-
def self.describe_conversion(hash, &block)
|
61
|
-
hash.each do |from, to|
|
62
|
-
DSL::Converter.add_converter(from, to, &block)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
data/lib/ray/dsl/listener.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module Ray
|
2
|
-
module DSL
|
3
|
-
# The module that allows you to do something when something else happened.
|
4
|
-
module Listener
|
5
|
-
# The args part of this method may help you to say when you want your
|
6
|
-
# block to be called. Each argument applies to one argument of the
|
7
|
-
# event, and they must all match or your block won't get called.
|
8
|
-
#
|
9
|
-
# It will use == to see if two objects match, except in two cases: if you
|
10
|
-
# pass a Matcher, it will use match?, and if you pass a regex it will try
|
11
|
-
# to use =~.
|
12
|
-
#
|
13
|
-
# Your block will be called with the same arguments as the event, just in
|
14
|
-
# case you'd need them.
|
15
|
-
#
|
16
|
-
def on(event, *args, &block)
|
17
|
-
return unless listener_runner
|
18
|
-
listener_runner.add_handler(event, args, block)
|
19
|
-
end
|
20
|
-
|
21
|
-
def listener_runner
|
22
|
-
@__listener_runner
|
23
|
-
end
|
24
|
-
|
25
|
-
def listener_runner=(arg)
|
26
|
-
@__listener_runner = arg
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
data/lib/ray/dsl/type.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
module Ray
|
2
|
-
module DSL
|
3
|
-
# The module that knows about all the type you registred.
|
4
|
-
module Type
|
5
|
-
@@types = {}
|
6
|
-
|
7
|
-
class << self
|
8
|
-
def register_type(name, klass)
|
9
|
-
@@types[name] = klass
|
10
|
-
end
|
11
|
-
|
12
|
-
def know_type?(name)
|
13
|
-
(@@types[name] != nil)
|
14
|
-
end
|
15
|
-
|
16
|
-
def resolve_type(name)
|
17
|
-
@@types[name]
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Registers a type. It allows you to say name instead of klass
|
24
|
-
# when Ray asks you for a typename.
|
25
|
-
# @param [Symbol] name The object that will represent klass
|
26
|
-
# @param [Module] klass The class name will be resolved as
|
27
|
-
def self.register_type(name, klass)
|
28
|
-
DSL::Type.register_type(name, klass)
|
29
|
-
end
|
30
|
-
|
31
|
-
# @return [true, false] True if name is a known type
|
32
|
-
def self.know_type?(name)
|
33
|
-
DSL::Type.know_type?(name)
|
34
|
-
end
|
35
|
-
|
36
|
-
# @param [Module, Symbol] name An object supposed to identify a module or a
|
37
|
-
# class.
|
38
|
-
# @return [Module, nil] The matchig module
|
39
|
-
def self.resolve_type(name)
|
40
|
-
if name.is_a? Module
|
41
|
-
name
|
42
|
-
else
|
43
|
-
DSL::Type.resolve_type(name)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
register_type(:image, Ray::Image)
|
48
|
-
register_type(:color, Ray::Color)
|
49
|
-
|
50
|
-
register_type(:string, String)
|
51
|
-
register_type(:array, Array)
|
52
|
-
register_type(:hash, Hash)
|
53
|
-
register_type(:integer, Integer)
|
54
|
-
register_type(:float, Float)
|
55
|
-
register_type(:numeric, Numeric)
|
56
|
-
|
57
|
-
register_type(:anything, Object)
|
58
|
-
end
|
data/spec/ray/config_spec.rb
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
describe Ray::Config do
|
2
|
-
describe ".config" do
|
3
|
-
it "should allow to add new settings" do
|
4
|
-
Ray::Config.config do |c|
|
5
|
-
c[:val] = :obj
|
6
|
-
c[:val].should == :obj
|
7
|
-
end
|
8
|
-
|
9
|
-
Ray::Config[:val].should == :obj
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should use instance_eval if the block takes no argument" do
|
13
|
-
Ray::Config.config do
|
14
|
-
self.class.should == Ray::Config
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "'s not set settings" do
|
20
|
-
it "should be nil" do
|
21
|
-
Ray::Config[:dont_put_a_value_here].should be_nil
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe ".config!" do
|
26
|
-
it "should reset every setting" do
|
27
|
-
Ray::Config.config! do |c|
|
28
|
-
c[:bar] = 3
|
29
|
-
end
|
30
|
-
|
31
|
-
Ray::Config[:bar].should == 3
|
32
|
-
Ray::Config.config! {}
|
33
|
-
Ray::Config[:bar].should be_nil
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe "#set" do
|
38
|
-
context "if the second argument is not a hash" do
|
39
|
-
it "should set the value directly" do
|
40
|
-
Ray::Config.config do |conf|
|
41
|
-
conf.set :value, :val
|
42
|
-
conf[:value].should == :val
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context "if the second argument is a hash" do
|
48
|
-
context "with only one element" do
|
49
|
-
context "if the key is a known type" do
|
50
|
-
it "should convert the object" do
|
51
|
-
Ray::Config.config do |conf|
|
52
|
-
conf.set :value, :string => 3
|
53
|
-
conf[:value].should == "3"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
context "if the key is not a know type" do
|
59
|
-
it "should set the value directly" do
|
60
|
-
Ray::Config.config do |conf|
|
61
|
-
conf.set :value, 3 => "bar"
|
62
|
-
conf[:value].should == {3 => "bar"}
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
context "with more or less than one element" do
|
69
|
-
it "should set the value directly" do
|
70
|
-
Ray::Config.config do |conf|
|
71
|
-
conf.set :value, {}
|
72
|
-
conf[:value].should == {}
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
describe "#unset" do
|
80
|
-
it "should set the value to nil" do
|
81
|
-
Ray::Config.config do |conf|
|
82
|
-
conf[:x] = 3
|
83
|
-
conf[:x].should == 3
|
84
|
-
|
85
|
-
conf.unset :x
|
86
|
-
conf[:x].should be_nil
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
data/spec/ray/conversion_spec.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
class TestClass; end
|
2
|
-
class SubTest < TestClass; end
|
3
|
-
class OtherTest; end
|
4
|
-
class YATest; end
|
5
|
-
|
6
|
-
Ray.describe_conversion(TestClass => OtherTest) { OtherTest.new }
|
7
|
-
Ray.describe_conversion(YATest => SubTest) { SubTest.new }
|
8
|
-
Ray.describe_conversion(OtherTest => SubTest) { SubTest.new }
|
9
|
-
Ray.describe_conversion(OtherTest => TestClass) { TestClass.new }
|
10
|
-
|
11
|
-
describe "conversions" do
|
12
|
-
context "when the requested conversion is known" do
|
13
|
-
it "should convert the object" do
|
14
|
-
Ray.convert(TestClass.new, OtherTest).should be_an(OtherTest)
|
15
|
-
end
|
16
|
-
|
17
|
-
context "even for a sub-class of the target" do
|
18
|
-
it "should convert the object" do
|
19
|
-
Ray.convert(YATest.new, TestClass).should be_a(TestClass)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
context "and there is a direct way to convert it" do
|
24
|
-
it "should use it" do
|
25
|
-
obj = Ray.convert(OtherTest.new, TestClass)
|
26
|
-
obj.should be_a(TestClass)
|
27
|
-
obj.should_not be_a(SubTest)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should not create an instance of a superclass of the expected type" do
|
32
|
-
Ray.convert(OtherTest.new, SubTest).class.should_not == TestClass
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
context "when there's not available conversion" do
|
37
|
-
it "should raise a type error" do
|
38
|
-
lambda {
|
39
|
-
Ray.convert(YATest.new, OtherTest)
|
40
|
-
}.should raise_exception(TypeError)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
data/spec/ray/type_spec.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
describe "Ray.resolve_type" do
|
2
|
-
context "when given a module" do
|
3
|
-
it "should return it" do
|
4
|
-
Ray.resolve_type(Class).should == Class
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
context "when given something else" do
|
9
|
-
it "should return nil if it's not registred" do
|
10
|
-
Ray.resolve_type(3).should == nil
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should return a module if it is registred" do
|
14
|
-
Ray.resolve_type(:string).should == String
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
data/spec_runner.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
$: << "./ext/" << "./lib/"
|
2
|
-
path = File.expand_path(File.join(File.dirname(__FILE__), "ext/ray"))
|
3
|
-
our_path = File.expand_path(File.join(File.dirname(__FILE__), "spec_runner.rb"))
|
4
|
-
|
5
|
-
unless defined? Ray
|
6
|
-
unless RUBY_PLATFORM =~ /darwin/
|
7
|
-
require 'ray_ext'
|
8
|
-
else
|
9
|
-
if File.exist? path
|
10
|
-
system "#{path} #{our_path}"
|
11
|
-
exit $?.exitstatus
|
12
|
-
else
|
13
|
-
$stderr.puts "please build ray (rake ext)"
|
14
|
-
exit 1
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def path_of(res)
|
20
|
-
File.expand_path(File.join(File.dirname(__FILE__), "spec", "res", res))
|
21
|
-
end
|
22
|
-
|
23
|
-
require 'ray'
|
24
|
-
|
25
|
-
require 'spec'
|
26
|
-
require 'spec/autorun'
|
27
|
-
Dir["spec/**/*_spec.rb"].each { |file| load file }
|