ray 0.0.1 → 0.1.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gemtest +0 -0
- data/.yardopts +4 -0
- data/README.md +17 -21
- data/Rakefile +18 -139
- data/VERSION +1 -1
- data/ext/audio.cpp +723 -0
- data/ext/{color.c → color.cpp} +25 -13
- data/ext/drawable.cpp +91 -0
- data/ext/event.cpp +460 -0
- data/ext/extconf.rb +5 -104
- data/ext/font.cpp +190 -0
- data/ext/image.cpp +733 -0
- data/ext/input.cpp +74 -0
- data/ext/ray.cpp +168 -0
- data/ext/ray.hpp +356 -0
- data/ext/{rect.c → rect.cpp} +51 -37
- data/ext/shader.cpp +169 -0
- data/ext/shape.cpp +409 -0
- data/ext/sprite.cpp +306 -0
- data/ext/text.cpp +181 -0
- data/ext/vector.cpp +215 -0
- data/guide.md +619 -0
- data/lib/ray/audio.rb +0 -41
- data/lib/ray/color.rb +32 -10
- data/lib/ray/drawable.rb +16 -0
- data/lib/ray/dsl/event_listener.rb +25 -2
- data/lib/ray/dsl/event_runner.rb +33 -5
- data/lib/ray/dsl/event_translator.rb +66 -30
- data/lib/ray/dsl/handler.rb +3 -2
- data/lib/ray/dsl/matcher.rb +58 -14
- data/lib/ray/font.rb +38 -96
- data/lib/ray/font_set.rb +8 -8
- data/lib/ray/game.rb +87 -66
- data/lib/ray/helper.rb +105 -10
- data/lib/ray/image.rb +150 -24
- data/lib/ray/image_set.rb +3 -1
- data/lib/ray/input.rb +10 -0
- data/lib/ray/music_set.rb +5 -3
- data/lib/ray/ray.rb +21 -9
- data/lib/ray/rect.rb +48 -7
- data/lib/ray/rmagick.rb +41 -0
- data/lib/ray/scene.rb +99 -43
- data/lib/ray/scene_list.rb +67 -0
- data/lib/ray/shape.rb +132 -0
- data/lib/ray/sound_set.rb +4 -2
- data/lib/ray/sprite.rb +49 -111
- data/lib/ray/text.rb +101 -0
- data/lib/ray/text_helper.rb +37 -0
- data/lib/ray/turtle.rb +215 -0
- data/lib/ray/vector.rb +226 -0
- data/samples/audio/spacial.rb +44 -0
- data/samples/hello_world/hello.rb +9 -13
- data/samples/hello_world/hello_dsl.rb +8 -12
- data/samples/hello_world/text.rb +15 -0
- data/samples/opengl/binding.rb +38 -0
- data/samples/opengl/image.rb +32 -0
- data/samples/opengl/opengl.rb +34 -0
- data/samples/opengl/shader.rb +42 -0
- data/samples/pong/pong.rb +14 -10
- data/samples/run_scene.rb +53 -0
- data/samples/shaders/scene.rb +40 -0
- data/samples/shaders/shaders.rb +42 -0
- data/samples/shaders/shape.rb +34 -0
- data/samples/sokoban/sokoban.rb +18 -18
- data/samples/test/actual_scene.rb +41 -0
- data/samples/test/scene_riot.rb +39 -0
- data/samples/test/scene_spec.rb +32 -0
- data/samples/test/scene_test_unit.rb +25 -0
- data/samples/turtle/byzantium.rb +45 -0
- data/samples/turtle/hilbert.rb +48 -0
- data/samples/turtle/koch.rb +55 -0
- data/samples/turtle/mandala.rb +61 -0
- data/samples/turtle/tree.rb +57 -0
- data/test/audio_test.rb +69 -0
- data/test/color_test.rb +77 -0
- data/test/drawable_test.rb +19 -0
- data/test/dsl_test.rb +93 -0
- data/test/font_test.rb +57 -0
- data/test/helpers.rb +94 -0
- data/test/image_test.rb +82 -0
- data/test/ray_test.rb +25 -0
- data/test/rect_test.rb +121 -0
- data/{spec → test}/res/VeraMono.ttf +0 -0
- data/{spec → test}/res/aqua.bmp +0 -0
- data/{spec → test}/res/aqua.png +0 -0
- data/{spec → test}/res/aqua2.bmp +0 -0
- data/{spec → test}/res/not_a_jpeg.jpeg +0 -0
- data/{spec → test}/res/pop.wav +0 -0
- data/test/resource_set_test.rb +99 -0
- data/test/run_all.rb +7 -0
- data/test/shape_test.rb +101 -0
- data/test/sprite_test.rb +89 -0
- data/test/text_test.rb +78 -0
- data/test/turtle_test.rb +176 -0
- data/test/vector_test.rb +111 -0
- data/yard_ext.rb +0 -28
- metadata +95 -139
- data/.gitignore +0 -23
- data/.gitmodules +0 -3
- data/.rspec +0 -3
- data/ext/audio.c +0 -473
- data/ext/event.c +0 -557
- data/ext/font.c +0 -287
- data/ext/image.c +0 -933
- data/ext/joystick.c +0 -145
- data/ext/ray.c +0 -489
- data/ext/ray.h +0 -245
- data/ext/ray_osx.m +0 -161
- data/lib/ray/joystick.rb +0 -30
- data/psp/SDL_psp_main.c +0 -84
- data/psp/bigdecimal/README +0 -60
- data/psp/bigdecimal/bigdecimal.c +0 -4697
- data/psp/bigdecimal/bigdecimal.h +0 -216
- data/psp/bigdecimal/lib/bigdecimal/jacobian.rb +0 -85
- data/psp/bigdecimal/lib/bigdecimal/ludcmp.rb +0 -84
- data/psp/bigdecimal/lib/bigdecimal/math.rb +0 -235
- data/psp/bigdecimal/lib/bigdecimal/newton.rb +0 -77
- data/psp/bigdecimal/lib/bigdecimal/util.rb +0 -65
- data/psp/digest/bubblebabble/bubblebabble.c +0 -142
- data/psp/digest/defs.h +0 -20
- data/psp/digest/digest.c +0 -643
- data/psp/digest/digest.h +0 -32
- data/psp/digest/lib/digest.rb +0 -50
- data/psp/digest/lib/md5.rb +0 -27
- data/psp/digest/lib/sha1.rb +0 -27
- data/psp/digest/md5/md5.c +0 -420
- data/psp/digest/md5/md5.h +0 -80
- data/psp/digest/md5/md5init.c +0 -40
- data/psp/digest/rmd160/rmd160.c +0 -457
- data/psp/digest/rmd160/rmd160.h +0 -56
- data/psp/digest/rmd160/rmd160init.c +0 -40
- data/psp/digest/sha1/sha1.c +0 -269
- data/psp/digest/sha1/sha1.h +0 -39
- data/psp/digest/sha1/sha1init.c +0 -40
- data/psp/digest/sha2/lib/sha2.rb +0 -73
- data/psp/digest/sha2/sha2.c +0 -919
- data/psp/digest/sha2/sha2.h +0 -109
- data/psp/digest/sha2/sha2init.c +0 -52
- data/psp/enumerator/enumerator.c +0 -298
- data/psp/etc/etc.c +0 -559
- data/psp/ext.c +0 -289
- data/psp/fcntl/fcntl.c +0 -187
- data/psp/lib/rbconfig.rb +0 -178
- data/psp/nkf/lib/kconv.rb +0 -367
- data/psp/nkf/nkf-utf8/config.h +0 -88
- data/psp/nkf/nkf-utf8/nkf.c +0 -6040
- data/psp/nkf/nkf-utf8/utf8tbl.c +0 -8500
- data/psp/nkf/nkf-utf8/utf8tbl.h +0 -34
- data/psp/nkf/nkf.c +0 -654
- data/psp/socket/addrinfo.h +0 -173
- data/psp/socket/getaddrinfo.c +0 -676
- data/psp/socket/getnameinfo.c +0 -270
- data/psp/socket/pspsocket.c +0 -71
- data/psp/socket/pspsocket.h +0 -28
- data/psp/socket/socket.c +0 -4662
- data/psp/socket/sockport.h +0 -76
- data/psp/stringio/stringio.c +0 -1306
- data/psp/strscan/strscan.c +0 -1320
- data/psp/syck/bytecode.c +0 -1166
- data/psp/syck/emitter.c +0 -1242
- data/psp/syck/gram.c +0 -1894
- data/psp/syck/gram.h +0 -79
- data/psp/syck/handler.c +0 -174
- data/psp/syck/implicit.c +0 -2990
- data/psp/syck/node.c +0 -408
- data/psp/syck/rubyext.c +0 -2367
- data/psp/syck/syck.c +0 -504
- data/psp/syck/syck.h +0 -456
- data/psp/syck/token.c +0 -2725
- data/psp/syck/yaml2byte.c +0 -257
- data/psp/syck/yamlbyte.h +0 -170
- data/psp/thread/thread.c +0 -1175
- data/psp/zlib/zlib.c +0 -3547
- data/script.rb +0 -10
- data/spec/ray/audio_spec.rb +0 -146
- data/spec/ray/color_spec.rb +0 -57
- data/spec/ray/event_spec.rb +0 -80
- data/spec/ray/font_spec.rb +0 -93
- data/spec/ray/image_set_spec.rb +0 -48
- data/spec/ray/image_spec.rb +0 -162
- data/spec/ray/joystick_spec.rb +0 -21
- data/spec/ray/matcher_spec.rb +0 -50
- data/spec/ray/ray_spec.rb +0 -88
- data/spec/ray/rect_spec.rb +0 -154
- data/spec/ray/resource_set_spec.rb +0 -105
- data/spec/ray/sprite_spec.rb +0 -163
- data/spec/spec.opts +0 -4
- data/spec/spec_helper.rb +0 -8
data/lib/ray/font.rb
CHANGED
@@ -1,108 +1,50 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
1
3
|
module Ray
|
2
4
|
class Font
|
3
|
-
|
4
|
-
need_argument_count 1
|
5
|
-
add_set(/^(.*)$/) { |filename, size| new(filename, size) }
|
5
|
+
include Ray::TextHelper
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# @
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
# @
|
23
|
-
|
24
|
-
|
7
|
+
extend Ray::ResourceSet
|
8
|
+
add_set(/^(.*)$/) { |filename| new(filename) }
|
9
|
+
|
10
|
+
# @param [String] string The string which should be drawn.
|
11
|
+
#
|
12
|
+
# @option opts [Integer] :size Size of the font
|
13
|
+
# @option opts [String, nil] :encoding Encoding of the text. Guessed in
|
14
|
+
# Ruby 1.9, assumes UTF-8 otherwise.
|
15
|
+
# @option opts [Integer, Array<Symbol>] :style Flags for the font style.
|
16
|
+
# Valid symbols are :normal, :italic, :bold, and :underline.
|
17
|
+
# @option opts [Ray::Color] :color Color to draw the text in. Defaults to
|
18
|
+
# white.
|
19
|
+
# @option opts [Ray::Image] :on The image to draw on. In this case,
|
20
|
+
# it will directly draw instead of returning an image containing nothing
|
21
|
+
# but the drawn text.
|
22
|
+
# @option opts [Ray::Vector2, #to_vector2] :to or :at where to draw on the image.
|
23
|
+
# @return The surface it drew the string on.
|
24
|
+
def draw(string, opts)
|
25
|
+
enc = opts[:encoding] || (string.respond_to?(:encoding) && string.encoding.to_s)
|
26
|
+
enc ||= "UTF-8"
|
27
|
+
|
28
|
+
opts[:style] = parse_style(opts[:style])
|
29
|
+
|
30
|
+
simple_draw internal_string(string, enc), opts
|
25
31
|
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class String
|
30
|
-
# Draws the receiver.
|
31
|
-
#
|
32
|
-
# @option opts [Ray::Font] :font The font used to render the string.
|
33
|
-
# @option opts [Ray::Image] :on The image to draw on.
|
34
|
-
# @option opts [Integer] :w Witdh of the image. Also called :width.
|
35
|
-
# @option opts [Integer] ;h height of the image. Also called :height.
|
36
|
-
# @option opts [Symbol] The encoding. Can be guessed in Ruby 1.9.
|
37
|
-
# @option opts [Ray::Color] :color The color to draw the text in.
|
38
|
-
# @option opts [Ray::Color] :background Background color in shaded mode.
|
39
|
-
# @option opts [Symbol] :mode The drawing mode.
|
40
|
-
# @option opts [Array<Symbol>] :style The different styles to apply.
|
41
|
-
# :italic, :bold, and :underlined.
|
42
|
-
#
|
43
|
-
# @option opts [Array<Integer>] :at Where the image should be drawn.
|
44
|
-
# Defaults to (0, 0)
|
45
|
-
#
|
46
|
-
# @see Ray::Font#draw
|
47
|
-
def draw(opts = {})
|
48
|
-
font = opts[:font]
|
49
|
-
|
50
|
-
lines = split(/\r\n|\n|\r/)
|
51
|
-
line_skip = font.line_skip
|
52
|
-
|
53
|
-
target = opts[:on]
|
54
32
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
when /^iso-8859-/i
|
61
|
-
:latin1
|
62
|
-
else
|
63
|
-
nil
|
64
|
-
end
|
65
|
-
else
|
66
|
-
nil
|
67
|
-
end
|
33
|
+
# @param [Hash] opts (See #draw)
|
34
|
+
# @return [Ray::Vector2] Size of the text using this font.
|
35
|
+
def size_of(string, opts)
|
36
|
+
enc = opts[:encoding] || (string.respond_to?(:encoding) && string.encoding.to_s)
|
37
|
+
enc ||= "UTF-8"
|
68
38
|
|
69
|
-
|
70
|
-
line_skip * lines.size,
|
71
|
-
:width => opts[:width] || opts[:w] ||
|
72
|
-
lines.map { |i|
|
73
|
-
font.size_of(self, string_encoding).width
|
74
|
-
}.max)
|
39
|
+
opts[:style] = parse_style(opts[:style])
|
75
40
|
|
76
|
-
|
77
|
-
background = opts[:background]
|
78
|
-
|
79
|
-
mode = opts[:mode]
|
80
|
-
|
81
|
-
if styles = opts[:style]
|
82
|
-
font.style = styles.inject(0) do |flags, style|
|
83
|
-
flags |= case style
|
84
|
-
when :italic
|
85
|
-
Ray::Font::STYLE_ITALIC
|
86
|
-
when :bold
|
87
|
-
Ray::Font::STYLE_BOLD
|
88
|
-
when :underlined
|
89
|
-
Ray::Font::STYLE_UNDERLINE
|
90
|
-
else
|
91
|
-
raise "Unknown flag #{style}"
|
92
|
-
end
|
93
|
-
end
|
41
|
+
simple_size_of internal_string(string, enc), opts
|
94
42
|
end
|
95
43
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
lines.each do |line|
|
101
|
-
font.draw(line, :on => target, :at => [x, y], :encoding => string_encoding,
|
102
|
-
:color => color, :background => background, :mode => mode)
|
103
|
-
y += line_skip
|
44
|
+
# @return [Integer] Width required to draw the sring with this font.
|
45
|
+
# @see #size_of
|
46
|
+
def width_of(string, opts)
|
47
|
+
size_of(string, opts).width
|
104
48
|
end
|
105
|
-
|
106
|
-
target
|
107
49
|
end
|
108
50
|
end
|
data/lib/ray/font_set.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
module Ray
|
2
2
|
module FontSet
|
3
3
|
extend Ray::ResourceSet
|
4
|
-
need_argument_count 1
|
5
4
|
|
6
5
|
class << self
|
7
|
-
def missing_pattern(string
|
8
|
-
Ray::Font[string
|
6
|
+
def missing_pattern(string)
|
7
|
+
Ray::Font[string]
|
9
8
|
end
|
10
9
|
|
11
10
|
def select!(&block)
|
@@ -18,20 +17,21 @@ module Ray
|
|
18
17
|
# Creates a new font set.
|
19
18
|
#
|
20
19
|
# @param [Regexp] regex Regular expression used to match file
|
21
|
-
# @yield [*args
|
20
|
+
# @yield [*args] Block returning the font
|
22
21
|
#
|
23
22
|
# @yieldparam args Regex captures
|
24
|
-
|
25
|
-
def self.font_set(regex, &block)
|
23
|
+
def font_set(regex, &block)
|
26
24
|
Ray::FontSet.add_set(regex, &block)
|
27
25
|
end
|
26
|
+
|
27
|
+
module_function :font_set
|
28
28
|
end
|
29
29
|
|
30
30
|
begin
|
31
31
|
require 'open-uri'
|
32
32
|
|
33
|
-
Ray.font_set(/^(http|ftp):\/\/(\S+)$/) do |protocol, address
|
34
|
-
open("#{protocol}://#{address}") { |io| Ray::Font.new(io
|
33
|
+
Ray.font_set(/^(http|ftp):\/\/(\S+)$/) do |protocol, address|
|
34
|
+
open("#{protocol}://#{address}") { |io| Ray::Font.new(io) }
|
35
35
|
end
|
36
36
|
rescue LoadError
|
37
37
|
end
|
data/lib/ray/game.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Ray
|
2
|
-
# Games are used to manage different scenes. They also init Ray
|
2
|
+
# Games are used to manage different scenes. They also init Ray by creating a
|
3
3
|
# window.
|
4
4
|
#
|
5
5
|
# == Creating a Game
|
@@ -68,65 +68,73 @@ module Ray
|
|
68
68
|
# Creates a new game.
|
69
69
|
#
|
70
70
|
# You can pass all the arguments you would pass to create_window,
|
71
|
-
# except width and height which should be given in :
|
71
|
+
# except width and height which should be given in either :size or
|
72
|
+
# :video_modes:
|
72
73
|
# Ray::Game.new('hello', :video_modes => %w(480x272 640x480))
|
73
74
|
#
|
75
|
+
# :video_modes is an array of Vector2 or strings, :size is a single vector2.
|
76
|
+
# (vectors being interchangible with objects responding to #to_vector2)
|
77
|
+
#
|
74
78
|
# It will try to get the biggest resolution available (so it will most
|
75
79
|
# likely choose 640x480 in this case).
|
76
80
|
#
|
77
81
|
# If a block is passed, it is instance evaluated, then the game is
|
78
82
|
# directly run.
|
79
83
|
#
|
80
|
-
# This methods creates a new window
|
84
|
+
# This methods creates a new window.
|
85
|
+
#
|
86
|
+
# @param [Hash] hash (See Ray.create_window)
|
81
87
|
def initialize(title, hash = {}, &block)
|
82
88
|
@game_registred_scenes = {}
|
83
|
-
@game_scenes =
|
84
|
-
|
85
|
-
|
86
|
-
:double_buf => true,
|
87
|
-
:bpp => 32,
|
88
|
-
:hw_surface => true,
|
89
|
-
:sw_surface => false,
|
90
|
-
:video_modes => %w(480x272 640x480)
|
91
|
-
}
|
89
|
+
@game_scenes = SceneList.new(self)
|
90
|
+
@game_register_block = nil
|
91
|
+
@game_running = true
|
92
92
|
|
93
|
+
create_event_runner
|
94
|
+
|
95
|
+
defaults = {:size => [640, 480]}
|
93
96
|
options = defaults.merge(hash)
|
94
97
|
|
98
|
+
if !options[:video_modes]
|
99
|
+
size = options[:size].to_vector2
|
100
|
+
options[:video_modes] = [size]
|
101
|
+
end
|
102
|
+
|
95
103
|
common_settings = {
|
96
|
-
:sw_surface => options[:sw_surface],
|
97
|
-
:hw_surface => options[:hw_surface],
|
98
|
-
:bpp => options[:bpp] || options[:bits_per_pixel],
|
99
|
-
:async_blit => options[:async_blit],
|
100
|
-
:double_buf => options[:double_buf],
|
101
104
|
:fullscreen => options[:fullscreen],
|
102
105
|
:resizable => options[:resizable],
|
103
106
|
:no_frame => options[:no_frame]
|
104
107
|
}
|
105
108
|
|
106
|
-
modes = options[:video_modes].map
|
109
|
+
modes = options[:video_modes].map do |size|
|
110
|
+
case size
|
111
|
+
when String
|
112
|
+
size.split('x').map { |i| i.to_i }
|
113
|
+
else
|
114
|
+
size.to_a
|
115
|
+
end
|
116
|
+
end
|
107
117
|
|
108
118
|
# The biggest resolution is privileged
|
109
119
|
modes = modes.sort_by { |(w, h)| w * h }.map do |(w, h)|
|
110
120
|
common_settings.merge(:w => w, :h => h)
|
111
121
|
end
|
112
122
|
|
113
|
-
|
114
|
-
|
115
|
-
last_mode = modes.select { |mode| Ray.can_use_mode? mode }.last
|
123
|
+
last_mode = modes.last
|
116
124
|
raise ArgumentError, "No valid mode found" unless last_mode
|
117
125
|
|
126
|
+
@game_last_mode = last_mode
|
127
|
+
@game_window = Ray.create_window(last_mode)
|
128
|
+
@game_window.fill Ray::Color.none # Start by clearing the window
|
129
|
+
|
118
130
|
if @game_title = title
|
119
131
|
Ray.window_title = @game_title
|
120
|
-
Ray.text_icon = @game_title
|
121
132
|
end
|
122
133
|
|
123
134
|
if icon = options[:icon]
|
124
|
-
Ray.icon = icon.is_a?(
|
135
|
+
Ray.icon = icon.is_a?(String) ? Ray::ImageSet[icon] : icon
|
125
136
|
end
|
126
137
|
|
127
|
-
@game_last_mode = last_mode
|
128
|
-
@game_window = Ray.create_window(last_mode)
|
129
|
-
|
130
138
|
if block
|
131
139
|
instance_eval(&block)
|
132
140
|
run
|
@@ -143,16 +151,12 @@ module Ray
|
|
143
151
|
# @param [Symbol] scene_name The name of the scene which should be pushed
|
144
152
|
# @param *args Arguments passed to the scene
|
145
153
|
def push_scene(scene_name, *args)
|
146
|
-
|
147
|
-
raise ArgumentError, "Unknown scene #{scene_name}" unless scene
|
148
|
-
|
149
|
-
@game_scenes << scene
|
150
|
-
@game_scene_arguments = args
|
154
|
+
@game_scenes.push(scene_name, *args)
|
151
155
|
end
|
152
156
|
|
153
157
|
# Pops the last scene.
|
154
158
|
def pop_scene
|
155
|
-
@game_scenes.
|
159
|
+
@game_scenes.pop
|
156
160
|
end
|
157
161
|
|
158
162
|
# Registers a new scene with a given name. the block will be passed
|
@@ -161,32 +165,33 @@ module Ray
|
|
161
165
|
# @param [Symobl] name the name of the new scene
|
162
166
|
# @param [Class] klass the class of the scene.
|
163
167
|
def scene(name, klass = Scene, &block)
|
164
|
-
@game_registred_scenes[name] = klass.new(&block)
|
168
|
+
scene = @game_registred_scenes[name] = klass.new(&block)
|
169
|
+
|
170
|
+
scene.game = self
|
171
|
+
scene.event_runner = event_runner
|
172
|
+
scene.window = @game_window
|
173
|
+
end
|
174
|
+
|
175
|
+
# @return [Ray::Scene] scene register for a given name
|
176
|
+
def registred_scene(name)
|
177
|
+
@game_registred_scenes[name]
|
165
178
|
end
|
166
179
|
|
167
180
|
# Runs the game until the last scene gets popped.
|
168
181
|
# Will call Ray.stop.
|
169
182
|
def run
|
170
|
-
|
171
|
-
|
183
|
+
while running?
|
184
|
+
event_runner.clear
|
172
185
|
register
|
173
186
|
|
174
|
-
@game_scenes.
|
175
|
-
scene.game = self
|
176
|
-
scene.window = @game_window
|
177
|
-
scene.event_runner = event_runner
|
178
|
-
scene.scene_arguments = @game_scene_arguments
|
179
|
-
end
|
180
|
-
|
181
|
-
scene = @game_scenes.last
|
182
|
-
|
183
|
-
scene.setup(*@game_scene_arguments)
|
184
|
-
scene.register_events
|
185
|
-
scene.need_render!
|
186
|
-
scene.run
|
187
|
+
@game_scenes.run_current
|
187
188
|
end
|
189
|
+
end
|
188
190
|
|
189
|
-
|
191
|
+
# @param [true, false] True if the scene list isn't empty
|
192
|
+
# and the user hasn't exited from the game.
|
193
|
+
def running?
|
194
|
+
!@game_exited && !@game_scenes.empty?
|
190
195
|
end
|
191
196
|
|
192
197
|
# Registers a block to listen to events
|
@@ -201,44 +206,60 @@ module Ray
|
|
201
206
|
|
202
207
|
# Removes the current scene of this game
|
203
208
|
def exit
|
204
|
-
|
205
|
-
|
206
|
-
@game_scenes.last.exit
|
207
|
-
pop_scene
|
209
|
+
@game_scenes.exit_current
|
208
210
|
end
|
209
211
|
|
210
212
|
# Kills the game, removing all the scenes it contains.
|
211
213
|
def exit!
|
212
|
-
|
214
|
+
@game_exited = true
|
213
215
|
|
214
|
-
@game_scenes.
|
216
|
+
@game_scenes.exit_current
|
215
217
|
@game_scenes.clear
|
216
218
|
end
|
217
|
-
|
219
|
+
|
218
220
|
# Resizes the window and raises a window_resize event
|
219
221
|
def resize_window(w, h)
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
@game_scenes.last.need_render!
|
227
|
-
|
228
|
-
raise_event(:window_resize, Ray::Rect.new(0, 0, w, h))
|
222
|
+
Ray.create_window(@game_last_mode.merge!(:w => w, :h => h))
|
223
|
+
@game_window.fill Ray::Color.none
|
224
|
+
|
225
|
+
@game_scenes.current.need_render!
|
226
|
+
|
227
|
+
raise_event(:window_resize, Ray::Vector2[w, h])
|
229
228
|
end
|
230
229
|
|
231
230
|
def title
|
232
231
|
@game_title
|
233
232
|
end
|
234
233
|
|
234
|
+
def scenes
|
235
|
+
@game_scenes
|
236
|
+
end
|
237
|
+
|
238
|
+
def scenes=(list)
|
239
|
+
@game_scenes = list
|
240
|
+
|
241
|
+
unless running?
|
242
|
+
@game_scenes.exit_current
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
def event_runner=(runner)
|
247
|
+
super
|
248
|
+
|
249
|
+
@game_registred_scenes.each do |name, scene|
|
250
|
+
scene.event_runner = runner
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
235
254
|
def inspect
|
236
255
|
"game(#{title.inspect})"
|
237
256
|
end
|
238
257
|
end
|
239
258
|
|
240
259
|
# @see Ray::Game#initialize
|
241
|
-
def
|
260
|
+
def game(title, opts = {}, &block)
|
242
261
|
Ray::Game.new(title, opts, &block)
|
243
262
|
end
|
263
|
+
|
264
|
+
module_function :game
|
244
265
|
end
|
data/lib/ray/helper.rb
CHANGED
@@ -1,9 +1,74 @@
|
|
1
1
|
module Ray
|
2
|
-
#
|
2
|
+
#
|
3
|
+
# == Event handling
|
4
|
+
# This module is used to allow both raising events and handling thereof.
|
5
|
+
# You can raise them simply with raise_event:
|
6
|
+
# raise_event(:event_name, arugments)
|
7
|
+
# (You can add as many extra arguments as you want/need to)
|
8
|
+
#
|
9
|
+
# Those events can trigger a block.
|
10
|
+
# on :event_name do
|
11
|
+
# # Do something useful
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# If you want your block to be triggered only when a condition is
|
15
|
+
# met, you can pass extra arguments to on. They will be compared
|
16
|
+
# to those that were passed to raise_event using === or == if
|
17
|
+
# === returned false.
|
18
|
+
# on :event_name, /foo/ do |str| puts str end
|
19
|
+
# raise_event "foobar" # Will trigger the above
|
20
|
+
#
|
21
|
+
# Handlers can be grouped:
|
22
|
+
# event_group :name do
|
23
|
+
# # Register for some events
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# Notice event groups cannot be nested. The following code:
|
27
|
+
# event_group :name do
|
28
|
+
# event_group :foo do
|
29
|
+
# # ...
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# # ...
|
33
|
+
# end
|
34
|
+
# Will create two totally unrelated event groups (:name and :foo).
|
35
|
+
#
|
36
|
+
# An event group is enabled by default, but it can be disabled:
|
37
|
+
# disable_event_group :name
|
38
|
+
# And re-enabled afterwards:
|
39
|
+
# enable_event_group :name
|
40
|
+
# It is also possible to remove the handlers that belong to a group
|
41
|
+
# when they're not needed anymore:
|
42
|
+
# remove_event_group :name
|
43
|
+
#
|
44
|
+
# == Shared resources
|
45
|
+
#
|
46
|
+
# This module contains helper methods that provide access to shared resources,
|
47
|
+
# i.e. they will always return the same object until the cache is cleared:
|
48
|
+
# obj = image "test.png"
|
49
|
+
# other_obj = image "test.png"
|
50
|
+
# obj.equal? other_obj # => true
|
51
|
+
#
|
52
|
+
# Notice different resources sets are used. This allows to get resources from
|
53
|
+
# other places than from the disk. For instance, Ray provides a way to get
|
54
|
+
# resources from the network using open-uri:
|
55
|
+
# obj = image "http://www.example.com/some_image.png" # Download, takes some time
|
56
|
+
# other_image = image "http://www.example.com/some_image.png" # Doesn't download
|
57
|
+
# obj.equal? other_image
|
58
|
+
#
|
59
|
+
# You can define your own resource sets pretty easily:
|
60
|
+
# Ray.image_set(/some (regexp)/) do |capture| # Captures are yielded
|
61
|
+
# # Block that returns an image
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# Be careful when using a shared resource. Call #dup instead of mutating it (even
|
65
|
+
# though that would not raise an error).
|
66
|
+
#
|
3
67
|
module Helper
|
4
68
|
include Ray::DSL::EventRaiser
|
5
69
|
include Ray::DSL::EventListener
|
6
70
|
|
71
|
+
include Ray::Input
|
7
72
|
include Ray::Matchers
|
8
73
|
|
9
74
|
# Sets the event runner for this object.
|
@@ -22,6 +87,23 @@ module Ray
|
|
22
87
|
self.event_runner = Ray::DSL::EventRunner.new
|
23
88
|
end
|
24
89
|
|
90
|
+
# Enables an event group
|
91
|
+
def enable_event_group(name)
|
92
|
+
event_runner.enable_group(name)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Disables an event group
|
96
|
+
def disable_event_group(name)
|
97
|
+
event_runner.disable_group(name)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Removes all the handlers belonging to an event group
|
101
|
+
def remove_event_group(name)
|
102
|
+
event_runner.remove_group(name)
|
103
|
+
end
|
104
|
+
|
105
|
+
module_function
|
106
|
+
|
25
107
|
# @see Ray::ImageSet.[]
|
26
108
|
def image(name)
|
27
109
|
Ray::ImageSet[name]
|
@@ -32,24 +114,37 @@ module Ray
|
|
32
114
|
Ray::Sprite.new(image, opts)
|
33
115
|
end
|
34
116
|
|
35
|
-
# @see Ray::
|
36
|
-
def channel(id)
|
37
|
-
Ray::Channel.new(id)
|
38
|
-
end
|
39
|
-
|
40
|
-
# @see Ray::MusicSet.[]
|
117
|
+
# @see Ray::SoundSet.[]
|
41
118
|
def sound(file)
|
42
119
|
Ray::SoundSet[file]
|
43
120
|
end
|
44
|
-
|
121
|
+
|
45
122
|
# @see Ray::MusicSet.[]
|
46
123
|
def music(file)
|
47
124
|
Ray::MusicSet[file]
|
48
125
|
end
|
49
126
|
|
50
127
|
# @see Ray::FontSet.[]
|
51
|
-
def font(name
|
52
|
-
Ray::FontSet[name
|
128
|
+
def font(name)
|
129
|
+
Ray::FontSet[name]
|
130
|
+
end
|
131
|
+
|
132
|
+
# @see Ray::Text#initialize
|
133
|
+
def text(content, opts = {})
|
134
|
+
Ray::Text.new(content, opts)
|
135
|
+
end
|
136
|
+
|
137
|
+
# @param [Symbol, Key, Integer] val A symbol to find the key (its name),
|
138
|
+
# a Key object, or one of the KEY_* constant.
|
139
|
+
# @return [true, false] True if the user is holding key.
|
140
|
+
def holding?(val)
|
141
|
+
if val.is_a? Integer
|
142
|
+
Ray::Input.holding? val
|
143
|
+
else
|
144
|
+
key(val.to_sym).to_a.any? do |key|
|
145
|
+
Ray::Input.holding? key
|
146
|
+
end
|
147
|
+
end
|
53
148
|
end
|
54
149
|
end
|
55
150
|
end
|