dxruby_sdl 0.0.1 → 0.0.2
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.
- checksums.yaml +8 -8
- data/.rubocop.yml +4 -0
- data/.travis.yml +1 -1
- data/LEGAL +21 -0
- data/lib/dxruby_sdl/image.rb +62 -10
- data/lib/dxruby_sdl/input.rb +127 -0
- data/lib/dxruby_sdl/sound.rb +54 -0
- data/lib/dxruby_sdl/version.rb +1 -1
- data/lib/dxruby_sdl/window.rb +16 -10
- data/lib/dxruby_sdl.rb +204 -3
- data/samples/bgm.mid +0 -0
- data/samples/data.png +0 -0
- data/samples/sound.wav +0 -0
- data/samples/tutorial-2-01.rb +7 -0
- data/samples/tutorial-2-02.rb +9 -0
- data/samples/tutorial-2-03.rb +12 -0
- data/samples/tutorial-2-04.rb +10 -0
- data/samples/tutorial-2-05.rb +14 -0
- data/samples/tutorial-2-06.rb +24 -0
- data/samples/tutorial-2-07.rb +12 -0
- data/samples/tutorial-2-08.rb +12 -0
- data/samples/tutorial-2-09.rb +9 -0
- data/samples/tutorial-2-10.rb +14 -0
- data/spec/dxruby_sdl/image_spec.rb +111 -8
- data/spec/dxruby_sdl/input_spec.rb +230 -0
- data/spec/dxruby_sdl/sound_spec.rb +79 -0
- data/spec/dxruby_sdl/window__draw_spec.rb +85 -0
- data/spec/dxruby_sdl/window_spec.rb +25 -66
- data/spec/dxruby_sdl_spec.rb +201 -16
- data/spec/dxruby_spec.rb +22 -0
- data/spec/fixtures/bgm.mid +0 -0
- data/spec/fixtures/sound.wav +0 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/support/fixture_helper.rb +8 -0
- metadata +31 -2
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# http://dxruby.sourceforge.jp/DXRubyReference/200953123211781.htm
|
3
|
+
require 'dxruby'
|
4
|
+
|
5
|
+
image = Image.load('data.png') # data.pngを読み込む
|
6
|
+
x = 0
|
7
|
+
y = 0
|
8
|
+
dx = 0
|
9
|
+
dy = 0
|
10
|
+
|
11
|
+
Window.loop do
|
12
|
+
dx = Input.x # x座標の移動量
|
13
|
+
dy = Input.y # y座標の移動量
|
14
|
+
|
15
|
+
if Input.padDown?(P_BUTTON0) # Zキーかパッドのボタン0を押しているか判定
|
16
|
+
dx = dx * 2
|
17
|
+
dy = dy * 2
|
18
|
+
end
|
19
|
+
|
20
|
+
x = x + dx
|
21
|
+
y = y + dy
|
22
|
+
|
23
|
+
Window.draw(x, y, image) # data.pngを描画する
|
24
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# http://dxruby.sourceforge.jp/DXRubyReference/2009531233720546.htm
|
3
|
+
require 'dxruby'
|
4
|
+
|
5
|
+
image = Image.load('data.png') # data.pngを読み込む
|
6
|
+
|
7
|
+
Window.loop do
|
8
|
+
x = Input.mousePosX # マウスカーソルのx座標
|
9
|
+
y = Input.mousePosY # マウスカーソルのy座標
|
10
|
+
|
11
|
+
Window.draw(x, y, image) # data.pngを描画する
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# http://dxruby.sourceforge.jp/DXRubyReference/2009610612281.htm
|
3
|
+
require 'dxruby'
|
4
|
+
|
5
|
+
image = Image.load('data.png') # data.pngを読み込む
|
6
|
+
|
7
|
+
Window.loop do
|
8
|
+
Window.draw(100, 100, image) # data.pngを描画する
|
9
|
+
if Input.keyPush?(K_ESCAPE) # Escキーで終了
|
10
|
+
break
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# http://dxruby.sourceforge.jp/DXRubyReference/2009610590500.htm
|
3
|
+
require 'dxruby'
|
4
|
+
|
5
|
+
sound = Sound.new('sound.wav') # sound.wav読み込み
|
6
|
+
bgm = Sound.new('bgm.mid') # bgm.mid読み込み
|
7
|
+
|
8
|
+
bgm.play
|
9
|
+
|
10
|
+
Window.loop do
|
11
|
+
if Input.keyPush?(K_Z) # Zキーで再生
|
12
|
+
sound.play
|
13
|
+
end
|
14
|
+
end
|
@@ -34,21 +34,124 @@ describe DXRubySDL::Image, '画像を表すクラス' do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
shared_context '.load_tiles' do
|
38
|
+
context '画像の幅と高さが割り切れる(518x232、xcountが2、ycountが4)場合' do
|
39
|
+
let(:xcount) { 2 }
|
40
|
+
let(:ycount) { 4 }
|
41
|
+
|
42
|
+
its(:length) { should eq(xcount * ycount) }
|
43
|
+
|
44
|
+
it '各オブジェクトの幅はxcount(2)等分したものである' do
|
45
|
+
subject.each do |image|
|
46
|
+
expect(image.width).to eq(518 / xcount)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it '各オブジェクトの高さはycount(4)等分したものである' do
|
51
|
+
subject.each do |image|
|
52
|
+
expect(image.height).to eq(232 / ycount)
|
53
|
+
end
|
54
|
+
end
|
40
55
|
end
|
41
56
|
end
|
42
57
|
|
43
|
-
describe '
|
44
|
-
|
45
|
-
|
58
|
+
describe '.load_tiles',
|
59
|
+
'画像を読み込み、横・縦がそれぞれxcount個、' \
|
60
|
+
'ycount個であると仮定して自動で分割し、' \
|
61
|
+
'左上から右に向かう順序でImageオブジェクトの配列を生成して返す' do
|
62
|
+
subject {
|
63
|
+
DXRubySDL::Image.load_tiles(fixture_path('logo.png'), xcount, ycount)
|
64
|
+
}
|
65
|
+
|
66
|
+
include_context '.load_tiles'
|
67
|
+
|
68
|
+
describe 'alias' do
|
69
|
+
describe '.loadTiles' do
|
70
|
+
it_behaves_like '.load_tiles' do
|
71
|
+
subject {
|
72
|
+
DXRubySDL::Image.loadTiles(fixture_path('logo.png'),
|
73
|
+
xcount, ycount)
|
74
|
+
}
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '.load_to_array' do
|
79
|
+
it_behaves_like '.load_tiles' do
|
80
|
+
subject {
|
81
|
+
DXRubySDL::Image.load_to_array(fixture_path('logo.png'),
|
82
|
+
xcount, ycount)
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '.loadToArray' do
|
88
|
+
it_behaves_like '.load_tiles' do
|
89
|
+
subject {
|
90
|
+
DXRubySDL::Image.loadToArray(fixture_path('logo.png'),
|
91
|
+
xcount, ycount)
|
92
|
+
}
|
93
|
+
end
|
94
|
+
end
|
46
95
|
end
|
47
96
|
end
|
48
97
|
|
49
|
-
describe '#
|
98
|
+
describe '#slice' do
|
99
|
+
let(:image) { DXRubySDL::Image.load(fixture_path('logo.png')) }
|
100
|
+
|
101
|
+
subject { image.slice(100, 100, 20, 40) }
|
102
|
+
|
103
|
+
before do
|
104
|
+
SDL::Surface.auto_lock_on
|
105
|
+
end
|
106
|
+
|
107
|
+
after do
|
108
|
+
SDL::Surface.auto_lock_off
|
109
|
+
end
|
110
|
+
|
111
|
+
its(:width) { should eq(20) }
|
112
|
+
its(:height) { should eq(40) }
|
113
|
+
it { should be_instance_of(DXRubySDL::Image) }
|
114
|
+
it '各ピクセルデータが正しい' do
|
115
|
+
expect(subject._surface.pixels)
|
116
|
+
.to eq(image._surface.copy_rect(100, 100, 20, 40).pixels)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
shared_context 'draw methods' do
|
50
121
|
it '呼び出すことができる' do
|
51
|
-
|
122
|
+
subject
|
123
|
+
end
|
124
|
+
|
125
|
+
context 'auto_lockを有効にした場合' do
|
126
|
+
before do
|
127
|
+
SDL::Surface.auto_lock_on
|
128
|
+
end
|
129
|
+
|
130
|
+
after do
|
131
|
+
SDL::Surface.auto_lock_off
|
132
|
+
end
|
133
|
+
|
134
|
+
it '呼び出すことができる' do
|
135
|
+
subject
|
136
|
+
end
|
52
137
|
end
|
53
138
|
end
|
139
|
+
|
140
|
+
describe '#line' do
|
141
|
+
subject { image.line(0, 0, 100, 100, [255, 255, 255]) }
|
142
|
+
|
143
|
+
include_context 'draw methods'
|
144
|
+
end
|
145
|
+
|
146
|
+
describe '#circle' do
|
147
|
+
subject { image.circle(50, 50, 25, [255, 255, 255]) }
|
148
|
+
|
149
|
+
include_context 'draw methods'
|
150
|
+
end
|
151
|
+
|
152
|
+
describe '#box' do
|
153
|
+
subject { image.box(0, 0, 100, 100, [255, 255, 255]) }
|
154
|
+
|
155
|
+
include_context 'draw methods'
|
156
|
+
end
|
54
157
|
end
|
@@ -0,0 +1,230 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe DXRubySDL::Input,
|
5
|
+
'キーボード・ゲームパッド・マウスの入力を扱うモジュール' do
|
6
|
+
after do
|
7
|
+
DXRubySDL::Input.instance_variable_set('@joysticks', [])
|
8
|
+
end
|
9
|
+
|
10
|
+
shared_context 'push_key' do
|
11
|
+
let(:_keys) { [] }
|
12
|
+
|
13
|
+
before do
|
14
|
+
allow(SDL::Key).to receive(:scan)
|
15
|
+
allow(SDL::Key).to receive(:press?) { |key|
|
16
|
+
[_keys].flatten.include?(key) ? true : false
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '.x' do
|
22
|
+
include_context 'push_key'
|
23
|
+
|
24
|
+
subject { described_class.x }
|
25
|
+
|
26
|
+
context '左カーソルが押されている場合' do
|
27
|
+
let(:_keys) { SDL::Key::LEFT }
|
28
|
+
|
29
|
+
it { should eq(-1) }
|
30
|
+
end
|
31
|
+
|
32
|
+
context '右カーソルが押されている場合' do
|
33
|
+
let(:_keys) { SDL::Key::RIGHT }
|
34
|
+
|
35
|
+
it { should eq(1) }
|
36
|
+
end
|
37
|
+
|
38
|
+
context '左・右カーソルが両方とも押されている場合' do
|
39
|
+
let(:_keys) { [SDL::Key::LEFT, SDL::Key::RIGHT] }
|
40
|
+
|
41
|
+
it { should eq(0) }
|
42
|
+
end
|
43
|
+
|
44
|
+
context '左・右カーソルのどちらも押されていない場合' do
|
45
|
+
it { should eq(0) }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '.y' do
|
50
|
+
include_context 'push_key'
|
51
|
+
|
52
|
+
subject { described_class.y }
|
53
|
+
|
54
|
+
context '上カーソルが押されている場合' do
|
55
|
+
let(:_keys) { SDL::Key::UP }
|
56
|
+
|
57
|
+
it { should eq(-1) }
|
58
|
+
end
|
59
|
+
|
60
|
+
context '下カーソルが押されている場合' do
|
61
|
+
let(:_keys) { SDL::Key::DOWN }
|
62
|
+
|
63
|
+
it { should eq(1) }
|
64
|
+
end
|
65
|
+
|
66
|
+
context '上・下カーソルが両方とも押されている場合' do
|
67
|
+
let(:_keys) { [SDL::Key::UP, SDL::Key::DOWN] }
|
68
|
+
|
69
|
+
it { should eq(0) }
|
70
|
+
end
|
71
|
+
|
72
|
+
context '上・下カーソルのどちらも押されていない場合' do
|
73
|
+
it { should eq(0) }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
shared_context '.pad_down?' do
|
78
|
+
include_context 'push_key'
|
79
|
+
|
80
|
+
context 'Joystickが接続されている場合' do
|
81
|
+
let(:joystick) {
|
82
|
+
j = double('Joystick')
|
83
|
+
allow(j).to receive(:button).with(anything).and_return(false)
|
84
|
+
j
|
85
|
+
}
|
86
|
+
|
87
|
+
before do
|
88
|
+
allow(SDL::Joystick).to receive(:num).and_return(1)
|
89
|
+
allow(SDL::Joystick).to receive(:open).with(0).and_return(joystick)
|
90
|
+
end
|
91
|
+
|
92
|
+
[
|
93
|
+
# rubocop:disable SymbolName
|
94
|
+
[:P_BUTTON0, :Z],
|
95
|
+
[:P_BUTTON1, :X],
|
96
|
+
[:P_BUTTON2, :C],
|
97
|
+
# rubocop:enable SymbolName
|
98
|
+
].each.with_index do |(_button, _key), i|
|
99
|
+
describe "#{i}番目(#{_button})のボタン" do
|
100
|
+
let(:button_code) { DXRubySDL.const_get(_button) }
|
101
|
+
|
102
|
+
context "#{i}番目のボタンが押されている場合" do
|
103
|
+
let(:joystick) {
|
104
|
+
j = double('Joystick')
|
105
|
+
allow(j).to receive(:button) { |button_index|
|
106
|
+
button_index == DXRubySDL.const_get(_button)
|
107
|
+
}
|
108
|
+
j
|
109
|
+
}
|
110
|
+
|
111
|
+
it { should be_true }
|
112
|
+
end
|
113
|
+
|
114
|
+
context "#{_key}キーが押されている場合" do
|
115
|
+
let(:_keys) { SDL::Key.const_get(_key) }
|
116
|
+
|
117
|
+
it { should be_true }
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'ボタンやキーが押されていない場合' do
|
121
|
+
it { should be_false }
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context 'Joystickが接続されていない場合' do
|
128
|
+
before do
|
129
|
+
allow(SDL::Joystick).to receive(:num).and_return(0)
|
130
|
+
end
|
131
|
+
|
132
|
+
[
|
133
|
+
# rubocop:disable SymbolName
|
134
|
+
[:P_BUTTON0, :Z],
|
135
|
+
[:P_BUTTON1, :X],
|
136
|
+
[:P_BUTTON2, :C],
|
137
|
+
# rubocop:enable SymbolName
|
138
|
+
].each.with_index do |(_button, _key), i|
|
139
|
+
describe "#{i}番目(#{_button})のボタン" do
|
140
|
+
let(:button_code) { DXRubySDL.const_get(_button) }
|
141
|
+
|
142
|
+
context "#{_key}キーが押されている場合" do
|
143
|
+
let(:_keys) { SDL::Key.const_get(_key) }
|
144
|
+
|
145
|
+
it { should be_true }
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'ボタンやキーが押されていない場合' do
|
149
|
+
it { should be_false }
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe '.pad_down?', 'パッドのボタン状態を返す' do
|
157
|
+
subject { described_class.pad_down?(button_code) }
|
158
|
+
|
159
|
+
include_context '.pad_down?'
|
160
|
+
|
161
|
+
describe 'alias' do
|
162
|
+
describe '.padDown?' do
|
163
|
+
it_behaves_like '.pad_down?' do
|
164
|
+
subject { described_class.padDown?(button_code) }
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
shared_context '.mouse_pos_x' do
|
171
|
+
it { should be_kind_of(Integer) }
|
172
|
+
end
|
173
|
+
|
174
|
+
describe '.mouse_pos_x' do
|
175
|
+
subject { described_class.mouse_pos_x }
|
176
|
+
|
177
|
+
include_context '.mouse_pos_x'
|
178
|
+
|
179
|
+
describe 'alias' do
|
180
|
+
describe '.mousePosX' do
|
181
|
+
it_behaves_like '.mouse_pos_x' do
|
182
|
+
subject { described_class.mousePosX }
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
shared_context '.mouse_pos_y' do
|
189
|
+
it { should be_kind_of(Integer) }
|
190
|
+
end
|
191
|
+
|
192
|
+
describe '.mouse_pos_y' do
|
193
|
+
subject { described_class.mouse_pos_y }
|
194
|
+
|
195
|
+
include_context '.mouse_pos_y'
|
196
|
+
|
197
|
+
describe 'alias' do
|
198
|
+
describe '.mousePosY' do
|
199
|
+
it_behaves_like '.mouse_pos_y' do
|
200
|
+
subject { described_class.mousePosY }
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
shared_context '.key_push?' do
|
207
|
+
include_context 'push_key'
|
208
|
+
|
209
|
+
context 'ESCAPEキーが押されている場合' do
|
210
|
+
let(:_keys) { SDL::Key::ESCAPE }
|
211
|
+
let(:key_code) { DXRubySDL::K_ESCAPE }
|
212
|
+
|
213
|
+
it { should be_true }
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
describe '.key_push?' do
|
218
|
+
subject { described_class.key_push?(key_code) }
|
219
|
+
|
220
|
+
include_context '.key_push?'
|
221
|
+
|
222
|
+
describe 'alias' do
|
223
|
+
describe '.keyPush?' do
|
224
|
+
it_behaves_like '.key_push?' do
|
225
|
+
subject { described_class.keyPush?(key_code) }
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe DXRubySDL::Sound, '音を表すクラス' do
|
5
|
+
describe '.new' do
|
6
|
+
shared_context '.new' do
|
7
|
+
subject { DXRubySDL::Sound.new(fixture_path(filename)) }
|
8
|
+
|
9
|
+
it '呼び出すことができる' do
|
10
|
+
subject
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'WAVE形式のファイルの場合' do
|
15
|
+
let(:filename) { 'sound.wav' }
|
16
|
+
|
17
|
+
include_context '.new'
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'MIDI形式のファイルの場合' do
|
21
|
+
let(:filename) { 'bgm.mid' }
|
22
|
+
|
23
|
+
include_context '.new'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#play' do
|
28
|
+
context 'WAVE形式のファイルの場合' do
|
29
|
+
let(:path) { fixture_path('sound.wav') }
|
30
|
+
let(:sound) { DXRubySDL::Sound.new(path) }
|
31
|
+
|
32
|
+
subject { sound.play }
|
33
|
+
|
34
|
+
it 'SDL::Mixer.play_channelを呼び出す' do
|
35
|
+
wave =
|
36
|
+
sound.instance_variable_get('@sound').instance_variable_get('@wave')
|
37
|
+
expect(SDL::Mixer).to receive(:play_channel).with(-1, wave, 0)
|
38
|
+
subject
|
39
|
+
end
|
40
|
+
|
41
|
+
context '3回連続で呼び出した場合' do
|
42
|
+
before do
|
43
|
+
wave = sound.instance_variable_get('@sound')
|
44
|
+
.instance_variable_get('@wave')
|
45
|
+
count = 0
|
46
|
+
expect(SDL::Mixer)
|
47
|
+
.to receive(:play_channel).with(-1, wave, 0).exactly(4).times {
|
48
|
+
count += 1
|
49
|
+
if count == 3
|
50
|
+
count = 0
|
51
|
+
raise SDL::Error.new('couldn\'t play wave:' \
|
52
|
+
' No free channels available')
|
53
|
+
end
|
54
|
+
(count - 1) % 2
|
55
|
+
}
|
56
|
+
expect(SDL::Mixer).to receive(:halt).with(0)
|
57
|
+
end
|
58
|
+
|
59
|
+
it '最初のものを停止する' do
|
60
|
+
3.times { sound.play }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'MIDI形式のファイルの場合' do
|
66
|
+
let(:path) { fixture_path('bgm.mid') }
|
67
|
+
let(:sound) { DXRubySDL::Sound.new(path) }
|
68
|
+
|
69
|
+
subject { sound.play }
|
70
|
+
|
71
|
+
it 'SDL::Mixer.play_musicを呼び出す' do
|
72
|
+
music =
|
73
|
+
sound.instance_variable_get('@sound').instance_variable_get('@music')
|
74
|
+
expect(SDL::Mixer).to receive(:play_music).with(music, -1)
|
75
|
+
subject
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe DXRubySDL::Window do
|
5
|
+
describe '.draw', 'Imageオブジェクトを描画する' do
|
6
|
+
subject do
|
7
|
+
expect {
|
8
|
+
DXRubySDL::Window.loop do
|
9
|
+
DXRubySDL::Window.draw(0, 0, image)
|
10
|
+
SDL::Event.push(SDL::Event::Quit.new)
|
11
|
+
end
|
12
|
+
}.to raise_error(SystemExit)
|
13
|
+
end
|
14
|
+
|
15
|
+
context '(0, 0)-(100,100)の白い線を描いたImageオブジェクトを指定した場合' do
|
16
|
+
let!(:image) {
|
17
|
+
i = DXRubySDL::Image.new(640, 480)
|
18
|
+
i.line(0, 0, 100, 100, [255, 255, 255])
|
19
|
+
i
|
20
|
+
}
|
21
|
+
|
22
|
+
it '白い線を描画する' do
|
23
|
+
subject
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context '(0, 0)-(100,100)の矩形を描いたImageオブジェクトを指定した場合' do
|
28
|
+
let!(:image) {
|
29
|
+
i = DXRubySDL::Image.new(640, 480)
|
30
|
+
i.box(0, 0, 100, 100, [255, 255, 255])
|
31
|
+
i
|
32
|
+
}
|
33
|
+
|
34
|
+
it '矩形を描画する' do
|
35
|
+
subject
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context '(50, 50)、半径25の円を描いたImageオブジェクトを指定した場合' do
|
40
|
+
let!(:image) {
|
41
|
+
i = DXRubySDL::Image.new(640, 480)
|
42
|
+
i.circle(50, 50, 25, [255, 255, 255])
|
43
|
+
i
|
44
|
+
}
|
45
|
+
|
46
|
+
it '円を描画する' do
|
47
|
+
subject
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context '画像を読み込んだImageオブジェクトを指定した場合' do
|
52
|
+
let!(:image) {
|
53
|
+
DXRubySDL::Image.load(fixture_path('logo.png'))
|
54
|
+
}
|
55
|
+
|
56
|
+
it '画像を描画する' do
|
57
|
+
subject
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context '画像を分割して読み込んだImageオブジェクトを指定した場合' do
|
62
|
+
let!(:images) {
|
63
|
+
DXRubySDL::Image.load_tiles(fixture_path('logo.png'), 2, 4)
|
64
|
+
}
|
65
|
+
|
66
|
+
specify '画像を描画する' do
|
67
|
+
expect {
|
68
|
+
DXRubySDL::Window.loop do
|
69
|
+
margin = 64
|
70
|
+
i = 0
|
71
|
+
4.times do |y|
|
72
|
+
2.times do |x|
|
73
|
+
DXRubySDL::Window.draw(x * (images[i].width + margin),
|
74
|
+
y * (images[i].height + margin),
|
75
|
+
images[i])
|
76
|
+
i += 1
|
77
|
+
end
|
78
|
+
end
|
79
|
+
SDL::Event.push(SDL::Event::Quit.new)
|
80
|
+
end
|
81
|
+
}.to raise_error(SystemExit)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|