ray 0.0.1 → 0.1.0.pre1
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.
- 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/scene.rb
CHANGED
|
@@ -26,12 +26,6 @@ module Ray
|
|
|
26
26
|
# # Do drawing here
|
|
27
27
|
# end
|
|
28
28
|
#
|
|
29
|
-
# Notice win is not filled with an empty color when render is called, i.e.
|
|
30
|
-
# it still contains the frame which appears to the user.
|
|
31
|
-
#
|
|
32
|
-
# Also, scenes are rendered lazily: only once when the scene is created,
|
|
33
|
-
# and then every time need_render! is called.
|
|
34
|
-
#
|
|
35
29
|
# Once your scene is loaded, you'll probably want to clean it up (set some
|
|
36
30
|
# instance variables to nil so they can be garbaged collected for instance).
|
|
37
31
|
# You can do that by passing a block to clean_up:
|
|
@@ -69,6 +63,13 @@ module Ray
|
|
|
69
63
|
# == Limiting the loop rate
|
|
70
64
|
# You can prevent a scene from always running by using #loops_per_second=:
|
|
71
65
|
# self.loops_per_second = 30 # will sleep some time after each loop
|
|
66
|
+
# This defaults to 60.
|
|
67
|
+
#
|
|
68
|
+
# == Lazy rendering
|
|
69
|
+
# By default, the scene is always rendered. You can enable lazy rendering:
|
|
70
|
+
# self.lazy_rendering = true
|
|
71
|
+
# In this case, the scene will render in its own Image when requested (using
|
|
72
|
+
# #need_render!), and that image will be drawn in every loop.
|
|
72
73
|
#
|
|
73
74
|
# @see Ray::DSL::EventTranslator
|
|
74
75
|
class Scene
|
|
@@ -94,22 +95,20 @@ module Ray
|
|
|
94
95
|
# Creates a new scene. block will be instance evaluated when
|
|
95
96
|
# this scene becomes the current one.
|
|
96
97
|
def initialize(&block)
|
|
97
|
-
@scene_register_block
|
|
98
|
-
|
|
98
|
+
@scene_register_block = block
|
|
99
|
+
@scene_always_block = nil
|
|
100
|
+
@scene_render_block = nil
|
|
101
|
+
@scene_clean_block = nil
|
|
99
102
|
|
|
100
|
-
|
|
101
|
-
@
|
|
103
|
+
@scene_need_render = true
|
|
104
|
+
@scene_loops_per_second = 60
|
|
102
105
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
on :key_release do |key, mod|
|
|
108
|
-
@scene_held_keys.reject! { |i| i == key }
|
|
109
|
-
end
|
|
106
|
+
@scene_shader = nil
|
|
107
|
+
end
|
|
110
108
|
|
|
109
|
+
def register_events
|
|
111
110
|
if @scene_register_block
|
|
112
|
-
|
|
111
|
+
instance_exec(@scene_arguments, &@scene_register_block)
|
|
113
112
|
else
|
|
114
113
|
register
|
|
115
114
|
end
|
|
@@ -126,21 +125,6 @@ module Ray
|
|
|
126
125
|
def register
|
|
127
126
|
end
|
|
128
127
|
|
|
129
|
-
# @param [Symbol, Integer] val A symbol to find the key (its name)
|
|
130
|
-
# or an integer (Ray::Event::KEY_*)
|
|
131
|
-
#
|
|
132
|
-
# @return [true, false] True if the user is holding key.
|
|
133
|
-
def holding?(val)
|
|
134
|
-
if val.is_a? Symbol
|
|
135
|
-
val = key(val)
|
|
136
|
-
@scene_held_keys.any? { |o| val === o }
|
|
137
|
-
elsif val.is_a? DSL::Matcher
|
|
138
|
-
@scene_held_keys.any? { |o| val === o }
|
|
139
|
-
else
|
|
140
|
-
@scene_held_keys.include? val
|
|
141
|
-
end
|
|
142
|
-
end
|
|
143
|
-
|
|
144
128
|
# Runs until you exit the scene.
|
|
145
129
|
# This will also raise events if the mouse moves, ... allowing you
|
|
146
130
|
# to directly listen to a such event.
|
|
@@ -148,21 +132,43 @@ module Ray
|
|
|
148
132
|
until @scene_exit
|
|
149
133
|
loop_start = Time.now
|
|
150
134
|
|
|
151
|
-
|
|
152
|
-
|
|
135
|
+
ev = Ray::Event.new
|
|
136
|
+
until ev.type == Ray::Event::TYPE_NOEVENT
|
|
137
|
+
DSL::EventTranslator.translate_event(ev).each do |args|
|
|
138
|
+
raise_event(*args)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
ev.poll!
|
|
153
142
|
end
|
|
154
143
|
|
|
155
144
|
@scene_always_block.call if @scene_always_block
|
|
156
145
|
|
|
157
146
|
listener_runner.run
|
|
158
147
|
|
|
159
|
-
|
|
160
|
-
@scene_need_render = false
|
|
148
|
+
@scene_window.fill(Ray::Color.none)
|
|
161
149
|
|
|
162
|
-
|
|
163
|
-
@
|
|
150
|
+
if lazy_rendering?
|
|
151
|
+
unless @scene_lazy_cache
|
|
152
|
+
@scene_lazy_cache = Ray::Image.new(:w => @scene_window.w,
|
|
153
|
+
:h => @scene_window.h)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
if @scene_need_render
|
|
157
|
+
@scene_lazy_cache.fill Ray::Color.none
|
|
158
|
+
|
|
159
|
+
render @scene_lazy_cache
|
|
160
|
+
@scene_lazy_cache.update
|
|
161
|
+
|
|
162
|
+
@scene_need_render = false
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
@scene_lazy_cache.draw(:on => @scene_window, :shader => @scene_shader)
|
|
166
|
+
else
|
|
167
|
+
render @scene_window
|
|
164
168
|
end
|
|
165
169
|
|
|
170
|
+
@scene_window.update
|
|
171
|
+
|
|
166
172
|
if @scene_loops_per_second
|
|
167
173
|
ellapsed_time = Time.now - loop_start
|
|
168
174
|
time_per_loop = 1.0 / @scene_loops_per_second
|
|
@@ -174,6 +180,28 @@ module Ray
|
|
|
174
180
|
clean_up
|
|
175
181
|
end
|
|
176
182
|
|
|
183
|
+
# Runs another scene over the current one.
|
|
184
|
+
# This method will return when the scene is done running.
|
|
185
|
+
def run_scene(name, *args)
|
|
186
|
+
scene_list = SceneList.new(game)
|
|
187
|
+
scene_list.push(name, *args)
|
|
188
|
+
|
|
189
|
+
event_runner = DSL::EventRunner.new
|
|
190
|
+
|
|
191
|
+
old_event_runner = game.event_runner
|
|
192
|
+
old_scene_list = game.scenes
|
|
193
|
+
|
|
194
|
+
game.event_runner = event_runner
|
|
195
|
+
game.scenes = scene_list
|
|
196
|
+
|
|
197
|
+
begin
|
|
198
|
+
game.run
|
|
199
|
+
ensure
|
|
200
|
+
game.event_runner = old_event_runner
|
|
201
|
+
game.scenes = old_scene_list
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
177
205
|
# Exits the scene, but does not pop the scene.
|
|
178
206
|
#
|
|
179
207
|
# You may want to call this if you pushed a new scene, to switch to
|
|
@@ -201,9 +229,8 @@ module Ray
|
|
|
201
229
|
|
|
202
230
|
# Registers the block to draw the scene.
|
|
203
231
|
#
|
|
204
|
-
#
|
|
205
|
-
#
|
|
206
|
-
# instead of providing a block to it.
|
|
232
|
+
# If no block is given, renders the scen on the image passed as
|
|
233
|
+
# an argument.
|
|
207
234
|
#
|
|
208
235
|
# @yield [window] Block to render this scene.
|
|
209
236
|
# @yieldparam [Ray::Image] window The window you should draw on
|
|
@@ -220,7 +247,7 @@ module Ray
|
|
|
220
247
|
game.push_scene(scene, *args)
|
|
221
248
|
exit
|
|
222
249
|
end
|
|
223
|
-
|
|
250
|
+
|
|
224
251
|
# @see Ray::Game#resize_window
|
|
225
252
|
def resize_window(w, h)
|
|
226
253
|
game.resize_window(w, h)
|
|
@@ -265,7 +292,36 @@ module Ray
|
|
|
265
292
|
@scene_loops_per_second = val
|
|
266
293
|
end
|
|
267
294
|
|
|
295
|
+
alias :frames_per_second :loops_per_second
|
|
296
|
+
alias :frames_per_second= :loops_per_second=
|
|
297
|
+
|
|
298
|
+
def lazy_rendering
|
|
299
|
+
@scene_lazy_rendering ||= false
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
alias :lazy_rendering? :lazy_rendering
|
|
303
|
+
|
|
304
|
+
def lazy_rendering=(val)
|
|
305
|
+
@scene_lazy_rendering = val
|
|
306
|
+
|
|
307
|
+
unless lazy_rendering?
|
|
308
|
+
@scene_lazy_cache = nil
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
268
312
|
# The arguments passed to the scene with push_scene
|
|
269
313
|
attr_accessor :scene_arguments
|
|
314
|
+
|
|
315
|
+
# @return [Ray::Shader] The shader used for this scene.
|
|
316
|
+
# It will be used when drawing the scene on the window.
|
|
317
|
+
# This won't do anything unless lazy_rendering is enabled.
|
|
318
|
+
def shader
|
|
319
|
+
@scene_shader
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
# Sets the shader used for this scene
|
|
323
|
+
def shader=(value)
|
|
324
|
+
@scene_shader = value
|
|
325
|
+
end
|
|
270
326
|
end
|
|
271
327
|
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module Ray
|
|
2
|
+
# @api private
|
|
3
|
+
class SceneList
|
|
4
|
+
include Enumerable
|
|
5
|
+
|
|
6
|
+
def initialize(game)
|
|
7
|
+
@game = game
|
|
8
|
+
@scenes = []
|
|
9
|
+
@scene_args = []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def empty?
|
|
13
|
+
@scenes.empty?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def current
|
|
17
|
+
@scenes.last
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def run_current
|
|
21
|
+
scene = @scenes.last
|
|
22
|
+
|
|
23
|
+
scene.scene_arguments = @scene_args.last
|
|
24
|
+
|
|
25
|
+
scene.setup(*@scene_args.last)
|
|
26
|
+
scene.register_events
|
|
27
|
+
scene.need_render!
|
|
28
|
+
scene.run
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def exit_current
|
|
32
|
+
return if empty?
|
|
33
|
+
current.exit
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def pop
|
|
37
|
+
@scenes.pop
|
|
38
|
+
@scene_args.pop
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def clear
|
|
42
|
+
@scenes.clear
|
|
43
|
+
@scene_args.clear
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @param [Symbol] scene Name of the scene
|
|
47
|
+
def push(scene, *args)
|
|
48
|
+
scene = @game.registred_scene(scene)
|
|
49
|
+
raise ArgumentError, "Unknown scene #{scene_name}" unless scene
|
|
50
|
+
|
|
51
|
+
@scenes << scene
|
|
52
|
+
@scene_args << args
|
|
53
|
+
|
|
54
|
+
self
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
alias :<< :push
|
|
58
|
+
|
|
59
|
+
def each(&block)
|
|
60
|
+
@scenes.each(&block)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def inspect
|
|
64
|
+
@scenes.inspect
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
data/lib/ray/shape.rb
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
module Ray
|
|
2
|
+
class Shape
|
|
3
|
+
include Enumerable
|
|
4
|
+
|
|
5
|
+
# One of the points contained in a shape.
|
|
6
|
+
class Point
|
|
7
|
+
def initialize(shape, id)
|
|
8
|
+
@shape, @id = shape, id
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# @return [Ray::Vector2] Position of the point.
|
|
12
|
+
def pos
|
|
13
|
+
@shape.position_of(@id)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @return [Color] Color of the point
|
|
17
|
+
def color
|
|
18
|
+
@shape.color_of(@id)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @return [Color] Outline color of the point
|
|
22
|
+
def outline
|
|
23
|
+
@shape.outline_of(@id)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Sets the position of the point
|
|
27
|
+
def pos=(pos)
|
|
28
|
+
@shape.set_position_of(@id, pos)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Sets the color of the point
|
|
32
|
+
def color=(color)
|
|
33
|
+
@shape.set_color_of(@id, color)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Sets the outline color of the point
|
|
37
|
+
def outline=(outline)
|
|
38
|
+
@shape.set_outline_of(@id, outline)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def inspect
|
|
42
|
+
"#<#{self.class} shape=#{shape} id=#{id} pos=#{pos} color=#{color} outline=#{outline}>"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
attr_reader :shape, :id
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Creates an ellipse.
|
|
49
|
+
#
|
|
50
|
+
# @param [Ray::Vector2, #to_vector2] center Center of the ellipse
|
|
51
|
+
# @param [Float] rx x radius
|
|
52
|
+
# @param [Float] ry y radius
|
|
53
|
+
# @param [Ray::Color] color Color of the ellipse
|
|
54
|
+
# @param [Float] outline_width Width of the ouline
|
|
55
|
+
# @param [Ray::Color] outline_color Color of the outline
|
|
56
|
+
def self.ellipse(center, rx, ry, color, outline_width = 0.0,
|
|
57
|
+
outline_color = Ray::Color.none)
|
|
58
|
+
rx, ry = rx.to_f, ry.to_f
|
|
59
|
+
min_radius = x_factor = y_factor = 1
|
|
60
|
+
|
|
61
|
+
min_radius = rx
|
|
62
|
+
|
|
63
|
+
if rx <= ry
|
|
64
|
+
min_radius = rx
|
|
65
|
+
y_factor = ry / rx
|
|
66
|
+
else
|
|
67
|
+
min_radius = ry
|
|
68
|
+
x_factor = rx / ry
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
shape = circle([0, 0], min_radius, color, outline_width, outline_color)
|
|
72
|
+
shape.scale = [x_factor, y_factor]
|
|
73
|
+
shape.pos = center
|
|
74
|
+
|
|
75
|
+
shape
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
alias :size :point_count
|
|
79
|
+
|
|
80
|
+
# @param [Integer, nil] size Size of the shape. If non nil, size points will
|
|
81
|
+
# be added to the shape and then yielded.
|
|
82
|
+
# @example
|
|
83
|
+
# shape = Ray::Shape.new
|
|
84
|
+
#
|
|
85
|
+
# other_shape = Ray::Shape.new(10) do |point|
|
|
86
|
+
# point.pos = [point.id, point.id]
|
|
87
|
+
# point.color = Ray::Color.new(point.id * 10, 0, 0)
|
|
88
|
+
# end
|
|
89
|
+
def initialize(size = nil)
|
|
90
|
+
if size
|
|
91
|
+
0.upto(size - 1) do |n|
|
|
92
|
+
add_point [0, 0]
|
|
93
|
+
yield self[n]
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def scale_x; scale.x; end
|
|
99
|
+
def scale_y; scale.y; end
|
|
100
|
+
|
|
101
|
+
def scale_x=(val); self.scale = [val, scale_y]; end
|
|
102
|
+
def scale_y=(val); self.scale = [scale_x, val]; end
|
|
103
|
+
|
|
104
|
+
# @yieldparam [Ray::Shape::Point] point Each point of the shape
|
|
105
|
+
def each
|
|
106
|
+
0.upto(size - 1) { |n| yield self[n] }
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# @return [Ray::Shape::Point] idth point of the shape (id should be less than size)
|
|
110
|
+
def [](id)
|
|
111
|
+
Point.new(self, id)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Draws the shape on an image, optionally using a shader and a color
|
|
115
|
+
# to multiply each pixel.
|
|
116
|
+
def draw_on(image, shader = nil, color = Ray::Color.white)
|
|
117
|
+
image.draw_shape(self, shader, color)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Draws the shape
|
|
121
|
+
#
|
|
122
|
+
# @option opts [Ray::Image] :on (Ray.screen) The object to draw the shape.
|
|
123
|
+
# on.
|
|
124
|
+
# @option opts [Ray::Shader] :shader (nil) The shader to use to draw the shape.
|
|
125
|
+
# @option opts [Ray::Color] :color (Ray::Color.white) Color multiplying each
|
|
126
|
+
# pixel of the shape.
|
|
127
|
+
def draw(opts = {})
|
|
128
|
+
draw_on(opts[:on] || Ray.screen, opts[:shader],
|
|
129
|
+
opts[:color] || Ray::Color.white)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
data/lib/ray/sound_set.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Ray
|
|
2
2
|
module SoundSet
|
|
3
3
|
extend Ray::ResourceSet
|
|
4
|
-
|
|
4
|
+
|
|
5
5
|
class << self
|
|
6
6
|
def missing_pattern(string)
|
|
7
7
|
Ray::Sound[string]
|
|
@@ -20,9 +20,11 @@ module Ray
|
|
|
20
20
|
# @yield [*args] Block returning the sound
|
|
21
21
|
#
|
|
22
22
|
# @yieldparam args Regex captures
|
|
23
|
-
def
|
|
23
|
+
def sound_set(regex, &block)
|
|
24
24
|
Ray::SoundSet.add_set(regex, &block)
|
|
25
25
|
end
|
|
26
|
+
|
|
27
|
+
module_function :sound_set
|
|
26
28
|
end
|
|
27
29
|
|
|
28
30
|
begin
|
data/lib/ray/sprite.rb
CHANGED
|
@@ -1,103 +1,57 @@
|
|
|
1
1
|
module Ray
|
|
2
2
|
class Sprite
|
|
3
|
-
# Creates a sprite.
|
|
4
|
-
#
|
|
5
|
-
# @param [String, Ray::Image] The image this object will wrap;
|
|
6
|
-
# @option opts [Ray::Rect, Array<Integer>] :at Position of the sprite
|
|
7
|
-
# (defaults to 0,0)
|
|
8
|
-
# @option opts [Ray::Rect, Array<Integer>] :rect Rect of the image which will
|
|
9
|
-
# be drawn (defaults to the
|
|
10
|
-
# whole image)
|
|
11
|
-
# @option opts [Float] :angle The angle which will be used to draw the image
|
|
12
|
-
# in degrees. Defaults to 0.
|
|
13
|
-
# @option opts [Float] :zoom The zoom level which will be used to draw the image.
|
|
14
|
-
# Defaults to 1.
|
|
15
|
-
def initialize(image, opts = {})
|
|
16
|
-
opts = {
|
|
17
|
-
:rect => Ray::Rect.new(0, 0, 0, 0),
|
|
18
|
-
:at => [0, 0],
|
|
19
|
-
:angle => 0.0,
|
|
20
|
-
:zoom => 1
|
|
21
|
-
}.merge(opts)
|
|
22
|
-
|
|
23
|
-
@from_rect = opts[:rect].to_rect
|
|
24
|
-
|
|
25
|
-
rect = opts[:at].to_rect
|
|
26
|
-
@x, @y = rect.x, rect.y
|
|
27
|
-
|
|
28
|
-
self.angle = opts[:angle]
|
|
29
|
-
self.zoom = opts[:zoom]
|
|
30
|
-
|
|
31
|
-
@image = image.to_image
|
|
32
|
-
end
|
|
33
|
-
|
|
34
3
|
# Sets the size of the sprite sheet. For instance,
|
|
35
4
|
# sprite.sheet_size = [3, 4]
|
|
36
5
|
# would mean there are 4 rows and 3 columns in the sprite (and each cell
|
|
37
6
|
# has the same size).
|
|
38
7
|
def sheet_size=(ary)
|
|
39
|
-
w, h = ary
|
|
40
|
-
|
|
41
8
|
@uses_sprite_sheet = true
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
@sprite_sheet_h = h
|
|
45
|
-
|
|
9
|
+
@sprite_sheet_size = ary.to_vector2
|
|
10
|
+
|
|
46
11
|
self.sheet_pos = [0, 0]
|
|
47
12
|
end
|
|
48
|
-
|
|
13
|
+
|
|
49
14
|
# Sets which cell of the sprite sheet should be displayed.
|
|
50
15
|
# sprite.sheet_pos = [0, 1] # Uses the first cell of the second line.
|
|
51
|
-
def sheet_pos=(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
self.from_rect = Ray::Rect.new(x * sprite_width,
|
|
16
|
+
def sheet_pos=(pos)
|
|
17
|
+
pos = pos.to_vector2
|
|
18
|
+
|
|
19
|
+
self.from_rect = Ray::Rect.new(pos.x * sprite_width,
|
|
20
|
+
pos.y * sprite_height,
|
|
55
21
|
sprite_width, sprite_height)
|
|
56
|
-
|
|
57
|
-
@
|
|
58
|
-
@sheet_pos_y = y
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# Returns the position of the cell which is being used.
|
|
62
|
-
def sheet_pos
|
|
63
|
-
[@sheet_pos_x, @sheet_pos_y]
|
|
22
|
+
|
|
23
|
+
@sheet_pos = pos
|
|
64
24
|
end
|
|
65
|
-
|
|
25
|
+
|
|
26
|
+
# @return [Ray::Vector2] the position of the cell which is being used.
|
|
27
|
+
attr_reader :sheet_pos
|
|
28
|
+
|
|
66
29
|
# @return [Integer, nil] The width of each cell in the sprite sheet
|
|
67
30
|
def sprite_width
|
|
68
31
|
if uses_sprite_sheet?
|
|
69
|
-
|
|
32
|
+
image.w / @sprite_sheet_size.w
|
|
70
33
|
end
|
|
71
34
|
end
|
|
72
|
-
|
|
35
|
+
|
|
73
36
|
# @return [Integer, nil] The height of each cell in the sprite sheet
|
|
74
37
|
def sprite_height
|
|
75
38
|
if uses_sprite_sheet?
|
|
76
|
-
|
|
39
|
+
image.h / @sprite_sheet_size.h
|
|
77
40
|
end
|
|
78
41
|
end
|
|
79
|
-
|
|
42
|
+
|
|
80
43
|
# Disables the sprite sheet
|
|
81
44
|
def disable_sprite_sheet
|
|
82
|
-
self.from_rect = Ray::Rect.new(0, 0,
|
|
83
|
-
|
|
84
|
-
@
|
|
85
|
-
@sprite_sheet_h = nil
|
|
86
|
-
|
|
45
|
+
self.from_rect = Ray::Rect.new(0, 0, image.w, image.h)
|
|
46
|
+
|
|
47
|
+
@sprite_sheet_size = nil
|
|
87
48
|
@uses_sprite_sheet = false
|
|
88
49
|
end
|
|
89
|
-
|
|
50
|
+
|
|
90
51
|
def uses_sprite_sheet?
|
|
91
52
|
@uses_sprite_sheet
|
|
92
53
|
end
|
|
93
54
|
|
|
94
|
-
# Draws the sprite on an image.
|
|
95
|
-
# @param [Ray::Image] screen The image on which the sprite will be drawn
|
|
96
|
-
def draw_on(screen)
|
|
97
|
-
@image.blit(:rect => @from_rect, :on => screen, :at => [@x, @y],
|
|
98
|
-
:angle => @angle, :zoom => @zoom)
|
|
99
|
-
end
|
|
100
|
-
|
|
101
55
|
# Draws the sprite on the screen or on another image
|
|
102
56
|
# @option opts [Ray::Image] :on The image we should draw on. Defaults to
|
|
103
57
|
# Ray.screen.
|
|
@@ -107,29 +61,29 @@ module Ray
|
|
|
107
61
|
|
|
108
62
|
# @return [true, false] True if the sprite is located at (x, y)
|
|
109
63
|
def is_at?(x, y)
|
|
110
|
-
|
|
64
|
+
pos == [x, y]
|
|
111
65
|
end
|
|
112
66
|
|
|
113
67
|
# @return [Ray::Rect] The rect where this sprite will be drawn.
|
|
114
68
|
def rect
|
|
115
|
-
|
|
116
|
-
|
|
69
|
+
pos = self.pos
|
|
70
|
+
from_rect = self.from_rect
|
|
71
|
+
zoom = self.zoom
|
|
72
|
+
|
|
73
|
+
Ray::Rect.new(pos.x, pos.y, from_rect.w * zoom.w, from_rect.h * zoom.h)
|
|
117
74
|
end
|
|
118
75
|
|
|
119
|
-
# @param [Ray::Rect, #
|
|
120
|
-
# @return [true, false]
|
|
76
|
+
# @param [Ray::Rect, #to_rect] An object with which the receiver may collide
|
|
121
77
|
def collide?(obj)
|
|
122
78
|
rect.collide?(obj.to_rect)
|
|
123
79
|
end
|
|
124
80
|
|
|
125
|
-
# @param [Ray::Rect, #
|
|
126
|
-
# @return [true, false]
|
|
81
|
+
# @param [Ray::Rect, #to_rect] (See #collide?)
|
|
127
82
|
def inside?(obj)
|
|
128
83
|
rect.inside?(obj.to_rect)
|
|
129
84
|
end
|
|
130
85
|
|
|
131
|
-
# @param [Ray::Rect, #
|
|
132
|
-
# @return [true, false]
|
|
86
|
+
# @param [Ray::Rect, #to_rect] (See #collide?)
|
|
133
87
|
def outside?(obj)
|
|
134
88
|
rect.outside?(obj.to_rect)
|
|
135
89
|
end
|
|
@@ -138,47 +92,31 @@ module Ray
|
|
|
138
92
|
rect
|
|
139
93
|
end
|
|
140
94
|
|
|
141
|
-
# @return [
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
# @return [Integer] position of the sprite
|
|
145
|
-
attr_accessor :x, :y
|
|
146
|
-
|
|
147
|
-
# @return [Ray::Rect] the part of the image which will be drawn. An empty
|
|
148
|
-
# rect means the whole image.
|
|
149
|
-
attr_accessor :from_rect
|
|
150
|
-
|
|
151
|
-
# @return [Ray::Rect] the position of the sprite
|
|
152
|
-
def pos
|
|
153
|
-
[x, y]
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
# Sets the position of the sprite
|
|
157
|
-
def pos=(ary)
|
|
158
|
-
rect = ary.to_rect
|
|
159
|
-
|
|
160
|
-
self.x = rect.x
|
|
161
|
-
self.y = rect.y
|
|
95
|
+
# @return [Integer] x position of the sprite
|
|
96
|
+
def x
|
|
97
|
+
pos.x
|
|
162
98
|
end
|
|
163
99
|
|
|
164
|
-
# @return [
|
|
165
|
-
def
|
|
166
|
-
|
|
100
|
+
# @return [Integer] y position of the sprite
|
|
101
|
+
def y
|
|
102
|
+
pos.y
|
|
167
103
|
end
|
|
168
104
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
@angle = (val % 360).zero? ? nil : val
|
|
105
|
+
def x=(value)
|
|
106
|
+
self.pos = [value, y]
|
|
172
107
|
end
|
|
173
108
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
@zoom ? @zoom : 1
|
|
109
|
+
def y=(value)
|
|
110
|
+
self.pos = [x, value]
|
|
177
111
|
end
|
|
178
112
|
|
|
179
|
-
|
|
180
|
-
def
|
|
181
|
-
|
|
182
|
-
end
|
|
113
|
+
def scale_x; scale.x; end
|
|
114
|
+
def scale_y; scale.y; end
|
|
115
|
+
|
|
116
|
+
def scale_x=(val); self.scale = [val, scale_y]; end
|
|
117
|
+
def scale_y=(val); self.scale = [scale_x, val]; end
|
|
118
|
+
|
|
119
|
+
alias :zoom :scale
|
|
120
|
+
alias :zoom= :scale=
|
|
183
121
|
end
|
|
184
122
|
end
|