dxruby_rp5 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/dxruby_rp5.rb +5 -0
- data/lib/dxruby_rp5/image.rb +84 -0
- data/lib/dxruby_rp5/input.rb +166 -24
- data/lib/dxruby_rp5/render_target.rb +39 -1
- data/lib/dxruby_rp5/sound.rb +13 -0
- data/lib/dxruby_rp5/version.rb +1 -1
- data/lib/dxruby_rp5/window.rb +14 -0
- data/spec/lib/dxruby_rp5/image_spec.rb +18 -0
- data/spec/lib/dxruby_rp5/render_taret_spec.rb +1 -1
- data/spec/lib/dxruby_rp5/sound_spec.rb +21 -16
- data/spec/spec_helper.rb +4 -2
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9c490773a29a58b52f489b9b893e33cb3c4d6ba
|
4
|
+
data.tar.gz: 03ea8c62a61f80d00fa5a0159b31e101452ecf75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a6046643c99531feb44b81a097cdabb75f764868fa793855bf0c618f1bf8194651a26c72f4c8261bf126000ef689f25ef95f869b2f7530cfe1447dd5f26f9d6
|
7
|
+
data.tar.gz: 3556a91f3361ff116d0b01bfda9b96a2810c6fb1186fcb9605afb674f812f29730146cb4667001ce73878621d26ba8b0f9f11362fb56a0babc32e608b906ecdf
|
data/lib/dxruby_rp5.rb
CHANGED
@@ -243,4 +243,9 @@ if RUBY_ENGINE == "jruby"
|
|
243
243
|
require_relative 'dxruby_rp5/sound'
|
244
244
|
require_relative 'dxruby_rp5/sound_effect'
|
245
245
|
require_relative 'dxruby_rp5/render_target'
|
246
|
+
|
247
|
+
Processing::App.sketch_class.class_eval do
|
248
|
+
load_library :minim
|
249
|
+
import 'ddf.minim'
|
250
|
+
end
|
246
251
|
end
|
data/lib/dxruby_rp5/image.rb
CHANGED
@@ -87,6 +87,37 @@ module DXRubyRP5
|
|
87
87
|
return c[0..max] == _color
|
88
88
|
end
|
89
89
|
|
90
|
+
def line(x1, y1, x2, y2, _color)
|
91
|
+
_color = to_rp5_color(_color)
|
92
|
+
draw_on_image(_color, false) do |pg|
|
93
|
+
pg.line(x1, y1, x2, y2)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def box(x1, y1, x2, y2, _color)
|
98
|
+
rect(x1, y1, x2, y2, _color)
|
99
|
+
end
|
100
|
+
|
101
|
+
def box_fill(x1, y1, x2, y2, _color)
|
102
|
+
rect(x1, y1, x2, y2, _color, true)
|
103
|
+
end
|
104
|
+
|
105
|
+
def circle(x, y, r, _color)
|
106
|
+
ellipse(x, y, 2*r, 2*r, _color)
|
107
|
+
end
|
108
|
+
|
109
|
+
def circle_fill(x, y, r, _color)
|
110
|
+
ellipse(x, y, 2*r, 2*r, _color, true)
|
111
|
+
end
|
112
|
+
|
113
|
+
def triangle(x1, y1, x2, y2, x3, y3, _color)
|
114
|
+
_triangle(x1, y1, x2, y2, x3, y3, _color)
|
115
|
+
end
|
116
|
+
|
117
|
+
def triangle_fill(x1, y1, x2, y2, x3, y3, _color)
|
118
|
+
_triangle(x1, y1, x2, y2, x3, y3, _color, true)
|
119
|
+
end
|
120
|
+
|
90
121
|
def slice(x, y, width, height)
|
91
122
|
image = self.class.new(0, 0)
|
92
123
|
s = $app.create_image(width, height, Processing::App::ARGB)
|
@@ -113,6 +144,9 @@ module DXRubyRP5
|
|
113
144
|
alias_method :load_to_array, :load_tiles
|
114
145
|
alias_method :loadToArray, :load_to_array
|
115
146
|
end
|
147
|
+
alias_method :boxFill, :box_fill
|
148
|
+
alias_method :circleFill, :circle_fill
|
149
|
+
alias_method :triangleFill, :triangle_fill
|
116
150
|
alias_method :setColorKey, :set_color_key
|
117
151
|
alias_method :sliceTiles, :slice_tiles
|
118
152
|
alias_method :slice_to_array, :slice_tiles
|
@@ -143,5 +177,55 @@ module DXRubyRP5
|
|
143
177
|
def blue(rgb)
|
144
178
|
return rgb & 0xFF
|
145
179
|
end
|
180
|
+
|
181
|
+
# TODO: simplify
|
182
|
+
def draw_on_image(rp5_color, fill)
|
183
|
+
w, h = @_surface.width, @_surface.height
|
184
|
+
pg = $app.create_graphics(w, h)
|
185
|
+
pg.begin_draw
|
186
|
+
pg.image(@_surface, 0, 0)
|
187
|
+
pg.push_matrix
|
188
|
+
if fill
|
189
|
+
pg.no_stroke
|
190
|
+
pg.fill(*rp5_color)
|
191
|
+
calibration = 0
|
192
|
+
else
|
193
|
+
# processingの仕様でstrokeでは描画する図形の右端・下端の外側に
|
194
|
+
# 線を引くため、指定した幅と高さに収まるよう、線の太さ(-1)分の
|
195
|
+
# 補正値をかける
|
196
|
+
pg.stroke(*rp5_color)
|
197
|
+
pg.no_fill
|
198
|
+
calibration = -1
|
199
|
+
end
|
200
|
+
yield(pg, calibration)
|
201
|
+
pg.pop_matrix
|
202
|
+
pg.end_draw
|
203
|
+
@_surface.copy(pg, 0, 0, w, h, 0, 0, w, h)
|
204
|
+
return self
|
205
|
+
end
|
206
|
+
|
207
|
+
def rect(x1, y1, x2, y2, _color, fill=false)
|
208
|
+
_color = to_rp5_color(_color)
|
209
|
+
rect_w = x2 - x1
|
210
|
+
rect_h = y2 - y1
|
211
|
+
draw_on_image(_color, fill) do |pg, c|
|
212
|
+
pg.rect(x1, y1, rect_w + c, rect_h + c)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
def ellipse(x, y, width, heigth, _color, fill=false)
|
217
|
+
_color = to_rp5_color(_color)
|
218
|
+
draw_on_image(_color, fill) do |pg, c|
|
219
|
+
pg.ellipse(x, y, width + c, height + c)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def _triangle(x1, y1, x2, y2, x3, y3, _color, fill=false)
|
224
|
+
_color = to_rp5_color(_color)
|
225
|
+
draw_on_image(_color, fill) do |pg, c|
|
226
|
+
# TODO: use calibration
|
227
|
+
pg.triangle(x1, y1, x2, y2, x3, y3)
|
228
|
+
end
|
229
|
+
end
|
146
230
|
end
|
147
231
|
end
|
data/lib/dxruby_rp5/input.rb
CHANGED
@@ -21,11 +21,12 @@ module DXRubyRP5
|
|
21
21
|
else
|
22
22
|
cond = lambda { |key| rp5_key_press?(key) }
|
23
23
|
end
|
24
|
+
pad_val = rp5_pad_slider_value(:x)
|
24
25
|
|
25
|
-
if cond.call(Processing::App::LEFT)
|
26
|
+
if cond.call(Processing::App::LEFT) || pad_val < 0
|
26
27
|
res -= 1
|
27
28
|
end
|
28
|
-
if cond.call(Processing::App::RIGHT)
|
29
|
+
if cond.call(Processing::App::RIGHT) || pad_val > 0
|
29
30
|
res += 1
|
30
31
|
end
|
31
32
|
return res
|
@@ -39,11 +40,12 @@ module DXRubyRP5
|
|
39
40
|
else
|
40
41
|
cond = lambda { |key| rp5_key_press?(key) }
|
41
42
|
end
|
43
|
+
pad_val = rp5_pad_slider_value(:y)
|
42
44
|
|
43
|
-
if cond.call(Processing::App::UP)
|
45
|
+
if cond.call(Processing::App::UP) || pad_val < 0
|
44
46
|
res -= 1
|
45
47
|
end
|
46
|
-
if cond.call(Processing::App::DOWN)
|
48
|
+
if cond.call(Processing::App::DOWN) || pad_val > 0
|
47
49
|
res += 1
|
48
50
|
end
|
49
51
|
return res
|
@@ -74,22 +76,22 @@ module DXRubyRP5
|
|
74
76
|
end
|
75
77
|
|
76
78
|
def mouse_down?(button)
|
77
|
-
if @
|
78
|
-
return @
|
79
|
+
if @pressed_mbuttons
|
80
|
+
return @pressed_mbuttons.include?(button)
|
79
81
|
else
|
80
82
|
return rp5_mouse_down?(button)
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
84
86
|
def mouse_push?(button)
|
85
|
-
if @
|
86
|
-
return @
|
87
|
+
if @pushed_mbuttons
|
88
|
+
return @pushed_mbuttons.include?(button)
|
87
89
|
else
|
88
90
|
return rp5_mouse_down?(button)
|
89
91
|
end
|
90
92
|
end
|
91
93
|
|
92
|
-
# TODO: support
|
94
|
+
# TODO: support pad_number
|
93
95
|
def pad_down?(button_code, pad_number = 0)
|
94
96
|
if button_code == P_BUTTON0 && key_down?(K_Z) ||
|
95
97
|
button_code == P_BUTTON1 && key_down?(K_X) ||
|
@@ -97,13 +99,14 @@ module DXRubyRP5
|
|
97
99
|
button_code == P_LEFT && key_down?(K_LEFT) ||
|
98
100
|
button_code == P_RIGHT && key_down?(K_RIGHT) ||
|
99
101
|
button_code == P_UP && key_down?(K_UP) ||
|
100
|
-
button_code == P_DOWN && key_down?(K_DOWN)
|
102
|
+
button_code == P_DOWN && key_down?(K_DOWN) ||
|
103
|
+
rp5_pad_pressed?(button_code)
|
101
104
|
return true
|
102
105
|
end
|
103
106
|
return false
|
104
107
|
end
|
105
108
|
|
106
|
-
# TODO: support
|
109
|
+
# TODO: support pad_number
|
107
110
|
def pad_push?(button_code, pad_number = 0)
|
108
111
|
if button_code == P_BUTTON0 && key_push?(K_Z) ||
|
109
112
|
button_code == P_BUTTON1 && key_push?(K_X) ||
|
@@ -111,7 +114,8 @@ module DXRubyRP5
|
|
111
114
|
button_code == P_LEFT && key_push?(K_LEFT) ||
|
112
115
|
button_code == P_RIGHT && key_push?(K_RIGHT) ||
|
113
116
|
button_code == P_UP && key_push?(K_UP) ||
|
114
|
-
button_code == P_DOWN && key_push?(K_DOWN)
|
117
|
+
button_code == P_DOWN && key_push?(K_DOWN) ||
|
118
|
+
rp5_pad_pushed?(button_code)
|
115
119
|
return true
|
116
120
|
end
|
117
121
|
return false
|
@@ -223,6 +227,21 @@ module DXRubyRP5
|
|
223
227
|
return rp5_button == pressed_button
|
224
228
|
end
|
225
229
|
|
230
|
+
def rp5_pad_slider_value(dir)
|
231
|
+
return 0 if !@pad_sliders
|
232
|
+
@pad_sliders[dir].value
|
233
|
+
end
|
234
|
+
|
235
|
+
def rp5_pad_pushed?(button_code)
|
236
|
+
@pushed_pbuttons ||= []
|
237
|
+
@pushed_pbuttons.include?(button_code)
|
238
|
+
end
|
239
|
+
|
240
|
+
def rp5_pad_pressed?(button_code)
|
241
|
+
@pressed_pbuttons ||= []
|
242
|
+
@pressed_pbuttons.include?(button_code)
|
243
|
+
end
|
244
|
+
|
226
245
|
def to_rp5_key(key_code)
|
227
246
|
return RP5_KEY_TABLE[key_code]
|
228
247
|
end
|
@@ -274,27 +293,27 @@ module DXRubyRP5
|
|
274
293
|
end
|
275
294
|
|
276
295
|
def mouse_pressed(button)
|
277
|
-
@
|
296
|
+
@pressed_mbuttons ||= []
|
278
297
|
rp5_button = JAVA_RP5_MBUTTON_TABLE[button]
|
279
298
|
dbutton = to_dxruby_button(rp5_button)
|
280
|
-
@
|
299
|
+
@pressed_mbuttons << dbutton
|
281
300
|
end
|
282
301
|
|
283
302
|
def mouse_pushed(button)
|
284
|
-
@
|
285
|
-
@
|
303
|
+
@pushed_mbuttons ||= []
|
304
|
+
@checked_mbuttons ||= []
|
286
305
|
rp5_button = JAVA_RP5_MBUTTON_TABLE[button]
|
287
306
|
dbutton = to_dxruby_button(rp5_button)
|
288
|
-
return if @
|
289
|
-
@
|
307
|
+
return if @checked_mbuttons.include?(dbutton)
|
308
|
+
@pushed_mbuttons << dbutton
|
290
309
|
end
|
291
310
|
|
292
311
|
def mouse_released(button)
|
293
|
-
return if @
|
312
|
+
return if @pressed_mbuttons.nil?
|
294
313
|
rp5_button = JAVA_RP5_MBUTTON_TABLE[button]
|
295
314
|
dbutton = to_dxruby_button(rp5_button)
|
296
|
-
@
|
297
|
-
@
|
315
|
+
@pressed_mbuttons.delete(dbutton)
|
316
|
+
@checked_mbuttons.delete(dbutton)
|
298
317
|
end
|
299
318
|
|
300
319
|
def handle_key_events
|
@@ -310,10 +329,133 @@ module DXRubyRP5
|
|
310
329
|
@checked_keys -= @pressed_keys
|
311
330
|
end
|
312
331
|
|
313
|
-
return if @
|
314
|
-
@
|
315
|
-
@
|
332
|
+
return if @pushed_mbuttons.nil?
|
333
|
+
@checked_mbuttons = (@checked_mbuttons || @pushed_mbuttons)
|
334
|
+
@pushed_mbuttons.clear
|
335
|
+
end
|
336
|
+
|
337
|
+
PSLIDER_DIRS = {
|
338
|
+
x: [DXRubyRP5.const_get(:P_RIGHT),
|
339
|
+
DXRubyRP5.const_get(:P_LEFT)],
|
340
|
+
y: [DXRubyRP5.const_get(:P_DOWN),
|
341
|
+
DXRubyRP5.const_get(:P_UP)],
|
342
|
+
}
|
343
|
+
|
344
|
+
def handle_pad_events
|
345
|
+
return if @pad_sliders.nil? || @pad_buttons.nil?
|
346
|
+
@pad_buttons.each do |key, button|
|
347
|
+
if button.pressed
|
348
|
+
pbutton_pressed(key)
|
349
|
+
else
|
350
|
+
pbutton_released(key)
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
@pad_sliders.each do |symbol, slider|
|
355
|
+
val = slider.value
|
356
|
+
if val > 0
|
357
|
+
pbutton_pressed(PSLIDER_DIRS[symbol][0])
|
358
|
+
elsif val < 0
|
359
|
+
pbutton_pressed(PSLIDER_DIRS[symbol][1])
|
360
|
+
else
|
361
|
+
pbutton_released(PSLIDER_DIRS[symbol][0])
|
362
|
+
pbutton_released(PSLIDER_DIRS[symbol][1])
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
def pbutton_pressed(key)
|
368
|
+
if @pushed_pbuttons.include?(key)
|
369
|
+
@pushed_pbuttons.delete(key)
|
370
|
+
else
|
371
|
+
if !@pressed_pbuttons.include?(key)
|
372
|
+
@pushed_pbuttons << key
|
373
|
+
@pressed_pbuttons << key
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
def pbutton_released(key)
|
379
|
+
@pushed_pbuttons.delete(key)
|
380
|
+
@pressed_pbuttons.delete(key)
|
381
|
+
end
|
382
|
+
|
383
|
+
def load_gcp_native_libraries
|
384
|
+
sketch_class = Processing::App.sketch_class
|
385
|
+
lib_loader = sketch_class.class_variable_get(:@@library_loader)
|
386
|
+
gcp_library_path =
|
387
|
+
lib_loader.send(:get_library_directory_path, "GameControlPlus")
|
388
|
+
java.lang.System.setProperty("java.library.path", gcp_library_path)
|
389
|
+
loader = java.lang.Class.for_name("java.lang.ClassLoader")
|
390
|
+
field = loader.get_declared_field("sys_paths")
|
391
|
+
if field
|
392
|
+
field.accessible = true
|
393
|
+
loader = java.lang.Class.for_name("java.lang.System").get_class_loader
|
394
|
+
field.set(loader, nil)
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
def setup_pad_input(device)
|
399
|
+
@pad_buttons = {}
|
400
|
+
@pad_sliders = {}
|
401
|
+
dummy_slider = Object.new
|
402
|
+
dummy_slider.instance_eval {|obj| def value; 0; end }
|
403
|
+
dummy_button = Object.new
|
404
|
+
dummy_button.instance_eval {|obj| def pressed; false; end }
|
405
|
+
|
406
|
+
# get sliders
|
407
|
+
[:x, :y].each do |name|
|
408
|
+
if device
|
409
|
+
device.get_number_of_sliders.times do |i|
|
410
|
+
slider = device.get_slider(i)
|
411
|
+
key = slider.name.to_sym
|
412
|
+
@pad_sliders[name] = slider if key == name
|
413
|
+
end
|
414
|
+
end
|
415
|
+
@pad_sliders[name] ||= dummy_slider
|
416
|
+
end
|
417
|
+
|
418
|
+
# get buttons
|
419
|
+
(0..15).each do |idx|
|
420
|
+
key = DXRubyRP5.const_get("P_BUTTON#{idx}")
|
421
|
+
begin
|
422
|
+
button = device ? device.get_button(idx) : dummy_button
|
423
|
+
rescue Java::JavaLang::IndexOutOfBoundsException => e
|
424
|
+
button = dummy_button
|
425
|
+
end
|
426
|
+
@pad_buttons[key] = button
|
427
|
+
end
|
428
|
+
@pushed_pbuttons = []
|
429
|
+
@pressed_pbuttons = []
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
433
|
+
# for gamepad/joystick
|
434
|
+
begin
|
435
|
+
device = nil
|
436
|
+
Processing::App.sketch_class.class_eval do
|
437
|
+
load_library :GameControlPlus
|
438
|
+
end
|
439
|
+
rescue LoadError => e
|
440
|
+
puts "WARN: Couldn't load library for gamepad/joystick"
|
441
|
+
puts "If you want to use gamepad or joystick, " \
|
442
|
+
"add 'GameControlPlus' library via PDE."
|
443
|
+
else
|
444
|
+
import "org.gamecontrolplus.ControlIO"
|
445
|
+
load_gcp_native_libraries
|
446
|
+
begin
|
447
|
+
list = ControlIO.get_instance($app).get_devices
|
448
|
+
device_types = [
|
449
|
+
Java::NetJavaGamesInput::Controller::Type::STICK,
|
450
|
+
Java::NetJavaGamesInput::Controller::Type::FINGERSTICK,
|
451
|
+
Java::NetJavaGamesInput::Controller::Type::GAMEPAD,
|
452
|
+
].map(&:to_string)
|
453
|
+
device = list.find {|dev| device_types.include?(dev.get_type_name) }
|
454
|
+
device.open if device
|
455
|
+
rescue Java::JavaLang::NullPointerException
|
456
|
+
# cannot get devices when running spec
|
316
457
|
end
|
317
458
|
end
|
459
|
+
setup_pad_input(device)
|
318
460
|
end
|
319
461
|
end
|
@@ -4,7 +4,7 @@ module DXRubyRP5
|
|
4
4
|
attr_reader :bgcolor
|
5
5
|
attr_reader :_surface
|
6
6
|
|
7
|
-
def initialize(width, height, _bgcolor = [0,
|
7
|
+
def initialize(width, height, _bgcolor = [0, 255, 255, 255])
|
8
8
|
_bgcolor = to_rp5_color(_bgcolor)
|
9
9
|
@bgcolor = $app.color(*_bgcolor)
|
10
10
|
@_surface = $app.create_graphics(width, height)
|
@@ -47,6 +47,41 @@ module DXRubyRP5
|
|
47
47
|
@queue << draw_task
|
48
48
|
end
|
49
49
|
|
50
|
+
def draw_font(x, y, string, font, hash = {})
|
51
|
+
if string.empty?
|
52
|
+
return
|
53
|
+
end
|
54
|
+
if hash[:color]
|
55
|
+
color = $app.color(*hash[:color])
|
56
|
+
else
|
57
|
+
color = $app.color(255)
|
58
|
+
end
|
59
|
+
|
60
|
+
proc = lambda do
|
61
|
+
@_surface.push_matrix
|
62
|
+
@_surface.text_size(font.size)
|
63
|
+
@_surface.text_font(font.native)
|
64
|
+
# DXRubyでは文字の配置指定はできないため、都度text_alignを指定
|
65
|
+
# せず固定で良いかもしれない
|
66
|
+
@_surface.text_align(Processing::App::LEFT, Processing::App::TOP)
|
67
|
+
@_surface.fill(color)
|
68
|
+
string.lines.each.with_index do |line, i|
|
69
|
+
line.chomp!
|
70
|
+
if line.empty?
|
71
|
+
next
|
72
|
+
end
|
73
|
+
@_surface.text(string, x, y)
|
74
|
+
end
|
75
|
+
@_surface.pop_matrix
|
76
|
+
end
|
77
|
+
|
78
|
+
draw_task = {
|
79
|
+
:proc => proc,
|
80
|
+
:z => hash[:z] || 0,
|
81
|
+
}
|
82
|
+
@queue << draw_task
|
83
|
+
end
|
84
|
+
|
50
85
|
def draw_tile(basex, basey, map, image_arr, startx, starty, sizex, sizey, z = 0)
|
51
86
|
image_arr = image_arr.flatten
|
52
87
|
first_img = image_arr[0]
|
@@ -88,6 +123,9 @@ module DXRubyRP5
|
|
88
123
|
end
|
89
124
|
end
|
90
125
|
|
126
|
+
alias_method :drawFont, :draw_font
|
127
|
+
alias_method :drawTile, :draw_tile
|
128
|
+
|
91
129
|
private
|
92
130
|
|
93
131
|
def to_dxr_color(c)
|
data/lib/dxruby_rp5/sound.rb
CHANGED
@@ -1,10 +1,23 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
module DXRubyRP5
|
3
3
|
class Sound
|
4
|
+
class << self
|
5
|
+
private
|
6
|
+
|
7
|
+
def minim
|
8
|
+
@minim ||= Java::DdfMinim::Minim.new($app)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
4
12
|
def initialize(filename)
|
13
|
+
@_sound = self.class.send(:minim).load_file(filename)
|
5
14
|
end
|
6
15
|
|
7
16
|
def play
|
17
|
+
# TODO: loop
|
18
|
+
@_sound.play
|
19
|
+
@_sound.rewind
|
20
|
+
return self
|
8
21
|
end
|
9
22
|
|
10
23
|
def set_volume(volume, time = 0)
|
data/lib/dxruby_rp5/version.rb
CHANGED
data/lib/dxruby_rp5/window.rb
CHANGED
@@ -29,6 +29,14 @@ module DXRubyRP5
|
|
29
29
|
$app.frame.set_title(val)
|
30
30
|
end
|
31
31
|
|
32
|
+
def fps
|
33
|
+
$app.frame_rate
|
34
|
+
end
|
35
|
+
|
36
|
+
def fps=(val)
|
37
|
+
$app.frame_rate(val)
|
38
|
+
end
|
39
|
+
|
32
40
|
def get_load
|
33
41
|
# TODO:
|
34
42
|
return 0
|
@@ -40,6 +48,7 @@ module DXRubyRP5
|
|
40
48
|
block.call
|
41
49
|
Window.send(:exec_draw_tasks)
|
42
50
|
Input.send(:handle_key_events)
|
51
|
+
Input.send(:handle_pad_events)
|
43
52
|
end
|
44
53
|
|
45
54
|
Processing::App.sketch_class.class_eval { define_method(:draw, proc) }
|
@@ -100,8 +109,12 @@ module DXRubyRP5
|
|
100
109
|
end
|
101
110
|
|
102
111
|
proc = lambda do
|
112
|
+
$app.push_matrix
|
103
113
|
$app.text_size(font.size)
|
104
114
|
$app.text_font(font.native)
|
115
|
+
# DXRubyでは文字の配置指定はできないため、都度text_alignを指定
|
116
|
+
# せず固定で良いかもしれない
|
117
|
+
$app.text_align(Processing::App::LEFT, Processing::App::TOP)
|
105
118
|
$app.fill(color)
|
106
119
|
string.lines.each.with_index do |line, i|
|
107
120
|
line.chomp!
|
@@ -110,6 +123,7 @@ module DXRubyRP5
|
|
110
123
|
end
|
111
124
|
$app.text(string, x, y)
|
112
125
|
end
|
126
|
+
$app.pop_matrix
|
113
127
|
end
|
114
128
|
|
115
129
|
if @use_window_loop
|
@@ -118,6 +118,24 @@ describe DXRubyRP5::Image, '画像を表すクラス' do
|
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
121
|
+
# Sketch#run しないと内部で使用している #create_graphics がエラーにな
|
122
|
+
# るためテストできない
|
123
|
+
# TODO: テスト方法を見出す
|
124
|
+
describe '#line' do
|
125
|
+
let(:image) { described_class.new(2, 2) }
|
126
|
+
let(:color) { [255, 255, 255] }
|
127
|
+
|
128
|
+
subject { image.line(x1, y1, x2, y2, color) }
|
129
|
+
end
|
130
|
+
|
131
|
+
# 以下、同上
|
132
|
+
describe '#box' do; end
|
133
|
+
describe '#box_fill' do; end
|
134
|
+
describe '#circle' do; end
|
135
|
+
describe '#circle_fill' do; end
|
136
|
+
describe '#triangle' do; end
|
137
|
+
describe '#triangle_fill' do; end
|
138
|
+
|
121
139
|
describe '#slice' do
|
122
140
|
let(:image) { described_class.load(fixture_path('image.png')) }
|
123
141
|
|
@@ -4,15 +4,20 @@ require 'spec_helper'
|
|
4
4
|
describe DXRubyRP5::Sound, '音を表すクラス' do
|
5
5
|
describe '.new' do
|
6
6
|
shared_context '.new' do
|
7
|
-
|
7
|
+
before(:each) do
|
8
|
+
m = Java::DdfMinim::Minim.new($app)
|
9
|
+
Java::DdfMinim::Minim.should_receive(:new).with($app).once.and_return(m)
|
10
|
+
end
|
11
|
+
|
12
|
+
subject { described_class.new(path) }
|
8
13
|
|
9
14
|
it '呼び出すことができる' do
|
10
|
-
subject
|
15
|
+
expect { subject }.to_not raise_error
|
11
16
|
end
|
12
17
|
end
|
13
18
|
|
14
19
|
context 'WAVE形式のファイルの場合' do
|
15
|
-
let(:
|
20
|
+
let(:path) { fixture_path('sound.wav') }
|
16
21
|
|
17
22
|
include_context '.new'
|
18
23
|
end
|
@@ -25,26 +30,26 @@ describe DXRubyRP5::Sound, '音を表すクラス' do
|
|
25
30
|
end
|
26
31
|
|
27
32
|
describe '#play' do
|
28
|
-
|
29
|
-
let(:
|
30
|
-
|
33
|
+
shared_context '#play' do
|
34
|
+
let(:sound) do
|
35
|
+
sound = described_class.new(path)
|
36
|
+
audio_player = sound.instance_variable_get(:@_sound)
|
37
|
+
audio_player.should_receive(:play).once
|
38
|
+
audio_player.should_receive(:rewind).once
|
39
|
+
sound
|
40
|
+
end
|
31
41
|
|
32
42
|
subject { sound.play }
|
33
43
|
|
34
|
-
it
|
35
|
-
|
36
|
-
|
44
|
+
it { should eq(sound) }
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'WAVE形式のファイルの場合' do
|
48
|
+
let(:path) { fixture_path('sound.wav') }
|
37
49
|
end
|
38
50
|
|
39
51
|
# context 'MIDI形式のファイルの場合' do
|
40
52
|
# let(:path) { fixture_path('bgm.mid') }
|
41
|
-
# let(:sound) { DXRubySDL::Sound.new(path) }
|
42
|
-
#
|
43
|
-
# subject { sound.play }
|
44
|
-
#
|
45
|
-
# it '呼び出すことができる' do
|
46
|
-
# subject
|
47
|
-
# end
|
48
53
|
# end
|
49
54
|
end
|
50
55
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
3
|
-
require '
|
4
|
-
require 'dxruby_rp5'
|
3
|
+
require 'ruby-processing'
|
5
4
|
|
6
5
|
# redefine Processing::App#initialize so that dose not run sketch.
|
7
6
|
class Processing::App
|
@@ -41,3 +40,6 @@ sketch_path = File.expand_path('fixtures/test_sketch.rb', File.dirname(__FILE__)
|
|
41
40
|
require sketch_path
|
42
41
|
|
43
42
|
Processing::App.const_set(:SKETCH_PATH, sketch_path)
|
43
|
+
|
44
|
+
require 'dxruby'
|
45
|
+
require 'dxruby_rp5'
|
metadata
CHANGED
@@ -1,59 +1,59 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dxruby_rp5
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuki Morohoshi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: ruby-processing
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '2.4'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '2.4'
|
55
|
-
description:
|
56
|
-
uses `ruby-processing` and has API same as DXRuby.
|
55
|
+
description: "`dxruby-rp5` is a ruby library for 2D graphics and game. `dxruby-rp5`
|
56
|
+
uses `ruby-processing` and has API same as DXRuby."
|
57
57
|
email:
|
58
58
|
- hoshi.sanou@gmail.com
|
59
59
|
executables:
|
@@ -61,8 +61,8 @@ executables:
|
|
61
61
|
extensions: []
|
62
62
|
extra_rdoc_files: []
|
63
63
|
files:
|
64
|
-
- .gitignore
|
65
|
-
- .rspec
|
64
|
+
- ".gitignore"
|
65
|
+
- ".rspec"
|
66
66
|
- Gemfile
|
67
67
|
- LICENSE.txt
|
68
68
|
- README.md
|
@@ -623,17 +623,17 @@ require_paths:
|
|
623
623
|
- lib
|
624
624
|
required_ruby_version: !ruby/object:Gem::Requirement
|
625
625
|
requirements:
|
626
|
-
- -
|
626
|
+
- - ">="
|
627
627
|
- !ruby/object:Gem::Version
|
628
628
|
version: '0'
|
629
629
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
630
630
|
requirements:
|
631
|
-
- -
|
631
|
+
- - ">="
|
632
632
|
- !ruby/object:Gem::Version
|
633
633
|
version: '0'
|
634
634
|
requirements: []
|
635
635
|
rubyforge_project:
|
636
|
-
rubygems_version: 2.
|
636
|
+
rubygems_version: 2.2.2
|
637
637
|
signing_key:
|
638
638
|
specification_version: 4
|
639
639
|
summary: 2D graphics and game library
|