dxruby_sdl 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 +8 -8
- data/.gitignore +2 -0
- data/Guardfile +25 -0
- data/Rakefile +20 -0
- data/dxruby_sdl.gemspec +2 -0
- data/lib/dxruby_sdl/image.rb +6 -1
- data/lib/dxruby_sdl/input.rb +68 -12
- data/lib/dxruby_sdl/sound_effect.rb +17 -0
- data/lib/dxruby_sdl/version.rb +1 -1
- data/lib/dxruby_sdl/window.rb +61 -13
- data/lib/dxruby_sdl.rb +10 -0
- data/spec/dxruby_sdl/image_spec.rb +8 -0
- data/spec/dxruby_sdl/input_spec.rb +226 -20
- data/spec/dxruby_sdl/sound_effect_spec.rb +42 -0
- data/spec/dxruby_sdl/window_spec.rb +34 -0
- data/spec/dxruby_sdl_spec.rb +9 -0
- metadata +34 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZjEyN2ViYzcxYTFiMGVjNTJhOTU2MDg3M2Q1YjMxNDExOWE1NGQ5Yw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YTg5ZGE1YTUxYWUzNzFlOGVkYTk5MTFkN2MwNTVhMDZkZGQ2ZmI1ZQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDExY2Q5MzA3YWUyZGY4Y2U0YmJjZTBiNTE1ZGZjNGE2ZGY1NDE2ZTFkNDM3
|
10
|
+
Yjg5ZDRhZGMxMDQ2YTRlYTVjYzM0NDY3NTVkMzJjYWFjYzZjNWI2NmU5OWQ0
|
11
|
+
YzRiYjg1NmM3YjhjNDVjMmQ1M2FhYmViZGZmOGVmMjI2M2E4ZWI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OTc1ZGZhZWJmY2QzZTkxMzkzZmFmZWY1MGU4YmRmMGI0MTAxOGI3YmM5ODZk
|
14
|
+
NWNjNTY3MWFjNWMxNDE0ODU1NzQ4ZWEzYTVkZmEyNTI3ZGVhMTVhMzUyZTI5
|
15
|
+
ZTAxNDJkYmQyZjUxNmY2MGUwYWVlMzI1ODVkZjg0NDFiYWIwY2U=
|
data/.gitignore
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
rspec_option = {
|
5
|
+
all_after_pass: false,
|
6
|
+
all_on_start: false
|
7
|
+
}
|
8
|
+
if /darwin/ =~ RUBY_PLATFORM
|
9
|
+
rspec_option[:binstubs] = 'spec'
|
10
|
+
end
|
11
|
+
guard :rspec, rspec_option do
|
12
|
+
watch(%r{^spec/.+_spec\.rb$})
|
13
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
14
|
+
watch('spec/spec_helper.rb') { "spec" }
|
15
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
16
|
+
end
|
17
|
+
|
18
|
+
guard :rubocop, all_on_start: false do
|
19
|
+
watch(%r{.+\.rb$})
|
20
|
+
watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
|
21
|
+
end
|
22
|
+
|
23
|
+
# Local Variables:
|
24
|
+
# mode: ruby
|
25
|
+
# End:
|
data/Rakefile
CHANGED
@@ -5,8 +5,28 @@ if /darwin/ =~ RUBY_PLATFORM
|
|
5
5
|
task :spec do
|
6
6
|
sh "rsdl -S rspec #{ENV['SPEC_OPTS']} #{ENV['SPEC']}"
|
7
7
|
end
|
8
|
+
|
9
|
+
task :guard do
|
10
|
+
rspec_path = 'spec/rspec'
|
11
|
+
File.open(rspec_path, 'w') do |f|
|
12
|
+
f.write(<<-EOS)
|
13
|
+
#!/bin/sh
|
14
|
+
bundle exec rsdl -S rspec $@
|
15
|
+
EOS
|
16
|
+
end
|
17
|
+
chmod(0755, rspec_path)
|
18
|
+
begin
|
19
|
+
sh "bundle exec guard"
|
20
|
+
ensure
|
21
|
+
rm_rf(rspec_path)
|
22
|
+
end
|
23
|
+
end
|
8
24
|
else
|
9
25
|
RSpec::Core::RakeTask.new(:spec)
|
26
|
+
|
27
|
+
task :guard do
|
28
|
+
sh "bundle exec guard"
|
29
|
+
end
|
10
30
|
end
|
11
31
|
|
12
32
|
task :rubocop do
|
data/dxruby_sdl.gemspec
CHANGED
@@ -24,6 +24,8 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency 'coveralls'
|
25
25
|
spec.add_development_dependency 'travis-lint'
|
26
26
|
spec.add_development_dependency 'rubocop'
|
27
|
+
spec.add_development_dependency 'guard-rspec'
|
28
|
+
spec.add_development_dependency 'guard-rubocop'
|
27
29
|
|
28
30
|
spec.add_runtime_dependency 'rubysdl'
|
29
31
|
spec.add_runtime_dependency 'rsdl' if /darwin/ =~ RUBY_PLATFORM
|
data/lib/dxruby_sdl/image.rb
CHANGED
@@ -37,7 +37,7 @@ module DXRubySDL
|
|
37
37
|
end
|
38
38
|
|
39
39
|
@_surface =
|
40
|
-
SDL::Surface.new(SDL::SWSURFACE, width, height, Window.
|
40
|
+
SDL::Surface.new(SDL::SWSURFACE, width, height, Window.send(:screen))
|
41
41
|
@_surface.fill_rect(0, 0, width, height, @color)
|
42
42
|
end
|
43
43
|
|
@@ -61,6 +61,7 @@ module DXRubySDL
|
|
61
61
|
@_surface.draw_line(x1, y1, x2, y2,
|
62
62
|
to_sdl_color(color), true, to_sdl_alpha(color))
|
63
63
|
end
|
64
|
+
return self
|
64
65
|
end
|
65
66
|
|
66
67
|
def circle(x, y, r, color)
|
@@ -68,6 +69,7 @@ module DXRubySDL
|
|
68
69
|
@_surface.draw_circle(x, y, r, to_sdl_color(color), false, true,
|
69
70
|
to_sdl_alpha(color))
|
70
71
|
end
|
72
|
+
return self
|
71
73
|
end
|
72
74
|
|
73
75
|
def circle_fill(x, y, r, color)
|
@@ -75,6 +77,7 @@ module DXRubySDL
|
|
75
77
|
@_surface.draw_circle(x, y, r, to_sdl_color(color), true, false,
|
76
78
|
to_sdl_alpha(color))
|
77
79
|
end
|
80
|
+
return self
|
78
81
|
end
|
79
82
|
|
80
83
|
def box(x1, y1, x2, y2, color)
|
@@ -86,6 +89,7 @@ module DXRubySDL
|
|
86
89
|
@_surface.draw_rect(x, y, w, h, to_sdl_color(color), false,
|
87
90
|
to_sdl_alpha(color))
|
88
91
|
end
|
92
|
+
return self
|
89
93
|
end
|
90
94
|
|
91
95
|
def box_fill(x1, y1, x2, y2, color)
|
@@ -97,6 +101,7 @@ module DXRubySDL
|
|
97
101
|
@_surface.draw_rect(x, y, w, h, to_sdl_color(color), true,
|
98
102
|
to_sdl_alpha(color))
|
99
103
|
end
|
104
|
+
return self
|
100
105
|
end
|
101
106
|
|
102
107
|
# rubocop:disable SymbolName
|
data/lib/dxruby_sdl/input.rb
CHANGED
@@ -4,12 +4,16 @@ module DXRubySDL
|
|
4
4
|
module Input
|
5
5
|
module_function
|
6
6
|
|
7
|
+
def set_repeat(wait, interval)
|
8
|
+
SDL::Key.enable_key_repeat(wait, interval)
|
9
|
+
end
|
10
|
+
|
7
11
|
def x(pad_number = 0)
|
8
12
|
res = 0
|
9
|
-
if
|
13
|
+
if sdl_key_press?(SDL::Key::LEFT)
|
10
14
|
res -= 1
|
11
15
|
end
|
12
|
-
if
|
16
|
+
if sdl_key_press?(SDL::Key::RIGHT)
|
13
17
|
res += 1
|
14
18
|
end
|
15
19
|
return res
|
@@ -17,19 +21,37 @@ module DXRubySDL
|
|
17
21
|
|
18
22
|
def y(pad_number = 0)
|
19
23
|
res = 0
|
20
|
-
if
|
24
|
+
if sdl_key_press?(SDL::Key::UP)
|
21
25
|
res -= 1
|
22
26
|
end
|
23
|
-
if
|
27
|
+
if sdl_key_press?(SDL::Key::DOWN)
|
24
28
|
res += 1
|
25
29
|
end
|
26
30
|
return res
|
27
31
|
end
|
28
32
|
|
29
33
|
def pad_down?(button_code, pad_number = 0)
|
30
|
-
if button_code == P_BUTTON0 &&
|
31
|
-
button_code == P_BUTTON1 &&
|
32
|
-
button_code == P_BUTTON2 &&
|
34
|
+
if button_code == P_BUTTON0 && sdl_key_press?(SDL::Key::Z) ||
|
35
|
+
button_code == P_BUTTON1 && sdl_key_press?(SDL::Key::X) ||
|
36
|
+
button_code == P_BUTTON2 && sdl_key_press?(SDL::Key::C) ||
|
37
|
+
button_code == P_LEFT && sdl_key_press?(SDL::Key::LEFT) ||
|
38
|
+
button_code == P_RIGHT && sdl_key_press?(SDL::Key::RIGHT) ||
|
39
|
+
button_code == P_UP && sdl_key_press?(SDL::Key::UP) ||
|
40
|
+
button_code == P_DOWN && sdl_key_press?(SDL::Key::DOWN) ||
|
41
|
+
((j = joystick(pad_number)) && j.button(button_code))
|
42
|
+
return true
|
43
|
+
end
|
44
|
+
return false
|
45
|
+
end
|
46
|
+
|
47
|
+
def pad_push?(button_code, pad_number = 0)
|
48
|
+
if button_code == P_BUTTON0 && sdl_key_push?(SDL::Key::Z) ||
|
49
|
+
button_code == P_BUTTON1 && sdl_key_push?(SDL::Key::X) ||
|
50
|
+
button_code == P_BUTTON2 && sdl_key_push?(SDL::Key::C) ||
|
51
|
+
button_code == P_LEFT && sdl_key_push?(SDL::Key::LEFT) ||
|
52
|
+
button_code == P_RIGHT && sdl_key_push?(SDL::Key::RIGHT) ||
|
53
|
+
button_code == P_UP && sdl_key_push?(SDL::Key::UP) ||
|
54
|
+
button_code == P_DOWN && sdl_key_push?(SDL::Key::DOWN) ||
|
33
55
|
((j = joystick(pad_number)) && j.button(button_code))
|
34
56
|
return true
|
35
57
|
end
|
@@ -44,8 +66,12 @@ module DXRubySDL
|
|
44
66
|
return SDL::Mouse.state[1]
|
45
67
|
end
|
46
68
|
|
69
|
+
def key_down?(key_code)
|
70
|
+
return sdl_key_press?(to_sdl_key(key_code))
|
71
|
+
end
|
72
|
+
|
47
73
|
def key_push?(key_code)
|
48
|
-
return
|
74
|
+
return sdl_key_push?(to_sdl_key(key_code))
|
49
75
|
end
|
50
76
|
|
51
77
|
def mouse_down?(button)
|
@@ -69,15 +95,17 @@ module DXRubySDL
|
|
69
95
|
when M_RBUTTON
|
70
96
|
index = 4
|
71
97
|
end
|
72
|
-
return SDL::Mouse.state[index] &&
|
73
|
-
!Window.instance_variable_get('@last_mouse_state')[index]
|
98
|
+
return SDL::Mouse.state[index] && !@last_mouse_state[index]
|
74
99
|
end
|
75
100
|
|
76
101
|
# rubocop:disable SymbolName
|
77
102
|
class << self
|
103
|
+
alias_method :setRepeat, :set_repeat
|
78
104
|
alias_method :padDown?, :pad_down?
|
105
|
+
alias_method :padPush?, :pad_push?
|
79
106
|
alias_method :mousePosX, :mouse_pos_x
|
80
107
|
alias_method :mousePosY, :mouse_pos_y
|
108
|
+
alias_method :keyDown?, :key_down?
|
81
109
|
alias_method :keyPush?, :key_push?
|
82
110
|
alias_method :mouseDown?, :mouse_down?
|
83
111
|
alias_method :mousePush?, :mouse_push?
|
@@ -86,6 +114,9 @@ module DXRubySDL
|
|
86
114
|
|
87
115
|
private
|
88
116
|
|
117
|
+
@current_key_state = Set.new
|
118
|
+
@last_key_state = Set.new
|
119
|
+
@last_mouse_state = [false, false, false]
|
89
120
|
@joysticks = []
|
90
121
|
|
91
122
|
class << self
|
@@ -131,9 +162,34 @@ module DXRubySDL
|
|
131
162
|
end
|
132
163
|
private_constant :KEY_TABLE
|
133
164
|
|
134
|
-
def
|
165
|
+
def store_last_state
|
166
|
+
keys = (@last_key_state - @current_key_state)
|
167
|
+
if keys.length > 0
|
168
|
+
SDL::Key.scan
|
169
|
+
keys.each do |key|
|
170
|
+
if SDL::Key.press?(key)
|
171
|
+
@current_key_state.add(key)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
@last_key_state = @current_key_state
|
176
|
+
@current_key_state = Set.new
|
177
|
+
@last_mouse_state = SDL::Mouse.state
|
178
|
+
end
|
179
|
+
|
180
|
+
def sdl_key_press?(key)
|
135
181
|
SDL::Key.scan
|
136
|
-
|
182
|
+
if SDL::Key.press?(key)
|
183
|
+
@current_key_state.add(key)
|
184
|
+
return true
|
185
|
+
else
|
186
|
+
@current_key_state.delete(key)
|
187
|
+
return false
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def sdl_key_push?(key)
|
192
|
+
return sdl_key_press?(key) && !@last_key_state.include?(key)
|
137
193
|
end
|
138
194
|
|
139
195
|
def joystick(pad_number)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module DXRubySDL
|
4
|
+
class SoundEffect
|
5
|
+
def initialize(time, wavetype = WAVE_RECT, resolution = 1000)
|
6
|
+
end
|
7
|
+
|
8
|
+
def add(wavetype = WAVE_RECT, resolution = 1000)
|
9
|
+
end
|
10
|
+
|
11
|
+
def play
|
12
|
+
end
|
13
|
+
|
14
|
+
def stop
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/dxruby_sdl/version.rb
CHANGED
data/lib/dxruby_sdl/window.rb
CHANGED
@@ -1,18 +1,33 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
require 'dxruby_sdl/window/fpstimer'
|
4
|
+
require 'set'
|
4
5
|
|
5
6
|
module DXRubySDL
|
6
7
|
module Window
|
7
|
-
@last_mouse_state = [false, false, false]
|
8
|
-
|
9
8
|
module_function
|
10
9
|
|
11
|
-
def
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
def width
|
11
|
+
@width ||= DEFAULTS[:width]
|
12
|
+
return @width
|
13
|
+
end
|
14
|
+
|
15
|
+
def height
|
16
|
+
@height ||= DEFAULTS[:height]
|
17
|
+
return @height
|
18
|
+
end
|
19
|
+
|
20
|
+
def scale
|
21
|
+
@scale ||= 1
|
22
|
+
return @scale
|
23
|
+
end
|
24
|
+
|
25
|
+
def caption
|
26
|
+
return SDL::WM.caption[0]
|
27
|
+
end
|
28
|
+
|
29
|
+
def caption=(val)
|
30
|
+
SDL::WM.set_caption(val, '')
|
16
31
|
end
|
17
32
|
|
18
33
|
def fps=(val)
|
@@ -32,20 +47,19 @@ module DXRubySDL
|
|
32
47
|
end
|
33
48
|
end
|
34
49
|
|
35
|
-
|
36
|
-
DEFAULTS[:background_color])
|
50
|
+
screen.fill_rect(0, 0, width, height, DEFAULTS[:background_color])
|
37
51
|
|
38
52
|
yield
|
39
53
|
|
40
|
-
|
54
|
+
screen.update_rect(0, 0, 0, 0)
|
41
55
|
|
42
|
-
|
56
|
+
Input.send(:store_last_state)
|
43
57
|
end
|
44
58
|
end
|
45
59
|
end
|
46
60
|
|
47
61
|
def draw(x, y, image, z = 0)
|
48
|
-
|
62
|
+
screen.put(image._surface, x, y)
|
49
63
|
end
|
50
64
|
|
51
65
|
def draw_font(x, y, string, font, hash = {})
|
@@ -54,12 +68,35 @@ module DXRubySDL
|
|
54
68
|
else
|
55
69
|
r, g, b = 255, 255, 255
|
56
70
|
end
|
57
|
-
font._ttf.draw_blended_utf8(
|
71
|
+
font._ttf.draw_blended_utf8(screen, string, x, y, r, g, b)
|
72
|
+
end
|
73
|
+
|
74
|
+
def open_filename(filter, title)
|
75
|
+
if /darwin/ =~ RUBY_PLATFORM
|
76
|
+
apple_script = <<-EOS
|
77
|
+
on run
|
78
|
+
tell application "Finder"
|
79
|
+
activate
|
80
|
+
set theImage to choose file
|
81
|
+
return theImage as Unicode text
|
82
|
+
end tell
|
83
|
+
end run
|
84
|
+
EOS
|
85
|
+
s = `osascript -e '#{apple_script}'`
|
86
|
+
return s.chomp.sub(/^ "/, '').gsub(/:/, '/')
|
87
|
+
else
|
88
|
+
raise NotImplementedError, 'Window.open_filename'
|
89
|
+
end
|
58
90
|
end
|
59
91
|
|
60
92
|
# rubocop:disable SymbolName
|
61
93
|
class << self
|
94
|
+
attr_writer :width
|
95
|
+
attr_writer :height
|
96
|
+
attr_writer :scale
|
97
|
+
|
62
98
|
alias_method :drawFont, :draw_font
|
99
|
+
alias_method :openFilename, :open_filename
|
63
100
|
end
|
64
101
|
# rubocop:enable SymbolName
|
65
102
|
|
@@ -71,5 +108,16 @@ module DXRubySDL
|
|
71
108
|
background_color: [0, 0, 0],
|
72
109
|
}
|
73
110
|
private_constant :DEFAULTS
|
111
|
+
|
112
|
+
class << self
|
113
|
+
|
114
|
+
private
|
115
|
+
|
116
|
+
def screen
|
117
|
+
return SDL::Screen.get
|
118
|
+
rescue SDL::Error
|
119
|
+
return SDL::Screen.open(width, height, 16, SDL::SWSURFACE)
|
120
|
+
end
|
121
|
+
end
|
74
122
|
end
|
75
123
|
end
|
data/lib/dxruby_sdl.rb
CHANGED
@@ -202,6 +202,15 @@ module DXRubySDL
|
|
202
202
|
].each.with_index do |name, i|
|
203
203
|
const_set(name.to_sym, i)
|
204
204
|
end
|
205
|
+
|
206
|
+
%w[
|
207
|
+
WAVE_SIN
|
208
|
+
WAVE_SAW
|
209
|
+
WAVE_TRI
|
210
|
+
WAVE_RECT
|
211
|
+
].each.with_index do |name, i|
|
212
|
+
const_set(name.to_sym, i)
|
213
|
+
end
|
205
214
|
end
|
206
215
|
|
207
216
|
require 'dxruby_sdl/window'
|
@@ -210,5 +219,6 @@ require 'dxruby_sdl/image'
|
|
210
219
|
require 'dxruby_sdl/font'
|
211
220
|
require 'dxruby_sdl/input'
|
212
221
|
require 'dxruby_sdl/sound'
|
222
|
+
require 'dxruby_sdl/sound_effect'
|
213
223
|
|
214
224
|
SDL.init(SDL::INIT_EVERYTHING)
|
@@ -122,6 +122,10 @@ describe DXRubySDL::Image, '画像を表すクラス' do
|
|
122
122
|
subject
|
123
123
|
end
|
124
124
|
|
125
|
+
it '戻り値はレシーバである' do
|
126
|
+
expect(subject).to eq(image)
|
127
|
+
end
|
128
|
+
|
125
129
|
context 'auto_lockを有効にした場合' do
|
126
130
|
before do
|
127
131
|
SDL::Surface.auto_lock_on
|
@@ -134,6 +138,10 @@ describe DXRubySDL::Image, '画像を表すクラス' do
|
|
134
138
|
it '呼び出すことができる' do
|
135
139
|
subject
|
136
140
|
end
|
141
|
+
|
142
|
+
it '戻り値はレシーバである' do
|
143
|
+
expect(subject).to eq(image)
|
144
|
+
end
|
137
145
|
end
|
138
146
|
end
|
139
147
|
|
@@ -3,10 +3,35 @@ require 'spec_helper'
|
|
3
3
|
|
4
4
|
describe DXRubySDL::Input,
|
5
5
|
'キーボード・ゲームパッド・マウスの入力を扱うモジュール' do
|
6
|
-
|
6
|
+
before do
|
7
7
|
DXRubySDL::Input.instance_variable_set('@joysticks', [])
|
8
8
|
end
|
9
9
|
|
10
|
+
shared_context '.set_repeat' do
|
11
|
+
before do
|
12
|
+
SDL::Key.stub(:enable_key_repeat)
|
13
|
+
subject
|
14
|
+
end
|
15
|
+
|
16
|
+
specify do
|
17
|
+
expect(SDL::Key).to have_received(:enable_key_repeat).with(15, 2)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '.set_repeat', 'キーリピートを設定する' do
|
22
|
+
subject { DXRubySDL::Input.set_repeat(15, 2) }
|
23
|
+
|
24
|
+
include_context '.set_repeat'
|
25
|
+
|
26
|
+
describe 'alias' do
|
27
|
+
describe '.setRepeat' do
|
28
|
+
it_behaves_like '.set_repeat' do
|
29
|
+
subject { DXRubySDL::Input.setRepeat(15, 2) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
10
35
|
shared_context 'push_key' do
|
11
36
|
let(:_keys) { [] }
|
12
37
|
|
@@ -91,15 +116,19 @@ describe DXRubySDL::Input,
|
|
91
116
|
|
92
117
|
[
|
93
118
|
# rubocop:disable SymbolName
|
94
|
-
[:P_BUTTON0, :Z],
|
95
|
-
[:P_BUTTON1, :X],
|
96
|
-
[:P_BUTTON2, :C],
|
119
|
+
['ボタン0', :P_BUTTON0, :Z],
|
120
|
+
['ボタン1', :P_BUTTON1, :X],
|
121
|
+
['ボタン2', :P_BUTTON2, :C],
|
122
|
+
['左ボタン', :P_LEFT, :LEFT],
|
123
|
+
['右ボタン', :P_RIGHT, :RIGHT],
|
124
|
+
['上ボタン', :P_UP, :UP],
|
125
|
+
['下ボタン', :P_DOWN, :DOWN],
|
97
126
|
# rubocop:enable SymbolName
|
98
|
-
].each
|
99
|
-
describe "
|
127
|
+
].each do |_button_name, _button, _key|
|
128
|
+
describe "ゲームパッドの#{_button_name}" do
|
100
129
|
let(:button_code) { DXRubySDL.const_get(_button) }
|
101
130
|
|
102
|
-
context "
|
131
|
+
context "ゲームパッドの#{_button_name}が押されている場合" do
|
103
132
|
let(:joystick) {
|
104
133
|
j = double('Joystick')
|
105
134
|
allow(j).to receive(:button) { |button_index|
|
@@ -131,12 +160,16 @@ describe DXRubySDL::Input,
|
|
131
160
|
|
132
161
|
[
|
133
162
|
# rubocop:disable SymbolName
|
134
|
-
[:P_BUTTON0, :Z],
|
135
|
-
[:P_BUTTON1, :X],
|
136
|
-
[:P_BUTTON2, :C],
|
163
|
+
['ボタン0', :P_BUTTON0, :Z],
|
164
|
+
['ボタン1', :P_BUTTON1, :X],
|
165
|
+
['ボタン2', :P_BUTTON2, :C],
|
166
|
+
['左ボタン', :P_LEFT, :LEFT],
|
167
|
+
['右ボタン', :P_RIGHT, :RIGHT],
|
168
|
+
['上ボタン', :P_UP, :UP],
|
169
|
+
['下ボタン', :P_DOWN, :DOWN],
|
137
170
|
# rubocop:enable SymbolName
|
138
|
-
].each
|
139
|
-
describe "
|
171
|
+
].each do |_button_name, _button, _key|
|
172
|
+
describe "ゲームパッドの#{_button_name}" do
|
140
173
|
let(:button_code) { DXRubySDL.const_get(_button) }
|
141
174
|
|
142
175
|
context "#{_key}キーが押されている場合" do
|
@@ -167,6 +200,112 @@ describe DXRubySDL::Input,
|
|
167
200
|
end
|
168
201
|
end
|
169
202
|
|
203
|
+
shared_context '.pad_push?' do
|
204
|
+
include_context 'push_key'
|
205
|
+
|
206
|
+
before do
|
207
|
+
DXRubySDL::Input.instance_variable_set('@current_key_state', Set.new)
|
208
|
+
DXRubySDL::Input.instance_variable_set('@last_key_state', Set.new)
|
209
|
+
end
|
210
|
+
|
211
|
+
context 'Joystickが接続されている場合' do
|
212
|
+
let(:joystick) {
|
213
|
+
j = double('Joystick')
|
214
|
+
allow(j).to receive(:button).with(anything).and_return(false)
|
215
|
+
j
|
216
|
+
}
|
217
|
+
|
218
|
+
before do
|
219
|
+
allow(SDL::Joystick).to receive(:num).and_return(1)
|
220
|
+
allow(SDL::Joystick).to receive(:open).with(0).and_return(joystick)
|
221
|
+
end
|
222
|
+
|
223
|
+
[
|
224
|
+
# rubocop:disable SymbolName
|
225
|
+
['ボタン0', :P_BUTTON0, :Z],
|
226
|
+
['ボタン1', :P_BUTTON1, :X],
|
227
|
+
['ボタン2', :P_BUTTON2, :C],
|
228
|
+
['左ボタン', :P_LEFT, :LEFT],
|
229
|
+
['右ボタン', :P_RIGHT, :RIGHT],
|
230
|
+
['上ボタン', :P_UP, :UP],
|
231
|
+
['下ボタン', :P_DOWN, :DOWN],
|
232
|
+
# rubocop:enable SymbolName
|
233
|
+
].each do |_button_name, _button, _key|
|
234
|
+
describe "ゲームパッドの#{_button_name}" do
|
235
|
+
let(:button_code) { DXRubySDL.const_get(_button) }
|
236
|
+
|
237
|
+
context "ゲームパッドの#{_button_name}が押されている場合" do
|
238
|
+
let(:joystick) {
|
239
|
+
j = double('Joystick')
|
240
|
+
allow(j).to receive(:button) { |button_index|
|
241
|
+
button_index == DXRubySDL.const_get(_button)
|
242
|
+
}
|
243
|
+
j
|
244
|
+
}
|
245
|
+
|
246
|
+
it { should be_true }
|
247
|
+
end
|
248
|
+
|
249
|
+
context "#{_key}キーが押されている場合" do
|
250
|
+
let(:_keys) { SDL::Key.const_get(_key) }
|
251
|
+
|
252
|
+
it { should be_true }
|
253
|
+
end
|
254
|
+
|
255
|
+
context 'ボタンやキーが押されていない場合' do
|
256
|
+
it { should be_false }
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
context 'Joystickが接続されていない場合' do
|
263
|
+
before do
|
264
|
+
allow(SDL::Joystick).to receive(:num).and_return(0)
|
265
|
+
end
|
266
|
+
|
267
|
+
[
|
268
|
+
# rubocop:disable SymbolName
|
269
|
+
['ボタン0', :P_BUTTON0, :Z],
|
270
|
+
['ボタン1', :P_BUTTON1, :X],
|
271
|
+
['ボタン2', :P_BUTTON2, :C],
|
272
|
+
['左ボタン', :P_LEFT, :LEFT],
|
273
|
+
['右ボタン', :P_RIGHT, :RIGHT],
|
274
|
+
['上ボタン', :P_UP, :UP],
|
275
|
+
['下ボタン', :P_DOWN, :DOWN],
|
276
|
+
# rubocop:enable SymbolName
|
277
|
+
].each do |_button_name, _button, _key|
|
278
|
+
describe "ゲームパッドの#{_button_name}" do
|
279
|
+
let(:button_code) { DXRubySDL.const_get(_button) }
|
280
|
+
|
281
|
+
context "#{_key}キーが押されている場合" do
|
282
|
+
let(:_keys) { SDL::Key.const_get(_key) }
|
283
|
+
|
284
|
+
it { should be_true }
|
285
|
+
end
|
286
|
+
|
287
|
+
context 'ボタンやキーが押されていない場合' do
|
288
|
+
it { should be_false }
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
describe '.pad_push?', 'パッドのボタン状態を返す' do
|
296
|
+
subject { described_class.pad_push?(button_code) }
|
297
|
+
|
298
|
+
include_context '.pad_push?'
|
299
|
+
|
300
|
+
describe 'alias' do
|
301
|
+
describe '.padPush?' do
|
302
|
+
it_behaves_like '.pad_push?' do
|
303
|
+
subject { described_class.padPush?(button_code) }
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
170
309
|
shared_context '.mouse_pos_x' do
|
171
310
|
it { should be_kind_of(Integer) }
|
172
311
|
end
|
@@ -203,27 +342,94 @@ describe DXRubySDL::Input,
|
|
203
342
|
end
|
204
343
|
end
|
205
344
|
|
345
|
+
shared_context '.key_down?' do
|
346
|
+
include_context 'push_key'
|
347
|
+
|
348
|
+
context 'ESCAPEキーが押されている場合' do
|
349
|
+
let(:_keys) { SDL::Key::ESCAPE }
|
350
|
+
let(:key_code) { DXRubySDL::K_ESCAPE }
|
351
|
+
|
352
|
+
it { should be_true }
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
describe '.key_down?' do
|
357
|
+
subject { described_class.key_down?(key_code) }
|
358
|
+
|
359
|
+
include_context '.key_down?'
|
360
|
+
|
361
|
+
describe 'alias' do
|
362
|
+
describe '.keyDown?' do
|
363
|
+
it_behaves_like '.key_down?' do
|
364
|
+
subject { described_class.keyDown?(key_code) }
|
365
|
+
end
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
206
370
|
shared_context '.key_push?' do
|
207
371
|
include_context 'push_key'
|
208
372
|
|
373
|
+
subject { described_class.send(method, key_code) }
|
374
|
+
|
375
|
+
before do
|
376
|
+
DXRubySDL::Input.instance_variable_set('@current_key_state', Set.new)
|
377
|
+
DXRubySDL::Input.instance_variable_set('@last_key_state', Set.new)
|
378
|
+
end
|
379
|
+
|
209
380
|
context 'ESCAPEキーが押されている場合' do
|
210
381
|
let(:_keys) { SDL::Key::ESCAPE }
|
211
382
|
let(:key_code) { DXRubySDL::K_ESCAPE }
|
212
383
|
|
213
384
|
it { should be_true }
|
385
|
+
|
386
|
+
context 'キーが押しっぱなしの場合' do
|
387
|
+
before do
|
388
|
+
last_key_state =
|
389
|
+
DXRubySDL::Input.instance_variable_get('@last_key_state')
|
390
|
+
last_key_state.add(*_keys)
|
391
|
+
end
|
392
|
+
|
393
|
+
it { should be_false }
|
394
|
+
end
|
395
|
+
|
396
|
+
context 'キーが押しっぱなしだが、' \
|
397
|
+
'Input.key_push?をメインループで毎回処理しない場合' do
|
398
|
+
it '最初の1回以外は全てfalseを返す' do
|
399
|
+
begin
|
400
|
+
first = true
|
401
|
+
i = 0
|
402
|
+
DXRubySDL::Window.loop do
|
403
|
+
if first
|
404
|
+
expect(described_class.send(method, key_code)).to be_true
|
405
|
+
first = false
|
406
|
+
else
|
407
|
+
if i.even?
|
408
|
+
expect(described_class.send(method, key_code)).to be_false
|
409
|
+
end
|
410
|
+
end
|
411
|
+
i += 1
|
412
|
+
if i > 10
|
413
|
+
SDL::Event.push(SDL::Event::Quit.new)
|
414
|
+
end
|
415
|
+
end
|
416
|
+
rescue SystemExit
|
417
|
+
end
|
418
|
+
end
|
419
|
+
end
|
214
420
|
end
|
215
421
|
end
|
216
422
|
|
217
423
|
describe '.key_push?' do
|
218
|
-
|
424
|
+
let(:method) { :key_push? }
|
219
425
|
|
220
426
|
include_context '.key_push?'
|
221
427
|
|
222
428
|
describe 'alias' do
|
223
429
|
describe '.keyPush?' do
|
224
|
-
|
225
|
-
|
226
|
-
|
430
|
+
let(:method) { 'keyPush?' }
|
431
|
+
|
432
|
+
it_behaves_like '.key_push?'
|
227
433
|
end
|
228
434
|
end
|
229
435
|
end
|
@@ -322,8 +528,8 @@ describe DXRubySDL::Input,
|
|
322
528
|
shared_context '.mouse_push?' do
|
323
529
|
context '直前にマウスのボタンを押していない場合' do
|
324
530
|
before do
|
325
|
-
DXRubySDL::
|
326
|
-
|
531
|
+
DXRubySDL::Input.instance_variable_set('@last_mouse_state',
|
532
|
+
[0, 0, false, false, false])
|
327
533
|
end
|
328
534
|
|
329
535
|
context 'マウスの左ボタンを押している場合' do
|
@@ -404,8 +610,8 @@ describe DXRubySDL::Input,
|
|
404
610
|
|
405
611
|
context '直前にマウスのボタンを全て押していた場合' do
|
406
612
|
before do
|
407
|
-
DXRubySDL::
|
408
|
-
|
613
|
+
DXRubySDL::Input.instance_variable_set('@last_mouse_state',
|
614
|
+
[0, 0, true, true, true])
|
409
615
|
end
|
410
616
|
|
411
617
|
context 'マウスの左ボタンを押している場合' do
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe DXRubySDL::SoundEffect, '効果音を生成するクラス' do
|
5
|
+
let(:sound_effect) {
|
6
|
+
v = 80
|
7
|
+
described_class.new(50, DXRubySDL::WAVE_RECT, 1000) {
|
8
|
+
v = v - 4 if v > 0
|
9
|
+
[220, v]
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
describe '.new' do
|
14
|
+
it '呼び出すことができる' do
|
15
|
+
expect { sound_effect }.not_to raise_error
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#add' do
|
20
|
+
it '呼び出すことができる' do
|
21
|
+
expect {
|
22
|
+
v = 80
|
23
|
+
sound_effect.add(DXRubySDL::WAVE_RECT, 1000) {
|
24
|
+
v = v - 4 if v > 0
|
25
|
+
[440, v]
|
26
|
+
}
|
27
|
+
}.not_to raise_error
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#play' do
|
32
|
+
it '呼び出すことができる' do
|
33
|
+
expect { sound_effect.play }.not_to raise_error
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#stop' do
|
38
|
+
it '呼び出すことができる' do
|
39
|
+
expect { sound_effect.stop }.not_to raise_error
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -26,6 +26,40 @@ describe DXRubySDL::Window do
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
describe '.caption', 'ウィンドウのタイトルを取得する' do
|
30
|
+
before do
|
31
|
+
allow(SDL::WM)
|
32
|
+
.to receive(:caption).and_return(['window title', 'icon name'])
|
33
|
+
end
|
34
|
+
|
35
|
+
subject { DXRubySDL::Window.caption }
|
36
|
+
|
37
|
+
it { should eq('window title') }
|
38
|
+
|
39
|
+
describe SDL::WM do
|
40
|
+
before do
|
41
|
+
DXRubySDL::Window.caption
|
42
|
+
end
|
43
|
+
|
44
|
+
subject { SDL::WM }
|
45
|
+
|
46
|
+
it { should have_received(:caption).once }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '.caption=', 'ウィンドウのタイトルを設定する' do
|
51
|
+
before do
|
52
|
+
allow(SDL::WM).to receive(:set_caption)
|
53
|
+
DXRubySDL::Window.caption = 'window title'
|
54
|
+
end
|
55
|
+
|
56
|
+
describe SDL::WM do
|
57
|
+
subject { SDL::WM }
|
58
|
+
|
59
|
+
it { should have_received(:set_caption).with('window title', '').once }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
29
63
|
describe '.fps=', 'FPSを設定する' do
|
30
64
|
context '15に設定した場合' do
|
31
65
|
let(:fps) { 15 }
|
data/spec/dxruby_sdl_spec.rb
CHANGED
@@ -213,4 +213,13 @@ describe DXRubySDL do
|
|
213
213
|
].each.with_index do |name, i|
|
214
214
|
include_examples 'constant', name, i
|
215
215
|
end
|
216
|
+
|
217
|
+
%w[
|
218
|
+
WAVE_SIN
|
219
|
+
WAVE_SAW
|
220
|
+
WAVE_TRI
|
221
|
+
WAVE_RECT
|
222
|
+
].each.with_index do |name, i|
|
223
|
+
include_examples 'constant', name, i
|
224
|
+
end
|
216
225
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dxruby_sdl
|
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
|
- Kouji Takao
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-09-
|
11
|
+
date: 2013-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,6 +94,34 @@ dependencies:
|
|
94
94
|
- - ! '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: guard-rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: guard-rubocop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
126
|
name: rubysdl
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +164,7 @@ files:
|
|
136
164
|
- .ruby-version
|
137
165
|
- .travis.yml
|
138
166
|
- Gemfile
|
167
|
+
- Guardfile
|
139
168
|
- LEGAL
|
140
169
|
- LICENSE
|
141
170
|
- README.md
|
@@ -148,6 +177,7 @@ files:
|
|
148
177
|
- lib/dxruby_sdl/image.rb
|
149
178
|
- lib/dxruby_sdl/input.rb
|
150
179
|
- lib/dxruby_sdl/sound.rb
|
180
|
+
- lib/dxruby_sdl/sound_effect.rb
|
151
181
|
- lib/dxruby_sdl/version.rb
|
152
182
|
- lib/dxruby_sdl/window.rb
|
153
183
|
- lib/dxruby_sdl/window/fpstimer.rb
|
@@ -171,6 +201,7 @@ files:
|
|
171
201
|
- spec/dxruby_sdl/font_spec.rb
|
172
202
|
- spec/dxruby_sdl/image_spec.rb
|
173
203
|
- spec/dxruby_sdl/input_spec.rb
|
204
|
+
- spec/dxruby_sdl/sound_effect_spec.rb
|
174
205
|
- spec/dxruby_sdl/sound_spec.rb
|
175
206
|
- spec/dxruby_sdl/window__draw_spec.rb
|
176
207
|
- spec/dxruby_sdl/window_spec.rb
|
@@ -211,6 +242,7 @@ test_files:
|
|
211
242
|
- spec/dxruby_sdl/font_spec.rb
|
212
243
|
- spec/dxruby_sdl/image_spec.rb
|
213
244
|
- spec/dxruby_sdl/input_spec.rb
|
245
|
+
- spec/dxruby_sdl/sound_effect_spec.rb
|
214
246
|
- spec/dxruby_sdl/sound_spec.rb
|
215
247
|
- spec/dxruby_sdl/window__draw_spec.rb
|
216
248
|
- spec/dxruby_sdl/window_spec.rb
|