cyross-ruby-miyako 2.0.5.1.0 → 2.1.0

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.
Files changed (91) hide show
  1. data/README +1092 -929
  2. data/Rakefile +7 -7
  3. data/defines.h +144 -144
  4. data/extern.h +29 -29
  5. data/install_miyako.rb +87 -87
  6. data/lib/Miyako/API/audio.rb +572 -198
  7. data/lib/Miyako/API/basic_data.rb +825 -573
  8. data/lib/Miyako/API/bitmap.rb +534 -507
  9. data/lib/Miyako/API/choices.rb +481 -475
  10. data/lib/Miyako/API/collision.rb +486 -460
  11. data/lib/Miyako/API/diagram.rb +586 -561
  12. data/lib/Miyako/API/drawing.rb +151 -151
  13. data/lib/Miyako/API/exceptions.rb +105 -0
  14. data/lib/Miyako/API/fixedmap.rb +462 -428
  15. data/lib/Miyako/API/font.rb +430 -403
  16. data/lib/Miyako/API/input.rb +456 -447
  17. data/lib/Miyako/API/layout.rb +636 -433
  18. data/lib/Miyako/API/map.rb +583 -529
  19. data/lib/Miyako/API/map_event.rb +222 -198
  20. data/lib/Miyako/API/modules.rb +357 -109
  21. data/lib/Miyako/API/movie.rb +166 -154
  22. data/lib/Miyako/API/parts.rb +276 -189
  23. data/lib/Miyako/API/plane.rb +205 -166
  24. data/lib/Miyako/API/screen.rb +341 -325
  25. data/lib/Miyako/API/shape.rb +443 -443
  26. data/lib/Miyako/API/sprite.rb +771 -752
  27. data/lib/Miyako/API/sprite_animation.rb +490 -481
  28. data/lib/Miyako/API/sprite_list.rb +1135 -0
  29. data/lib/Miyako/API/spriteunit.rb +168 -147
  30. data/lib/Miyako/API/story.rb +350 -300
  31. data/lib/Miyako/API/textbox.rb +770 -725
  32. data/lib/Miyako/API/utility.rb +419 -388
  33. data/lib/Miyako/API/viewport.rb +189 -139
  34. data/lib/Miyako/API/yuki.rb +1226 -996
  35. data/lib/Miyako/EXT/miyako_cairo.rb +62 -62
  36. data/lib/Miyako/EXT/raster_scroll.rb +138 -138
  37. data/lib/Miyako/EXT/slides.rb +157 -157
  38. data/lib/Miyako/miyako.rb +201 -171
  39. data/lib/Miyako/miyako_require_only.rb +35 -0
  40. data/miyako_basicdata.c +590 -590
  41. data/miyako_bitmap.c +1225 -1225
  42. data/miyako_collision.c +403 -403
  43. data/miyako_drawing.c +187 -187
  44. data/miyako_font.c +334 -334
  45. data/miyako_hsv.c +830 -830
  46. data/miyako_input_audio.c +254 -0
  47. data/miyako_layout.c +191 -191
  48. data/miyako_no_katana.c +1078 -1074
  49. data/miyako_sprite2.c +431 -0
  50. data/miyako_transform.c +438 -438
  51. data/miyako_utility.c +288 -288
  52. data/sample/Animation1/m1ku.rb +68 -68
  53. data/sample/Animation2/lex.rb +96 -96
  54. data/sample/Diagram_sample/diagram_sample_yuki2.rb +328 -386
  55. data/sample/Room3/blue.rb +297 -297
  56. data/sample/Room3/ending.rb +180 -180
  57. data/sample/Room3/green.rb +220 -220
  58. data/sample/Room3/main.rb +119 -119
  59. data/sample/Room3/main_component.rb +59 -59
  60. data/sample/Room3/red.rb +227 -227
  61. data/sample/Room3/room3.rb +25 -27
  62. data/sample/Room3/title.rb +184 -184
  63. data/sample/ball_action_sample.rb +204 -204
  64. data/sample/blit_rop.rb +70 -70
  65. data/sample/cairo_sample.rb +25 -25
  66. data/sample/circle_collision_test.rb +66 -66
  67. data/sample/collision_test.rb +33 -33
  68. data/sample/collision_test2.rb +108 -108
  69. data/sample/fixed_map_test/fixed_map_sample.rb +140 -140
  70. data/sample/fixed_map_test/readme.txt +72 -72
  71. data/sample/map_test/chara.rb +58 -58
  72. data/sample/map_test/main_parts.rb +69 -69
  73. data/sample/map_test/main_scene.rb +153 -153
  74. data/sample/map_test/map_manager.rb +75 -75
  75. data/sample/map_test/map_test.rb +23 -23
  76. data/sample/map_test/oasis.rb +71 -71
  77. data/sample/map_test/readme.txt +89 -89
  78. data/sample/map_test/route.rb +157 -157
  79. data/sample/map_test/town.rb +74 -74
  80. data/sample/polygon_test.rb +35 -35
  81. data/sample/rasterscroll.rb +24 -24
  82. data/sample/takahashi.rb +42 -42
  83. data/sample/textbox_sample.rb +189 -189
  84. data/sample/transform.rb +54 -54
  85. data/sample/utility_test.rb +73 -73
  86. data/sample/utility_test2.rb +61 -61
  87. data/sample/utility_test3.rb +64 -64
  88. data/sample/utility_test4.rb +73 -73
  89. data/uninstall_miyako.rb +19 -19
  90. data/win/miyako_no_katana.so +0 -0
  91. metadata +7 -2
@@ -1,198 +1,572 @@
1
- # -*- encoding: utf-8 -*-
2
- =begin
3
- --
4
- Miyako v2.0
5
- Copyright (C) 2007-2009 Cyross Makoto
6
-
7
- This library is free software; you can redistribute it and/or
8
- modify it under the terms of the GNU Lesser General Public
9
- License as published by the Free Software Foundation; either
10
- version 2.1 of the License, or (at your option) any later version.
11
-
12
- This library is distributed in the hope that it will be useful,
13
- but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
- Lesser General Public License for more details.
16
-
17
- You should have received a copy of the GNU Lesser General Public
18
- License along with this library; if not, write to the Free Software
19
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- ++
21
- =end
22
-
23
- module Miyako
24
- #==オーディオ管理モジュール
25
- #オーディオにはBGM,SE(効果音)の2種類あり、扱えるメソッドが少々違う(別クラスになっている)。
26
- module Audio
27
- #==BGM管理クラス
28
- class BGM
29
- #===インスタンスを生成する
30
- #_fname_:: 演奏するBGMファイル名。対応ファイルはwav,mp3,ogg,mid等。
31
- #_loops_:: ループの可否を指定する。trueのとき繰り返し再生を行う
32
- #返却値:: 生成したインスタンス
33
- def initialize(fname, loops = true)
34
- return if $not_use_audio
35
- @bgm = SDL::Mixer::Music.load(fname)
36
- @loops = loops
37
- end
38
-
39
- #===音の大きさを設定する
40
- #_v_:: 音の大きさ。0〜255までの整数。255で最大。
41
- #返却値:: 自分自身を返す
42
- def set_volume(v)
43
- return self if $not_use_audio
44
- SDL::Mixer.setVolumeMusic(v)
45
- return self
46
- end
47
-
48
- alias_method(:setVolume, :set_volume)
49
-
50
- #===BGMを演奏する。ブロックが渡されている場合、ブロックの評価中のみ演奏する。
51
- #_vol_:: 音の大きさ(省略可能)。0〜255までの整数。
52
- #返却値:: 自分自身を返す
53
- def play(vol = nil)
54
- return self if $not_use_audio
55
- set_volume(vol) if vol
56
- l = @loops ? -1 : 0
57
- SDL::Mixer.playMusic(@bgm, l).to_s()
58
- if block_given?
59
- yield self
60
- SDL::Mixer.haltMusic
61
- end
62
- return self
63
- end
64
-
65
- #===フェードインしながら演奏する
66
- #_msec_:: フェードインの時間。ミリ秒単位。デフォルトは5000ミリ秒(5秒)
67
- #返却値:: 自分自身を返す
68
- def fade_in(msec=5000)
69
- return self if $not_use_audio
70
- l = @loops ? -1 : 0
71
- SDL::Mixer.fadeInMusic(@bgm, l, msec)
72
- return self
73
- end
74
-
75
- alias_method(:fadeIn, :fade_in)
76
-
77
- #===演奏中を示すフラグ
78
- #返却値:: 演奏中はtrue、停止(一時停止)中はfalseを返す
79
- def playing?
80
- return false if $not_use_audio
81
- return SDL::Mixer.playMusic?
82
- end
83
-
84
- #===演奏を一時停止する
85
- #resumeメソッドで一時停止を解除する
86
- #返却値:: 自分自身を返す
87
- def pause
88
- return self if $not_use_audio
89
- SDL::Mixer.pauseMusic if SDL::Mixer.playMusic?
90
- return self
91
- end
92
-
93
- #===一時停止を解除する
94
- #返却値:: 自分自身を返す
95
- def resume
96
- return self if $not_use_audio
97
- SDL::Mixer.resumeMusic if SDL::Mixer.pauseMusic?
98
- return self
99
- end
100
-
101
- #===演奏を停止する
102
- #pauseメソッドとは違い、完全に停止するため、resumeメソッドは使えない
103
- #返却値:: 自分自身を返す
104
- def stop
105
- return self if $not_use_audio
106
- SDL::Mixer.haltMusic if SDL::Mixer.playMusic?
107
- return self
108
- end
109
-
110
- #===演奏をフェードアウトする
111
- #_msec_:: フェードアウトする時間。ミリ秒単位。デフォルトは5000ミリ秒
112
- #_wmode_:: フェードアウトする間、処理を停止するかどうかを示すフラグ。デフォルトはfalse(すぐに次の処理を開始)
113
- #返却値:: 自分自身を返す
114
- def fade_out(msec = 5000, wmode = false)
115
- return self if $not_use_audio
116
- if SDL::Mixer.playMusic?
117
- SDL::Mixer.fadeOutMusic(msec)
118
- SDL::delay(msec) if wmode
119
- end
120
- return self
121
- end
122
-
123
- #===演奏情報を解放する
124
- #単なるダミー
125
- def dispose
126
- end
127
-
128
- alias_method(:fadeOut, :fade_out)
129
- end
130
-
131
- #==効果音管理クラス
132
- class SE
133
-
134
- #===同時発音数を変更する
135
- #デフォルトの同時発音数は8。発音数を減らすと鳴っている音が止まるため注意
136
- #_channels_:: 変更するチャネル数。0以下を指定するとエラー
137
- def SE.channels=(channels)
138
- return if $not_use_audio
139
- raise MiyakoError, "Illegal Channels! : #{channels}" if channels <= 0
140
- SDL::Mixer.allocate_channels(channels)
141
- end
142
-
143
- #===インスタンスを生成する
144
- #_fname_:: 効果音ファイル名。wavファイルのみ対応
145
- #返却値:: 生成したインスタンス
146
- def initialize(fname)
147
- return if $not_use_audio
148
- @wave = SDL::Mixer::Wave.load(fname)
149
- @channel = -1
150
- end
151
-
152
- #===効果音を鳴らす
153
- #_vol_:: 音の大きさ(省略可能)。0〜255の整数を設定する
154
- #返却値:: 自分自身を返す
155
- def play(vol = nil)
156
- return self if $not_use_audio
157
- set_volume(vol) if vol
158
- @channel = SDL::Mixer.playChannel(-1, @wave, 0)
159
- if block_given?
160
- yield self
161
- SDL::Mixer.halt(@channel)
162
- end
163
- return self
164
- end
165
-
166
- #===効果音が鳴っているかを示すフラグ
167
- #返却値:: 効果音が鳴っているときはtrue、鳴っていないときはfalseを返す
168
- def playing?
169
- return false if $not_use_audio
170
- return @channel != -1 ? SDL::Mixer.play?(@channel) : false
171
- end
172
-
173
- #===効果音を停止する
174
- #返却値:: 自分自身を返す
175
- def stop
176
- return self if $not_use_audio
177
- SDL::Mixer.halt(@channel) if @channel != -1
178
- return self
179
- end
180
-
181
- #===効果音の大きさを設定する
182
- #_v_:: 音の大きさ。0から255までの整数で示す。
183
- #返却値:: 自分自身を返す
184
- def set_volume(v)
185
- return self if $not_use_audio
186
- @wave.setVolume(v)
187
- return self
188
- end
189
-
190
- #===演奏情報を解放する
191
- #単なるダミー
192
- def dispose
193
- end
194
-
195
- alias_method(:setVolume, :set_volume)
196
- end
197
- end
198
- end
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.1
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
+
7
+ This library is free software; you can redistribute it and/or
8
+ modify it under the terms of the GNU Lesser General Public
9
+ License as published by the Free Software Foundation; either
10
+ version 2.1 of the License, or (at your option) any later version.
11
+
12
+ This library is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ Lesser General Public License for more details.
16
+
17
+ You should have received a copy of the GNU Lesser General Public
18
+ License along with this library; if not, write to the Free Software
19
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ ++
21
+ =end
22
+
23
+ module Miyako
24
+ #==オーディオ管理モジュール
25
+ #オーディオにはBGM,SE(効果音)の2種類あり、扱えるメソッドが少々違う(別クラスになっている)。
26
+ module Audio
27
+ @@initialized = false
28
+
29
+ #===音声関連の初期化処理
30
+ #既に初期化済みの時はMiyakoErrorが発生する
31
+ #_buf_size_:: Audioモジュールで使用するバッファサイズ。単位はバイト。省略時は4096
32
+ #_seq_:: Audioモジュールで使用する音声の再生サンプリング周波数。省略時は44100(44.1kHz)
33
+ def Audio.init(buf_size = 4096, seq = 44100)
34
+ raise MiyakoError, "Already initialized!" if @@initialized
35
+ SDL::Mixer.open(seq, SDL::Mixer::DEFAULT_FORMAT, 2, buf_size) unless $not_use_audio
36
+ @@initialized = true
37
+ end
38
+
39
+ #===音声関係の初期化がされた?
40
+ def Audio.initialized?
41
+ @@initialized
42
+ end
43
+
44
+ #===BGM・効果音の再生情報を更新する
45
+ def Audio.update
46
+ return if $not_use_audio
47
+ Audio::BGM.update
48
+ Audio::SE.update
49
+ end
50
+
51
+ #==BGM管理クラス
52
+ #再生できるBGMは1曲だけ。2つ以上のBGMの同時演奏は不可
53
+ class BGM
54
+ @@playing_bgm = nil
55
+
56
+ #===BGMの再生情報を更新する
57
+ def BGM.update
58
+ return if $not_use_audio
59
+ return unless @@playing_bgm
60
+ if !@@playing_bgm.playing_without_loop? && @@playing_bgm.in_the_loop?
61
+ @@playing_bgm.loop_count_up
62
+ @@playing_bgm = nil if !@@playing_bgm.in_the_loop?
63
+ elsif !@@playing_bgm.playing? && !@@playing_bgm.fade_out?
64
+ @@playing_bgm = nil
65
+ elsif !@@playing_bgm.allow_loop_count_up?
66
+ @@playing_bgm.allow_loop_count_up
67
+ end
68
+ end
69
+
70
+ #===現在の繰り返し回数を取得する
71
+ #繰り返し回数を限定して演奏しているとき、何回目の演奏家を示す。
72
+ #無限に繰り返しているときは常に-1を返す
73
+ #返却値:: ループ回数
74
+ def loop_count
75
+ @loop_cnt
76
+ end
77
+
78
+ #===現在、繰り返し演奏中かどうかを問い合わせる
79
+ #現在、繰り返し回数が指定の回数の範囲内かどうかをtrue・falseで返す。
80
+ #無限に繰り返しているときは常にtrue
81
+ #返却値:: 現在繰り返し演奏中のときはtrue
82
+ def in_the_loop?
83
+ @now_loops == -1 ? true : @loop_cnt <= @now_loops
84
+ end
85
+
86
+ def loop_count_up #:nodoc:
87
+ @loop_cnt = @loop_cnt + 1 if (@now_loops != -1 && @cnt_up_flag)
88
+ @cnt_up_flag = false
89
+ end
90
+
91
+ def allow_loop_count_up #:nodoc:
92
+ @cnt_up_flag = true
93
+ end
94
+
95
+ def allow_loop_count_up? #:nodoc:
96
+ @cnt_up_flag
97
+ end
98
+
99
+ #===インスタンスを生成する
100
+ #_fname_:: 演奏するBGMファイル名。対応ファイルはwav,mp3,ogg,mid等。
101
+ #_loops_:: 演奏の繰り返し回数を指定する。-1を渡すと無限に繰り返す。省略時は-1を渡す。
102
+ #返却値:: 生成したインスタンス
103
+ def initialize(fname, loops = -1)
104
+ return if $not_use_audio
105
+ raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
106
+ raise MiyakoIOError.no_file(fname) unless File.exist?(fname)
107
+ @bgm = SDL::Mixer::Music.load(fname)
108
+ @loops = loops
109
+ @now_loops = loops
110
+ @loop_cnt = 1
111
+ @cnt_up_flag = false
112
+ end
113
+
114
+ #===インスタンスの複写
115
+ #複写すると不都合が多いため、MiyakoCopyException例外が発生する
116
+ def initialize_copy(obj)
117
+ raise MiyakoCopyError.not_copy("BGM")
118
+ end
119
+
120
+ #===音の大きさを設定する
121
+ #_v_:: 音の大きさ。0〜255までの整数。255で最大。
122
+ #返却値:: 自分自身を返す
123
+ def set_volume(v)
124
+ return self if $not_use_audio
125
+ raise MiyakoValueError.over_range(v, 0, 255) unless (0..255).cover?(v)
126
+ SDL::Mixer.set_volume_music(v)
127
+ return self
128
+ end
129
+
130
+ alias_method(:setVolume, :set_volume)
131
+
132
+ #===BGMを演奏する。ブロックが渡されている場合、ブロックの評価中のみ演奏する。
133
+ #音の大きさ・繰り返し回数・演奏時間を指定可能
134
+ #_vol_:: 音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。
135
+ #_loops_:: 演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。nilを渡すと元の設定を使う。省略時はnilを渡す。
136
+ #返却値:: 演奏に成功したときはtrue、失敗した問いはfalseを返す
137
+ def start(vol = nil, loops = nil)
138
+ if vol
139
+ raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
140
+ end
141
+ if loops
142
+ raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
143
+ end
144
+ return self.play(vol, loops)
145
+ end
146
+
147
+ #===BGMを演奏する。ブロックが渡されている場合、ブロックの評価中のみ演奏する。
148
+ #音の大きさ・繰り返し回数を指定可能
149
+ #_vol_:: 音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。
150
+ #_loops_:: 演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。nilを渡すと元の設定を使う。省略時はnilを渡す。
151
+ #返却値:: 演奏に成功したときはtrue、失敗した問いはfalseを返す
152
+ def play(vol = nil, loops = nil)
153
+ return false if $not_use_audio
154
+ return false if @@playing_bgm && @@playing_bgm != self
155
+ if vol
156
+ raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
157
+ set_volume(vol)
158
+ end
159
+ if loops
160
+ raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
161
+ end
162
+ @now_loops = loops ? loops : @loops
163
+ SDL::Mixer.play_music(@bgm, @now_loops)
164
+ @loop_cnt = 1
165
+ if block_given?
166
+ yield self
167
+ SDL::Mixer.halt_music
168
+ end
169
+ @@playing_bgm = self
170
+ return true
171
+ end
172
+
173
+ #===フェードインしながら演奏する
174
+ #_msec_:: フェードインの時間。ミリ秒単位。デフォルトは5000ミリ秒(5秒)
175
+ #_vol_:: 音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。
176
+ #_loops_:: 演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。nilを渡すと元の設定を使う。省略時はnilを渡す。
177
+ #返却値:: 演奏に成功したときはtrue、失敗した問いはfalseを返す
178
+ def fade_in(msec=5000, vol = nil, loops = nil)
179
+ return false if $not_use_audio
180
+ return false if @@playing_bgm && @@playing_bgm != self
181
+ raise MiyakoValueError.over_range(msec, 1, nil) unless msec > 0
182
+ if vol
183
+ raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
184
+ set_volume(vol)
185
+ end
186
+ if loops
187
+ raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
188
+ end
189
+ @now_loops = loops ? loops : @loops
190
+ SDL::Mixer.fade_in_music(@bgm, @now_loops)
191
+ @@playing_bgm = self
192
+ @loop_cnt = 1
193
+ return true
194
+ end
195
+
196
+ alias_method(:fadeIn, :fade_in)
197
+
198
+ #===演奏中を示すフラグ
199
+ #返却値:: 演奏中はtrue、停止(一時停止)中はfalseを返す
200
+ def playing?
201
+ return false if $not_use_audio
202
+ return (SDL::Mixer.play_music? && self.in_the_loop?) || self.fade_out?
203
+ end
204
+
205
+ def playing_without_loop? #:nodoc:
206
+ return false if $not_use_audio
207
+ return SDL::Mixer.play_music?
208
+ end
209
+
210
+ #===演奏停止中を示すフラグ
211
+ #返却値:: 演奏停止中はtrue、演奏中はfalseを返す
212
+ def pausing?
213
+ return false if $not_use_audio
214
+ return SDL::Mixer.pause_music?
215
+ end
216
+
217
+ #===演奏を一時停止する
218
+ #resumeメソッドで一時停止を解除する
219
+ #返却値:: 自分自身を返す
220
+ def pause
221
+ return self if $not_use_audio
222
+ SDL::Mixer.pause_music if SDL::Mixer.play_music?
223
+ return self
224
+ end
225
+
226
+ #==フェードイン中を示すフラグ
227
+ #返却値:: フェードイン中はtrue、そのほかの時はfalseを返す
228
+ def fade_in?
229
+ return false if $not_use_audio
230
+ # return SDL::Mixer.fading_music == SDL::Mixer::FADING_IN
231
+ # なぜかSDL::Mixer::FADING_INが見つからないため、即値で
232
+ # from SDL_Mixer.h
233
+ return SDL::Mixer.fading_music == 2
234
+ end
235
+
236
+ #==フェードアウト中を示すフラグ
237
+ #返却値:: フェードアウト中はtrue、そのほかの時はfalseを返す
238
+ def fade_out?
239
+ return false if $not_use_audio
240
+ # return SDL::Mixer.fading_music == SDL::Mixer::FADING_OUT
241
+ # なぜかSDL::Mixer::FADING_OUTが見つからないため、即値で
242
+ # from SDL_Mixer.h
243
+ return SDL::Mixer.fading_music == 1
244
+ end
245
+
246
+ #===一時停止を解除する
247
+ #返却値:: 自分自身を返す
248
+ def resume
249
+ return self if $not_use_audio
250
+ SDL::Mixer.resume_music if SDL::Mixer.pause_music?
251
+ return self
252
+ end
253
+
254
+ #===演奏を停止する
255
+ #pauseメソッドとは違い、完全に停止するため、resumeメソッドは使えない
256
+ #返却値:: 自分自身を返す
257
+ def stop
258
+ return self if $not_use_audio
259
+ SDL::Mixer.halt_music if SDL::Mixer.play_music?
260
+ @loop_cnt = @now_loops + 1
261
+ @@playing_bgm = nil if @@playing_bgm == self
262
+ return self
263
+ end
264
+
265
+ #===演奏をフェードアウトする
266
+ #_msec_:: フェードアウトする時間。ミリ秒単位。デフォルトは5000ミリ秒
267
+ #_wmode_:: フェードアウトする間、処理を停止するかどうかを示すフラグ。デフォルトはfalse(すぐに次の処理を開始)
268
+ #返却値:: 自分自身を返す
269
+ def fade_out(msec = 5000, wmode = false)
270
+ return self if $not_use_audio
271
+ raise MiyakoValueError.over_range(msec, 1, nil) unless msec > 0
272
+ if SDL::Mixer.play_music?
273
+ SDL::Mixer.fade_out_music(msec)
274
+ SDL::delay(msec) if wmode
275
+ end
276
+ return self
277
+ end
278
+
279
+ #===演奏情報を解放する
280
+ #レシーバをdup/deep_dupなどのメソッドで複製したことがある場合、
281
+ #内部データを共有しているため、呼び出すときには注意すること
282
+ def dispose
283
+ @@playing_bgm = nil if @@playing_bgm == self
284
+ @bgm.destroy
285
+ @bgm = nil
286
+ end
287
+
288
+ alias_method(:fadeOut, :fade_out)
289
+ end
290
+
291
+ #==効果音管理クラス
292
+ class SE
293
+ @@channels = 8
294
+ @@playings = []
295
+
296
+ SDL::Mixer.allocate_channels(@@channels)
297
+
298
+ #===効果音の再生情報を更新する
299
+ def SE.update
300
+ return if $not_use_audio
301
+ @@playings.each{|playing|
302
+ if !playing.playing_without_loop? && playing.in_the_loop?
303
+ playing.loop_count_up
304
+ @@playings.delete(playing) if !playing.in_the_loop?
305
+ elsif !playing.playing? && !playing.fade_out?
306
+ @@playings.delete(playing)
307
+ elsif !playing.allow_loop_count_up?
308
+ playing.allow_loop_count_up
309
+ end
310
+ }
311
+ end
312
+
313
+ #===何かしらの効果音が再生中かどうかを確認する
314
+ #返却値:: 何かしらの効果音が再生中ならtrue、それ以外はfalse
315
+ def SE.playing_any?
316
+ !@@playings.empty?
317
+ end
318
+
319
+ #===同時発音数を取得する
320
+ #返却値:: 同時再生数
321
+ def SE.channels=(channels)
322
+ @@channels
323
+ end
324
+
325
+ #===現在再生している効果音をすべて停止する
326
+ #_msec_:: 停止する時間をミリ秒で指定(msecミリ秒後に停止)。nilを渡すとすぐに停止する。省略時はnilを渡す。
327
+ def SE.stop(msec = nil)
328
+ if msec
329
+ raise MiyakoValueError.over_range(msec, 1, nil) unless msec > 0
330
+ end
331
+ msec ? SDL::Mixer.expire(-1, msec) : SDL::Mixer.halt(-1)
332
+ @@playings.clear
333
+ end
334
+
335
+ #===同時発音数を変更する
336
+ #設定変更は効果音が鳴っていないときに有効。
337
+ #鳴っているときに変更しようとするとfalseが返ってくる。
338
+ #デフォルトの同時発音数は8。
339
+ #_channels_:: 変更するチャネル数。0以下を指定するとエラー
340
+ #返却値:: 変更に成功したときはtrue、失敗したときはfalseを返す
341
+ def SE.channels=(channels)
342
+ return false if $not_use_audio
343
+ return false if SE.playing_any?
344
+ raise MiyakoValueError, "Illegal Channels! : #{channels}" if channels <= 0
345
+ SDL::Mixer.allocate_channels(channels)
346
+ @@channels = channels
347
+ return true
348
+ end
349
+
350
+ #===現在の繰り返し回数を取得する
351
+ #繰り返し回数を限定して演奏しているとき、何回目の演奏家を示す。
352
+ #無限に繰り返しているときは常に-1を返す
353
+ #返却値:: ループ回数
354
+ def loop_count
355
+ @loop_cnt
356
+ end
357
+
358
+ #===現在、繰り返し演奏中かどうかを問い合わせる
359
+ #現在、繰り返し回数が指定の回数の範囲内かどうかをtrue・falseで返す。
360
+ #無限に繰り返しているときは常にtrue
361
+ #返却値:: 現在繰り返し演奏中のときはtrue
362
+ def in_the_loop?
363
+ @now_loops == -1 ? true : @loop_cnt <= @now_loops
364
+ end
365
+
366
+ def loop_count_up #:nodoc:
367
+ @loop_cnt = @loop_cnt + 1 if (@now_loops != -1 && @cnt_up_flag)
368
+ @cnt_up_flag = false
369
+ end
370
+
371
+ def allow_loop_count_up #:nodoc:
372
+ @cnt_up_flag = true
373
+ end
374
+
375
+ def allow_loop_count_up? #:nodoc:
376
+ @cnt_up_flag
377
+ end
378
+
379
+ #===インスタンスを生成する
380
+ #_fname_:: 効果音ファイル名。wavファイルのみ対応
381
+ #_vol_:: 音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。
382
+ #返却値:: 生成したインスタンス
383
+ def initialize(fname, vol = nil)
384
+ return nil if $not_use_audio
385
+ raise MiyakoIOError.no_file(fname) unless File.exist?(fname)
386
+ @wave = SDL::Mixer::Wave.load(fname)
387
+ if vol
388
+ raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
389
+ @wave.set_volume(vol)
390
+ end
391
+ @channel = -1
392
+ @loops = -1
393
+ @now_loops = @loops
394
+ @loop_cnt = 1
395
+ @cnt_up_flag = false
396
+ end
397
+
398
+ #===インスタンスの複写
399
+ #複写すると不都合が多いため、MiyakoCopyException例外が発生する
400
+ def initialize_copy(obj)
401
+ raise MiyakoCopyError.not_copy("SE")
402
+ end
403
+
404
+ #===効果音を鳴らす
405
+ #音の大きさ・繰り返し回数・演奏時間を指定可能
406
+ #_vol_:: 音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。
407
+ #_loops_:: 演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。省略時は1を渡す。
408
+ #_time_:: 演奏時間。ミリ秒を整数で指定する。省略時は最後まで演奏する。
409
+ #返却値:: 再生に成功したときはtrue、失敗したときはfalseを返す
410
+ def start(vol = nil, loops = 1, time = nil)
411
+ if vol
412
+ raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
413
+ end
414
+ if time
415
+ raise MiyakoValueError.over_range(time, 1, nil) unless msec > 1
416
+ end
417
+ raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
418
+ return self.play(vol, loops, time)
419
+ end
420
+
421
+ #===効果音を鳴らす
422
+ #音の大きさ・繰り返し回数・演奏時間を指定可能
423
+ #鳴らすとき、同時再生数を超えるときは鳴らさずにfalseを返す
424
+ #ただし、自分自身が鳴っているときは、前に鳴っていた音を止めて再び鳴らす
425
+ #_vol_:: 音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。
426
+ #_loops_:: 演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。省略時は1を渡す。
427
+ #_time_:: 演奏時間。ミリ秒を整数で指定する。省略時は最後まで演奏する。
428
+ #返却値:: 再生に成功したときはtrue、失敗したときはfalseを返す
429
+ def play(vol = nil, loops = 1, time = nil)
430
+ return false if $not_use_audio
431
+ return false if (@@playings.length == @@channels && !@@playings.include?(self))
432
+ self.stop if @@playings.include?(self)
433
+ if vol
434
+ raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
435
+ set_volume(vol)
436
+ end
437
+ if time
438
+ raise MiyakoValueError.over_range(time, 1, nil) unless time > 0
439
+ end
440
+ raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
441
+ @now_loops = loops ? loops : @loops
442
+ @loop_cnt = 1
443
+ lp = @now_loops == -1 ? -1 : @now_loops - 1
444
+ @channel = time ? SDL::Mixer.play_channel_timed(-1, @wave, lp, time) : SDL::Mixer.play_channel(-1, @wave, lp)
445
+ @@playings << self
446
+ if block_given?
447
+ yield self
448
+ SDL::Mixer.halt(@channel)
449
+ end
450
+ SE.update
451
+ return true
452
+ end
453
+
454
+ #===効果音が鳴っているかを示すフラグ
455
+ #返却値:: 効果音が鳴っているときはtrue、鳴っていないときはfalseを返す
456
+ def playing?
457
+ return false if $not_use_audio
458
+ return @channel != -1 ? (SDL::Mixer.play?(@channel) && self.in_the_loop?) || self.fade_out? : false
459
+ end
460
+
461
+ def playing_without_loop? #:nodoc:
462
+ return false if $not_use_audio
463
+ return @channel != -1 ? SDL::Mixer.play?(@channel) : false
464
+ end
465
+
466
+ #===効果音を停止する
467
+ #_msec_:: 停止する時間をミリ秒で指定(msecミリ秒後に停止)。nilを渡すとすぐに停止する。省略時はnilを渡す。
468
+ #返却値:: 自分自身を返す
469
+ def stop(msec = nil)
470
+ return self if $not_use_audio
471
+ return self if !@@playings.include?(self)
472
+ if msec
473
+ raise MiyakoValueError.over_range(msec, 1, nil) unless msec > 0
474
+ end
475
+ return self if @channel == -1
476
+ return self unless SDL::Mixer.play?(@channel)
477
+ msec ? SDL::Mixer.expire(@channel, msec) : SDL::Mixer.halt(@channel)
478
+ @loop_cnt = @now_loops + 1
479
+ @@playings.delete(self)
480
+ @channe = -1
481
+ return self
482
+ end
483
+
484
+ #===フェードインしながら演奏する
485
+ #_msec_:: フェードインの時間。ミリ秒単位。デフォルトは5000ミリ秒(5秒)
486
+ #_loops_:: 演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。省略時は1を渡す。
487
+ #_vol_:: 音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。
488
+ #_time_:: 演奏時間。ミリ秒を整数で指定する。省略時は最後まで演奏する。
489
+ #返却値:: 演奏に成功したときはtrue、失敗した問いはfalseを返す
490
+ def fade_in(msec=5000, loops = 1, vol = nil, time = nil)
491
+ return false if $not_use_audio
492
+ return false if (@@playings.length == @@channels && !@@playings.include?(self))
493
+ self.stop if @@playings.include?(self)
494
+ if vol
495
+ raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
496
+ set_volume(vol)
497
+ end
498
+ if time
499
+ raise MiyakoValueError.over_range(time, 1, nil) unless time > 0
500
+ end
501
+ raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
502
+ @now_loops = loops ? loops : @loops
503
+ @loop_cnt = 1
504
+ lp = @now_loops == -1 ? -1 : @now_loops - 1
505
+ @channel = time ? SDL::Mixer.fade_in_channel_timed(-1, @wave, lp, msec, time) : SDL::Mixer.fade_in_channel(-1, @wave, lp, msec)
506
+ @@playings << self
507
+ SE.update
508
+ return true
509
+ end
510
+
511
+ #===演奏をフェードアウトする
512
+ #_msec_:: フェードアウトする時間。ミリ秒単位。デフォルトは5000ミリ秒
513
+ #_wmode_:: フェードアウトする間、処理を停止するかどうかを示すフラグ。デフォルトはfalse(すぐに次の処理を開始)
514
+ #返却値:: 自分自身を返す
515
+ def fade_out(msec = 5000, wmode = false)
516
+ return self if $not_use_audio
517
+ return self if !@@playings.include?(self)
518
+ if msec
519
+ raise MiyakoValueError.over_range(msec, 1, nil) unless msec > 0
520
+ end
521
+ if self.playing?
522
+ SDL::Mixer.fade_out(@channel, msec)
523
+ SDL::delay(msec) if wmode
524
+ end
525
+ return self
526
+ end
527
+
528
+ #==フェードイン中を示すフラグ
529
+ #返却値:: フェードイン中はtrue、そのほかの時はfalseを返す
530
+ def fade_in?
531
+ return false if $not_use_audio
532
+ return false if @channel == -1
533
+ # なぜかSDL::Mixer::FADING_INが見つからないため、即値で
534
+ # from SDL_Mixer.h
535
+ # return SDL::Mixer.fading(@channel) == SDL::Mixer::FADING_IN
536
+ return SDL::Mixer.fading(@channel) == 2
537
+ end
538
+
539
+ #==フェードアウト中を示すフラグ
540
+ #返却値:: フェードアウト中はtrue、そのほかの時はfalseを返す
541
+ def fade_out?
542
+ return false if $not_use_audio
543
+ return false if @channel == -1
544
+ # なぜかSDL::Mixer::FADING_INが見つからないため、即値で
545
+ # from SDL_Mixer.h
546
+ # return SDL::Mixer.fading(@channel) == SDL::Mixer::FADING_OUT
547
+ return SDL::Mixer.fading(@channel) == 1
548
+ end
549
+
550
+
551
+ #===効果音の大きさを設定する
552
+ #_v_:: 音の大きさ。0から255までの整数で示す。
553
+ #返却値:: 自分自身を返す
554
+ def set_volume(v)
555
+ return self if $not_use_audio
556
+ raise MiyakoValueError.over_range(v, 0, 255) unless (0..255).cover?(v)
557
+ @wave.set_volume(v)
558
+ return self
559
+ end
560
+
561
+ #===演奏情報を解放する
562
+ #レシーバをdup/deep_dupなどのメソッドで複製したことがある場合、
563
+ #内部データを共有しているため、呼び出すときには注意すること
564
+ def dispose
565
+ @wave.destroy
566
+ @wave = nil
567
+ end
568
+
569
+ alias_method(:setVolume, :set_volume)
570
+ end
571
+ end
572
+ end