cyross-ruby-miyako 2.0.5.1 → 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,573 +1,825 @@
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
- #位置変更メソッドを追加
26
- class PointStruct < Struct
27
- #===位置を変更する(変化量を指定)
28
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
29
- #_dx_:: 移動量(x方向)。単位はピクセル
30
- #_dy_:: 移動量(y方向)。単位はピクセル
31
- #返却値:: 自分自身を返す
32
- def move(dx, dy)
33
- end
34
-
35
- #===位置を変更する(位置指定)
36
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
37
- #_x_:: 移動先位置(x方向)。単位はピクセル
38
- #_y_:: 移動先位置(y方向)。単位はピクセル
39
- #返却値:: 自分自身を返す
40
- def move_to(x, y)
41
- end
42
- end
43
-
44
- #==サイズ情報のための構造体クラス
45
- #サイズ変更メソッドを追加
46
- class SizeStruct < Struct
47
- #===サイズを変更する(変化量を指定)
48
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
49
- #_dw_:: 幅変更。単位はピクセル
50
- #_dh_:: 高さ変更。単位はピクセル
51
- #返却値:: 自分自身を返す
52
- def resize(dw, dh)
53
- end
54
-
55
- #===サイズを変更する
56
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
57
- #_w_:: 幅変更。単位はピクセル
58
- #_h_:: 高さ変更。単位はピクセル
59
- #返却値:: 自分自身を返す
60
- def resize_to(w, h)
61
- end
62
- end
63
-
64
- #==矩形情報のための構造体クラス
65
- #矩形変更メソッドを追加
66
- class RectStruct < Struct
67
- #===位置を変更する(変化量を指定)
68
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
69
- #_dx_:: 移動量(x方向)。単位はピクセル
70
- #_dy_:: 移動量(y方向)。単位はピクセル
71
- #返却値:: 自分自身を返す
72
- def move(dx, dy)
73
- end
74
-
75
- #===位置を変更する(位置指定)
76
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
77
- #_x_:: 移動先位置(x方向)。単位はピクセル
78
- #_y_:: 移動先位置(y方向)。単位はピクセル
79
- #返却値:: 自分自身を返す
80
- def move_to(x, y)
81
- end
82
-
83
- #===サイズを変更する(変化量を指定)
84
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
85
- #_dw_:: 幅変更。単位はピクセル
86
- #_dh_:: 高さ変更。単位はピクセル
87
- #返却値:: 自分自身を返す
88
- def resize(dw, dh)
89
- end
90
-
91
- #===サイズを変更する
92
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
93
- #_w_:: 幅変更。単位はピクセル
94
- #_h_:: 高さ変更。単位はピクセル
95
- #返却値:: 自分自身を返す
96
- def resize_to(w, h)
97
- end
98
-
99
- #===指定の座標が矩形の範囲内かを問い合わせる
100
- #_x_:: 指定のx座標
101
- #_y_:: 指定のy座標
102
- #返却値:: 座標が矩形の範囲内ならtrueを返す
103
- def in_range?(x, y)
104
- return (x >= self[0] && y >= self[1] && x < self[0] + self[2] && y < self[1] + self[3])
105
- end
106
- end
107
-
108
- #==Square構造体用クラス
109
- #位置変更メソッドを追加
110
- class SquareStruct < Struct
111
- #===位置を変更する(変化量を指定)
112
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
113
- #_dx_:: 移動量(x方向)。単位はピクセル
114
- #_dy_:: 移動量(y方向)。単位はピクセル
115
- #返却値:: 自分自身を返す
116
- def move(dx, dy)
117
- end
118
-
119
- #===位置を変更する(位置指定)
120
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
121
- #_x_:: 移動先位置(x方向)。単位はピクセル
122
- #_y_:: 移動先位置(y方向)。単位はピクセル
123
- #返却値:: 自分自身を返す
124
- def move_to(x, y)
125
- end
126
-
127
- #===サイズを変更する(変化量を指定)
128
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
129
- #_dw_:: 幅変更。単位はピクセル
130
- #_dh_:: 高さ変更。単位はピクセル
131
- #返却値:: 自分自身を返す
132
- def resize(dw, dh)
133
- end
134
-
135
- #===サイズを変更する
136
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
137
- #_w_:: 幅変更。単位はピクセル
138
- #_h_:: 高さ変更。単位はピクセル
139
- #返却値:: 自分自身を返す
140
- def resize_to(w, h)
141
- end
142
-
143
- #===指定の座標が矩形の範囲内かを問い合わせる
144
- #_x_:: 指定のx座標
145
- #_y_:: 指定のy座標
146
- #返却値:: 座標が矩形の範囲内ならtrueを返す
147
- def in_range?(x, y)
148
- return (x >= self[0] && y >= self[1] && x <= self[2] && y <= self[3])
149
- end
150
- end
151
-
152
- #==線分の区間情報のための構造体クラス
153
- #位置変更メソッドを追加
154
- class SegmentStruct < Struct
155
- #===Segment構造体インスタンスを生成する
156
- # 入力した矩形情報(Rect構造体、[x,y,w,h]で表される配列)から、構造体インスタンスを生成する
157
- #_rect_:: 算出に使用する矩形情報
158
- #返却値:: 生成したインスタンスを返す
159
- def SegmentStruct.create(rect)
160
- return Segment.new([rect[0], rect[0] + rect[2] - 1],
161
- [rect[1], rect[1] + rect[3] - 1])
162
- end
163
-
164
- #===位置を変更する(変化量を指定)
165
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
166
- #_dx_:: 移動量(x方向)。単位はピクセル
167
- #_dy_:: 移動量(y方向)。単位はピクセル
168
- #返却値:: 自分自身を返す
169
- def move(dx, dy)
170
- end
171
-
172
- #===位置を変更する(位置指定)
173
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
174
- #_x_:: 移動先位置(x方向)。単位はピクセル
175
- #_y_:: 移動先位置(y方向)。単位はピクセル
176
- #返却値:: 自分自身を返す
177
- def move_to(x, y)
178
- end
179
-
180
- #===サイズを変更する(変化量を指定)
181
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
182
- #_dw_:: 幅変更。単位はピクセル
183
- #_dh_:: 高さ変更。単位はピクセル
184
- #返却値:: 自分自身を返す
185
- def resize(dw, dh)
186
- end
187
-
188
- #===サイズを変更する
189
- # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
190
- #_w_:: 幅変更。単位はピクセル
191
- #_h_:: 高さ変更。単位はピクセル
192
- #返却値:: 自分自身を返す
193
- def resize_to(w, h)
194
- end
195
-
196
- def reset(min_x, max_x, min_y, max_y) #:nodoc:
197
- x[0], x[1], y[0], y[1] = min_x, max_x, min_y, max_y
198
- end
199
-
200
- #===小線分を移動させたとき、大線分が範囲内かどうかを判別する
201
- # 移動後の小線分が大線分の範囲内にあるかどうかをtrue/falseで取得する
202
- #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
203
- #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
204
- #_d_:: selfの移動量
205
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
206
- #返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
207
- def in_bounds?(idx, big_segment, d, flag = false)
208
- raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
209
- nx = self[idx][0] + d
210
- nx2 = self[idx][1] + d
211
- nx, nx2 = nx2, nx if nx > nx2
212
- return flag ?
213
- (nx >= big_segment[idx][0] && nx2 <= big_segment[idx][1]) :
214
- (nx > big_segment[idx][0] && (nx2 - 1) < big_segment[idx][1])
215
- end
216
-
217
- #===小線分を移動させたとき、大線分が範囲内かどうかを判別して、その状態によって値を整数で返す
218
- # 移動後の小線分の範囲が大線分の範囲内のときは0、
219
- # マイナス方向で範囲外に出るときは-1、
220
- # プラス方向で出るときは1を返す
221
- #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
222
- #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
223
- #_d_:: selfの移動量
224
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
225
- #返却値:: 判別の結果
226
- def in_bounds_ex?(idx, big_segment, d, flag = false)
227
- raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
228
- nx = self[idx][0] + d
229
- nx2 = self[idx][1] + d - 1
230
- nx, nx2 = nx2, nx if nx > nx2
231
- return -1 if (nx < big_segment[idx][0]) || (flag && (nx == big_segment[idx][0]))
232
- return (nx2 > big_segment[idx][1]) || (flag && (nx2 == big_segment[idx][1])) ? 1 : 0
233
- end
234
-
235
- #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
236
- # 移動後の小線分の範囲が大線分の範囲内のときは0、
237
- # マイナス方向で範囲外に出るときは1、
238
- # プラス方向で出るときは-1を返す
239
- #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
240
- #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
241
- #_d_:: selfの移動量
242
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
243
- #返却値:: 判別の結果
244
- def in_bounds_rev?(idx, big_segment, d, flag = false)
245
- raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
246
- nx = self[idx][0] + d
247
- nx2 = self[idx][1] + d - 1
248
- nx, nx2 = nx2, nx if nx > nx2
249
- return 1 if (nx < big_segment[idx][0]) || (flag && (nx == big_segment[idx][0]))
250
- return (nx2 > big_segment[idx][1]) || (flag && (nx2 == big_segment[idx][1])) ? -1 : 0
251
- end
252
-
253
- #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
254
- # 移動量が0のときは0、
255
- # 移動後の小線分の範囲が大線分の範囲内のときは1、
256
- # 範囲外に出るときは-1を返す
257
- #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
258
- #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
259
- #_d_:: selfの移動量
260
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
261
- #返却値:: 判別の結果
262
- def in_bounds_rev_ex?(idx, big_segment, d, flag = false)
263
- raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
264
- return 0 if d == 0
265
- dir = (d <=> 0)
266
- nx = self[idx][0] + d
267
- nx2 = self[idx][1] + d - 1
268
- nx, nx2 = nx2, nx if nx > nx2
269
- return -dir if (nx < big_segment[idx][0]) || (flag && (nx == big_segment[idx][0]))
270
- return (nx2 > big_segment[idx][1]) || (flag && (nx2 == big_segment[idx][1])) ? -dir : dir
271
- end
272
- end
273
-
274
- #==座標などを構成するために使用する構造体
275
- #_x_:: X座標の値
276
- #_y_:: Y座標の値
277
- Point = PointStruct.new(:x, :y)
278
-
279
- #==サイズなどを構成するために使用する構造体
280
- #_w_:: 横幅
281
- #_h_:: 高さ
282
- Size = SizeStruct.new(:w, :h)
283
-
284
- #==矩形などを構成するために使用する構造体
285
- #_x_:: X座標の値
286
- #_y_:: Y座標の値
287
- #_w_:: 横幅
288
- #_h_:: 高さ
289
- Rect = RectStruct.new(:x, :y, :w, :h)
290
-
291
- #==矩形などを構成するために使用する構造体
292
- #_left_:: 左上X座標の値
293
- #_top_:: 左上Y座標の値
294
- #_right_:: 右下X座標の値
295
- #_bottom_:: 右下Y座標の値
296
- Square = SquareStruct.new(:left, :top, :right, :bottom)
297
-
298
- #==線分を構成するために使用する構造体
299
- #_x_:: X方向の線分([min_x, max_x]で構成される配列)
300
- #_y_:: Y方向の線分([min_y, max_y]で構成される配列)
301
- Segment = SegmentStruct.new(:x, :y)
302
-
303
- #==色を管理するクラス
304
- #
305
- #色情報は、[r(赤),g(緑),b(青),a(透明度)]、[r,g,b,a(透明度)]の2種類の配列
306
- #
307
- #それぞれの要素の値は0〜255の範囲
308
- #
309
- #4要素必要な色情報に3要素の配列を渡すと、自動的に4要素目(値は255)が挿入される
310
- #
311
- #(注)本クラスで採用する透明度と、画像が持つ透明度とは別物
312
- class Color
313
- @@symbol2color = {:black => [ 0, 0, 0, 255],
314
- :white => [255,255,255, 255],
315
- :blue => [ 0, 0,255, 255],
316
- :green => [ 0,255, 0, 255],
317
- :red => [255, 0, 0, 255],
318
- :cyan => [ 0,255,255, 255],
319
- :purple => [255, 0,255, 255],
320
- :yellow => [255,255, 0, 255],
321
- :light_gray => [200,200,200, 255],
322
- :half_gray => [128,128,128, 255],
323
- :half_blue => [ 0, 0,128, 255],
324
- :half_green => [ 0,128, 0, 255],
325
- :half_red => [128, 0, 0, 255],
326
- :half_cyan => [ 0,128,128, 255],
327
- :half_purple => [128, 0,128, 255],
328
- :half_yellow => [128,128, 0, 255],
329
- :dark_gray => [ 80, 80, 80, 255],
330
- :dark_blue => [ 0, 0, 80, 255],
331
- :dark_green => [ 0, 80, 0, 255],
332
- :dark_red => [ 80, 0, 0, 255],
333
- :dark_cyan => [ 0, 80, 80, 255],
334
- :dark_purple => [ 80, 0, 80, 255],
335
- :dark_yellow => [ 80, 80, 0, 255]}
336
- @@symbol2color.default = nil
337
-
338
- #===シンボルから色情報を取得する
339
- #_name_::色に対応したシンボル(以下の一覧参照)。存在しないシンボルを渡したときはエラーを返す
340
- #返却値::シンボルに対応した4要素の配列
341
- #
342
- #シンボル:: 色配列([赤,緑,青,透明度])
343
- #:black:: [ 0, 0, 0, 255]
344
- #:white:: [255,255,255, 255]
345
- #:blue:: [ 0, 0,255, 255]
346
- #:green:: [ 0,255, 0, 255]
347
- #:red:: [255, 0, 0, 255]
348
- #:cyan:: [ 0,255,255, 255]
349
- #:purple:: [255, 0,255, 255]
350
- #:yellow:: [255,255, 0, 255]
351
- #:light_gray:: [200,200,200, 255]
352
- #:half_gray:: [128,128,128, 255]
353
- #:half_blue:: [ 0, 0,128, 255]
354
- #:half_green:: [ 0,128, 0, 255]
355
- #:half_red:: [128, 0, 0, 255]
356
- #:half_cyan:: [ 0,128,128, 255]
357
- #:half_purple:: [128, 0,128, 255]
358
- #:half_yellow:: [128,128, 0, 255]
359
- #:dark_gray:: [ 80, 80, 80, 255]
360
- #:dark_blue:: [ 0, 0, 80, 255]
361
- #:dark_green:: [ 0, 80, 0, 255]
362
- #:dark_red:: [ 80, 0, 0, 255]
363
- #:dark_cyan:: [ 0, 80, 80, 255]
364
- #:dark_purple:: [ 80, 0, 80, 255]
365
- #:dark_yellow:: [ 80, 80, 0, 255]
366
- def Color.[](name, alpha = nil)
367
- c = (@@symbol2color[name.to_sym] or raise MiyakoError, "Illegal Color Name! : #{name}")
368
- c[3] = alpha if alpha
369
- return c
370
- end
371
-
372
- #===Color.[]メソッドで使用できるシンボルと色情報との対を登録する
373
- #_name_:: 色に対応させるシンボル
374
- #_value_:: 色情報を示す3〜4要素の配列。3要素のときは4要素目を自動的に追加する
375
- def Color.[]=(name, value)
376
- @@symbol2color[name.to_sym] = value
377
- @@symbol2color[name.to_sym] << 255 if value.length == 3
378
- end
379
-
380
- #===様々な形式のデータを色情報に変換する
381
- #_v_::変換対象のインスタンス。変換可能な内容は以下の一覧参照
382
- #_alpha_::透明度。デフォルトはnil
383
- #
384
- #インスタンス:: 書式
385
- #配列:: 最低3要素の数値の配列
386
- #文字列:: ”#RRGGBB"で示す16進数の文字列、もしくは"red"、"black"など。使える文字列はColor.[]で使えるシンボルに対応
387
- #数値:: 32bitの値を8bitずつ割り当て(aaaaaaaarrrrrrrrggggggggbbbbbbbb)
388
- #シンボル:: Color.[]と同じ
389
- def Color::to_rgb(v, alpha = nil)
390
- c = (v.to_miyako_color or raise MiyakoError, "Illegal parameter")
391
- c[3] = alpha if alpha
392
- return c
393
- end
394
-
395
- #===色情報をColor.[]メソッドで使用できるシンボルと色情報との対を登録する
396
- #_cc_:: 色情報(シンボル、文字列)
397
- #_value_:: 色情報を示す3〜4要素の配列。3要素のときは4要素目を自動的に追加する
398
- def Color::to_s(cc)
399
- c = to_rgb(cc)
400
- return "[#{c[0]},#{c[1]},#{c[2]},#{c[3]}]"
401
- end
402
- end
403
-
404
- #タイマーを管理するクラス
405
- class WaitCounter
406
- SECOND2TICK = 1000
407
-
408
- #WaitCounterインスタンス固有の名前
409
- #デフォルトはインスタンスIDを文字列化したもの
410
- attr_accessor :name
411
-
412
- def WaitCounter.get_second_to_tick(s) #:nodoc:
413
- return (SECOND2TICK * s).to_i
414
- end
415
-
416
- #===インスタンスを生成する
417
- #_seconds_:: タイマーとして設定する秒数(実数で指定可能)
418
- #_name_:: インスタンス固有の名称。デフォルトはnil
419
- #(nilを渡した場合、インスタンスIDを文字列化したものが名称になる)
420
- #返却値:: 生成されたインスタンス
421
- def initialize(seconds, name=nil)
422
- @seconds = seconds
423
- @name = name ? name : __id__.to_s
424
- @wait = WaitCounter.get_second_to_tick(@seconds)
425
- @st = 0
426
- @counting = false
427
- end
428
-
429
- #===設定されているウェイトの長さを求める
430
- #ウェイトの長さをミリセカンド単位で取得する
431
- #返却値:: ウェイトの長さ
432
- def length
433
- return @wait
434
- end
435
-
436
- #===残りウェイトの長さを求める
437
- #タイマー実行中のときウェイトの長さをミリセカンド単位で取得する
438
- #返却値:: 残りウェイトの長さ(実行していない時はウェイトの長さ)
439
- def remind
440
- return @wait unless @counting
441
- cnt = SDL.getTicks - @st
442
- return @wait < cnt ? 0 : @wait - cnt
443
- end
444
-
445
- #===タイマー処理を開始する
446
- #返却値:: 自分自身を返す
447
- def start
448
- @st = SDL.getTicks
449
- @counting = true
450
- return self
451
- end
452
-
453
- #===タイマー処理を停止する
454
- #一旦タイマーを停止すると、復帰できない(一時停止ではない)
455
- #返却値:: 自分自身を返す
456
- def stop
457
- @counting = false
458
- @st = 0
459
- return self
460
- end
461
-
462
- def wait_inner(f) #:nodoc:
463
- return !f unless @counting
464
- t = SDL.getTicks
465
- return f unless (t - @st) >= @wait
466
- @counting = false
467
- return !f
468
- end
469
-
470
- private :wait_inner
471
-
472
- #===タイマー処理中かを返す
473
- #タイマー処理中ならばtrue、停止中ならばfalseを返す
474
- #返却値:: タイマー処理中かどうかを示すフラグ
475
- def waiting?
476
- return wait_inner(true)
477
- end
478
-
479
- #===タイマー処理が終了したかを返す
480
- #タイマー処理が終了したらtrue、処理中ならfalseを返す
481
- #返却値:: タイマー処理が終わったかどうかを示すフラグ
482
- def finish?
483
- return wait_inner(false)
484
- end
485
-
486
- def wait #:nodoc:
487
- st = SDL.getTicks
488
- t = SDL.getTicks
489
- until (t - st) >= @wait do
490
- t = SDL.getTicks
491
- end
492
- return self
493
- end
494
-
495
- #===インスタンスないで所持している領域を開放する
496
- #(現段階ではダミー)
497
- def dispose
498
- end
499
- end
500
- end
501
-
502
- # for duck typing
503
- class Object
504
- def to_miyako_color #:nodoc:
505
- raise Miyako::MiyakoError, "Illegal color parameter class!"
506
- end
507
- end
508
-
509
- class String
510
- def to_miyako_color #:nodoc:
511
- case self
512
- when /\A\[\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*(\d+)\s*\]\z/
513
- #4要素の配列形式
514
- return [$1.to_i, $2.to_i, $3.to_i, $4.to_i]
515
- when /\A\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\z/
516
- #4個の数列形式
517
- return [$1.to_i, $2.to_i, $3.to_i, $4.to_i]
518
- when /\A\#([\da-fA-F]{8})\z/
519
- #HTML形式(#RRGGBBAA)
520
- return [$1[0,2].hex, $1[2,2].hex, $1[4,2].hex, $1[6,2].hex]
521
- when /\A\[\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\]\z/
522
- #3要素の配列形式
523
- return [$1.to_i, $2.to_i, $3.to_i, 255]
524
- when /\A\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\z/
525
- #3個の数列方式
526
- [$1.to_i, $2.to_i, $3.to_i, 255]
527
- when /\A\#([\da-fA-F]{6})\z/
528
- #HTML形式(#RRGGBB)
529
- return [$1[0,2].hex, $1[2,2].hex, $1[4,2].hex, 255]
530
- else return self.to_sym.to_miyako_color
531
- end
532
- end
533
- end
534
-
535
- class Symbol
536
- def to_miyako_color #:nodoc:
537
- return Miyako::Color[self]
538
- end
539
- end
540
-
541
- class Integer
542
- def to_miyako_color #:nodoc:
543
- return [(self >> 16) & 0xff, (self >> 8) & 0xff, self & 0xff, (self >> 24) & 0xff]
544
- end
545
- end
546
-
547
- class Array
548
- def to_miyako_color #:nodoc:
549
- raise Miyako::MiyakoError, "Color Array needs more than 3 elements : #{self.length} elements" if self.length < 3
550
- return (self[0,3] << 255) if self.length == 3
551
- return self[0,4]
552
- end
553
- end
554
-
555
- #=begin rdoc
556
- #==1個のインスタンスでイテレータを実装できるモジュール
557
- #=end
558
- module SingleEnumerable
559
- include Enumerable
560
-
561
- #===ブロックの処理を実行する
562
- #返却値:: 自分自身を返す
563
- def each
564
- yield self
565
- return self
566
- end
567
-
568
- #===sizeメソッドと同様
569
- #返却値:: sizeメソッドと同様
570
- def length
571
- return 1
572
- end
573
- 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
+ #位置変更メソッドを追加
26
+ class PointStruct < Struct
27
+ #===位置を変更する(変化量を指定)
28
+ #ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
29
+ #_dx_:: 移動量(x方向)。単位はピクセル
30
+ #_dy_:: 移動量(y方向)。単位はピクセル
31
+ #返却値:: 自分自身を返す
32
+ def move!(dx, dy)
33
+ end
34
+
35
+ #===位置を変更する(位置指定)
36
+ #ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
37
+ #_x_:: 移動先位置(x方向)。単位はピクセル
38
+ #_y_:: 移動先位置(y方向)。単位はピクセル
39
+ #返却値:: 自分自身を返す
40
+ def move_to!(x, y)
41
+ end
42
+
43
+ #===位置を変更したインスタンスを返す(変化量を指定)
44
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
45
+ #自分自身の値は変わらない
46
+ #_dx_:: 移動量(x方向)。単位はピクセル
47
+ #_dy_:: 移動量(y方向)。単位はピクセル
48
+ #返却値:: 自分自身の複製を更新したインスタンス
49
+ def move(dx, dy)
50
+ self.dup.move!(dx, dy)
51
+ end
52
+
53
+ #===位置を変更したインスタンスを返す(位置指定)
54
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
55
+ #自分自身の値は変わらない
56
+ #_x_:: 移動先位置(x方向)。単位はピクセル
57
+ #_y_:: 移動先位置(y方向)。単位はピクセル
58
+ #返却値:: 自分自身の複製を更新したインスタンス
59
+ def move_to(x, y)
60
+ self.dup.move_to!(x, y)
61
+ end
62
+
63
+ def to_ary #:nodoc:
64
+ [self[0], self[1]]
65
+ end
66
+ end
67
+
68
+ #==サイズ情報のための構造体クラス
69
+ #サイズ変更メソッドを追加
70
+ class SizeStruct < Struct
71
+ #===サイズを変更する(変化量を指定)
72
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
73
+ #_dw_:: 幅変更。単位はピクセル
74
+ #_dh_:: 高さ変更。単位はピクセル
75
+ #返却値:: 自分自身を返す
76
+ def resize!(dw, dh)
77
+ end
78
+
79
+ #===サイズを変更する
80
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
81
+ #_w_:: 幅変更。単位はピクセル
82
+ #_h_:: 高さ変更。単位はピクセル
83
+ #返却値:: 自分自身を返す
84
+ def resize_to!(w, h)
85
+ end
86
+
87
+ #===サイズを変更したインスタンスを返す(変化量を指定)
88
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
89
+ #自分自身の値は変わらない
90
+ #_dw_:: 幅変更。単位はピクセル
91
+ #_dh_:: 高さ変更。単位はピクセル
92
+ #返却値:: 自分自身の複製を更新したインスタンス
93
+ def resize(dw, dh)
94
+ self.dup.resize!(dw,dh)
95
+ end
96
+
97
+ #===サイズを変更したインスタンスを返す
98
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
99
+ #自分自身の値は変わらない
100
+ #_w_:: 幅変更。単位はピクセル
101
+ #_h_:: 高さ変更。単位はピクセル
102
+ #返却値:: 自分自身の複製を更新したインスタンス
103
+ def resize_to(w, h)
104
+ self.dup.resize_to!(w,h)
105
+ end
106
+
107
+ def to_ary #:nodoc:
108
+ [self[0], self[1]]
109
+ end
110
+ end
111
+
112
+ #==矩形情報のための構造体クラス
113
+ #矩形変更メソッドを追加
114
+ class RectStruct < Struct
115
+ #===位置を変更する(変化量を指定)
116
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
117
+ #_dx_:: 移動量(x方向)。単位はピクセル
118
+ #_dy_:: 移動量(y方向)。単位はピクセル
119
+ #返却値:: 自分自身を返す
120
+ def move!(dx, dy)
121
+ end
122
+
123
+ #===位置を変更する(位置指定)
124
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
125
+ #_x_:: 移動先位置(x方向)。単位はピクセル
126
+ #_y_:: 移動先位置(y方向)。単位はピクセル
127
+ #返却値:: 自分自身を返す
128
+ def move_to!(x, y)
129
+ end
130
+
131
+ #===位置を変更したインスタンスを返す(変化量を指定)
132
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
133
+ #自分自身の値は変わらない
134
+ #_dx_:: 移動量(x方向)。単位はピクセル
135
+ #_dy_:: 移動量(y方向)。単位はピクセル
136
+ #返却値:: 自分自身の複製を更新したインスタンス
137
+ def move(dx, dy)
138
+ self.dup.move!(dx, dy)
139
+ end
140
+
141
+ #===位置を変更したインスタンスを返す(位置指定)
142
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
143
+ #自分自身の値は変わらない
144
+ #_x_:: 移動先位置(x方向)。単位はピクセル
145
+ #_y_:: 移動先位置(y方向)。単位はピクセル
146
+ #返却値:: 自分自身の複製を更新したインスタンス
147
+ def move_to(x, y)
148
+ self.dup.move_to!(x, y)
149
+ end
150
+
151
+ #===サイズを変更する(変化量を指定)
152
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
153
+ #_dw_:: 幅変更。単位はピクセル
154
+ #_dh_:: 高さ変更。単位はピクセル
155
+ #返却値:: 自分自身を返す
156
+ def resize!(dw, dh)
157
+ end
158
+
159
+ #===サイズを変更する
160
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
161
+ #_w_:: 幅変更。単位はピクセル
162
+ #_h_:: 高さ変更。単位はピクセル
163
+ #返却値:: 自分自身を返す
164
+ def resize_to!(w, h)
165
+ end
166
+
167
+ #===サイズを変更したインスタンスを返す(変化量を指定)
168
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
169
+ #自分自身の値は変わらない
170
+ #_dw_:: 幅変更。単位はピクセル
171
+ #_dh_:: 高さ変更。単位はピクセル
172
+ #返却値:: 自分自身の複製を更新したインスタンス
173
+ def resize(dw, dh)
174
+ self.dup.resize!(dw,dh)
175
+ end
176
+
177
+ #===サイズを変更したインスタンスを返す
178
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
179
+ #自分自身の値は変わらない
180
+ #_w_:: 幅変更。単位はピクセル
181
+ #_h_:: 高さ変更。単位はピクセル
182
+ #返却値:: 自分自身の複製を更新したインスタンス
183
+ def resize_to(w, h)
184
+ self.dup.resize_to!(w,h)
185
+ end
186
+
187
+ #===指定の座標が矩形の範囲内かを問い合わせる
188
+ #_x_:: 指定のx座標
189
+ #_y_:: 指定のy座標
190
+ #返却値:: 座標が矩形の範囲内ならtrueを返す
191
+ def in_range?(x, y)
192
+ return (x >= self[0] && y >= self[1] && x < self[0] + self[2] && y < self[1] + self[3])
193
+ end
194
+
195
+ #===矩形の左上位置部分のみ返す
196
+ #返却値:: Position構造体のインスタンス
197
+ def pos
198
+ return Position.new(self[0], self[1])
199
+ end
200
+
201
+ #===矩形の大きさのみ返す
202
+ #返却値:: Size構造体のインスタンス
203
+ def size
204
+ return Size.new(self[2], self[3])
205
+ end
206
+
207
+ def to_ary #:nodoc:
208
+ [self[0], self[1], self[2], self[3]]
209
+ end
210
+ end
211
+
212
+ #==Square構造体用クラス
213
+ #位置変更メソッドを追加
214
+ class SquareStruct < Struct
215
+ #===位置を変更する(変化量を指定)
216
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
217
+ #_dx_:: 移動量(x方向)。単位はピクセル
218
+ #_dy_:: 移動量(y方向)。単位はピクセル
219
+ #返却値:: 自分自身を返す
220
+ def move!(dx, dy)
221
+ end
222
+
223
+ #===位置を変更する(位置指定)
224
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
225
+ #_x_:: 移動先位置(x方向)。単位はピクセル
226
+ #_y_:: 移動先位置(y方向)。単位はピクセル
227
+ #返却値:: 自分自身を返す
228
+ def move_to!(x, y)
229
+ end
230
+
231
+ #===位置を変更したインスタンスを返す(変化量を指定)
232
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
233
+ #自分自身の値は変わらない
234
+ #_dx_:: 移動量(x方向)。単位はピクセル
235
+ #_dy_:: 移動量(y方向)。単位はピクセル
236
+ #返却値:: 自分自身の複製を更新したインスタンス
237
+ def move(dx, dy)
238
+ self.dup.move!(dx, dy)
239
+ end
240
+
241
+ #===位置を変更したインスタンスを返す(位置指定)
242
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
243
+ #自分自身の値は変わらない
244
+ #_x_:: 移動先位置(x方向)。単位はピクセル
245
+ #_y_:: 移動先位置(y方向)。単位はピクセル
246
+ #返却値:: 自分自身の複製を更新したインスタンス
247
+ def move_to(x, y)
248
+ self.dup.move_to!(x, y)
249
+ end
250
+
251
+ #===サイズを変更する(変化量を指定)
252
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
253
+ #_dw_:: 幅変更。単位はピクセル
254
+ #_dh_:: 高さ変更。単位はピクセル
255
+ #返却値:: 自分自身を返す
256
+ def resize!(dw, dh)
257
+ end
258
+
259
+ #===サイズを変更する
260
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
261
+ #_w_:: 幅変更。単位はピクセル
262
+ #_h_:: 高さ変更。単位はピクセル
263
+ #返却値:: 自分自身を返す
264
+ def resize_to!(w, h)
265
+ end
266
+
267
+ #===サイズを変更したインスタンスを返す(変化量を指定)
268
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
269
+ #自分自身の値は変わらない
270
+ #_dw_:: 幅変更。単位はピクセル
271
+ #_dh_:: 高さ変更。単位はピクセル
272
+ #返却値:: 自分自身の複製を更新したインスタンス
273
+ def resize(dw, dh)
274
+ self.dup.resize!(dw,dh)
275
+ end
276
+
277
+ #===サイズを変更したインスタンスを返す
278
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
279
+ #自分自身の値は変わらない
280
+ #_w_:: 幅変更。単位はピクセル
281
+ #_h_:: 高さ変更。単位はピクセル
282
+ #返却値:: 自分自身の複製を更新したインスタンス
283
+ def resize_to(w, h)
284
+ self.dup.resize_to!(w,h)
285
+ end
286
+
287
+ #===指定の座標が矩形の範囲内かを問い合わせる
288
+ #_x_:: 指定のx座標
289
+ #_y_:: 指定のy座標
290
+ #返却値:: 座標が矩形の範囲内ならtrueを返す
291
+ def in_range?(x, y)
292
+ return (x >= self[0] && y >= self[1] && x <= self[2] && y <= self[3])
293
+ end
294
+
295
+ #===矩形の左上位置部分のみ返す
296
+ #返却値:: Position構造体のインスタンス
297
+ def pos
298
+ return Position.new(self[0], self[1])
299
+ end
300
+
301
+ #===矩形の大きさのみ返す
302
+ #返却値:: Size構造体のインスタンス
303
+ def size
304
+ return Size.new(self[2]-self[0]+1, self[3]-self[1]+1)
305
+ end
306
+
307
+ def to_ary #:nodoc:
308
+ [self[0], self[1], self[2], self[3]]
309
+ end
310
+ end
311
+
312
+ #==線分の区間情報のための構造体クラス
313
+ #位置変更メソッドを追加
314
+ class SegmentStruct < Struct
315
+ #===Segment構造体インスタンスを生成する
316
+ # 入力した矩形情報(Rect構造体、[x,y,w,h]で表される配列)から、構造体インスタンスを生成する
317
+ #_rect_:: 算出に使用する矩形情報
318
+ #返却値:: 生成したインスタンスを返す
319
+ def SegmentStruct.create(rect)
320
+ return Segment.new([rect[0], rect[0] + rect[2] - 1],
321
+ [rect[1], rect[1] + rect[3] - 1])
322
+ end
323
+
324
+ #===位置を変更する(変化量を指定)
325
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
326
+ #_dx_:: 移動量(x方向)。単位はピクセル
327
+ #_dy_:: 移動量(y方向)。単位はピクセル
328
+ #返却値:: 自分自身を返す
329
+ def move!(dx, dy)
330
+ end
331
+
332
+ #===位置を変更する(位置指定)
333
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
334
+ #_x_:: 移動先位置(x方向)。単位はピクセル
335
+ #_y_:: 移動先位置(y方向)。単位はピクセル
336
+ #返却値:: 自分自身を返す
337
+ def move_to!(x, y)
338
+ end
339
+
340
+ #===位置を変更したインスタンスを返す(変化量を指定)
341
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
342
+ #自分自身の値は変わらない
343
+ #_dx_:: 移動量(x方向)。単位はピクセル
344
+ #_dy_:: 移動量(y方向)。単位はピクセル
345
+ #返却値:: 自分自身の複製を更新したインスタンス
346
+ def move(dx, dy)
347
+ self.dup.move!(dx, dy)
348
+ end
349
+
350
+ #===位置を変更したインスタンスを返す(位置指定)
351
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
352
+ #自分自身の値は変わらない
353
+ #_x_:: 移動先位置(x方向)。単位はピクセル
354
+ #_y_:: 移動先位置(y方向)。単位はピクセル
355
+ #返却値:: 自分自身の複製を更新したインスタンス
356
+ def move_to(x, y)
357
+ self.dup.move_to!(x, y)
358
+ end
359
+
360
+ #===サイズを変更する(変化量を指定)
361
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
362
+ #_dw_:: 幅変更。単位はピクセル
363
+ #_dh_:: 高さ変更。単位はピクセル
364
+ #返却値:: 自分自身を返す
365
+ def resize!(dw, dh)
366
+ end
367
+
368
+ #===サイズを変更する
369
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
370
+ #_w_:: 幅変更。単位はピクセル
371
+ #_h_:: 高さ変更。単位はピクセル
372
+ #返却値:: 自分自身を返す
373
+ def resize_to!(w, h)
374
+ end
375
+
376
+ #===サイズを変更したインスタンスを返す(変化量を指定)
377
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
378
+ #自分自身の値は変わらない
379
+ #_dw_:: 幅変更。単位はピクセル
380
+ #_dh_:: 高さ変更。単位はピクセル
381
+ #返却値:: 自分自身の複製を更新したインスタンス
382
+ def resize(dw, dh)
383
+ self.dup.resize!(dw,dh)
384
+ end
385
+
386
+ #===サイズを変更したインスタンスを返す
387
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
388
+ #自分自身の値は変わらない
389
+ #_w_:: 幅変更。単位はピクセル
390
+ #_h_:: 高さ変更。単位はピクセル
391
+ #返却値:: 自分自身の複製を更新したインスタンス
392
+ def resize_to(w, h)
393
+ self.dup.resize_to!(w,h)
394
+ end
395
+
396
+ #===x座標の線分を返す
397
+ #(例)segment = (x:[10,20],y:[100,200])
398
+ # segment.x => [10,20]
399
+ #返却値:: [min_x,min_y]の配列
400
+ def x
401
+ self[0]
402
+ end
403
+
404
+ #===y座標の線分を返す
405
+ #(例)segment = (x:[10,20],y:[100,200])
406
+ # segment.y => [100,200]
407
+ #返却値:: [min_y,min_y]の配列
408
+ def y
409
+ self[1]
410
+ end
411
+
412
+ #===x座標の線分()を返す
413
+ #(例)segment = (x:[10,20],y:[100,200])
414
+ # segment.min_x => 10
415
+ #返却値:: 線分の小さい方の値
416
+ def min_x
417
+ self[0][0]
418
+ end
419
+
420
+ #===x座標の線分(大)を返す
421
+ #(例)segment = (x:[10,20],y:[100,200])
422
+ # segment.max_x => 20
423
+ #返却値:: 線分の大きい方の値
424
+ def max_x
425
+ self[0][1]
426
+ end
427
+
428
+ #===y座標の線分(小)を返す
429
+ #(例)segment = (x:[10,20],y:[100,200])
430
+ # segment.min_y => 100
431
+ #返却値:: 線分の小さい方の値
432
+ def min_y
433
+ self[1][0]
434
+ end
435
+
436
+ #===y座標の線分(大)を返す
437
+ #(例)segment = (x:[10,20],y:[100,200])
438
+ # segment.max_y => 200
439
+ #返却値:: 線分の大きい方の値
440
+ def max_y
441
+ self[1][1]
442
+ end
443
+
444
+ def reset!(min_x, max_x, min_y, max_y) #:nodoc:
445
+ self[0][0], self[0][1], self[1][0], self[1][1] = min_x, max_x, min_y, max_y
446
+ end
447
+
448
+ def to_ary #:nodoc:
449
+ [[self[0][0], self[0][1]], [self[1][0], self[1][0]]]
450
+ end
451
+
452
+ #===小線分を移動させたとき、大線分が範囲内かどうかを判別する
453
+ # 移動後の小線分が大線分の範囲内にあるかどうかをtrue/falseで取得する
454
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
455
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
456
+ #_d_:: selfの移動量
457
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
458
+ #返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
459
+ def in_bounds?(idx, big_segment, d, flag = false)
460
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
461
+ nx = self[idx][0] + d
462
+ nx2 = self[idx][1] + d
463
+ nx, nx2 = nx2, nx if nx > nx2
464
+ return flag ?
465
+ (nx >= big_segment[idx][0] && nx2 <= big_segment[idx][1]) :
466
+ (nx > big_segment[idx][0] && (nx2 - 1) < big_segment[idx][1])
467
+ end
468
+
469
+ #===小線分を移動させたとき、大線分が範囲内かどうかを判別して、その状態によって値を整数で返す
470
+ # 移動後の小線分の範囲が大線分の範囲内のときは0、
471
+ # マイナス方向で範囲外に出るときは-1、
472
+ # プラス方向で出るときは1を返す
473
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
474
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
475
+ #_d_:: selfの移動量
476
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
477
+ #返却値:: 判別の結果
478
+ def in_bounds_ex?(idx, big_segment, d, flag = false)
479
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
480
+ nx = self[idx][0] + d
481
+ nx2 = self[idx][1] + d - 1
482
+ nx, nx2 = nx2, nx if nx > nx2
483
+ return -1 if (nx < big_segment[idx][0]) || (flag && (nx == big_segment[idx][0]))
484
+ return (nx2 > big_segment[idx][1]) || (flag && (nx2 == big_segment[idx][1])) ? 1 : 0
485
+ end
486
+
487
+ #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
488
+ # 移動後の小線分の範囲が大線分の範囲内のときは0、
489
+ # マイナス方向で範囲外に出るときは1、
490
+ # プラス方向で出るときは-1を返す
491
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
492
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
493
+ #_d_:: selfの移動量
494
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
495
+ #返却値:: 判別の結果
496
+ def in_bounds_rev?(idx, big_segment, d, flag = false)
497
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
498
+ nx = self[idx][0] + d
499
+ nx2 = self[idx][1] + d - 1
500
+ nx, nx2 = nx2, nx if nx > nx2
501
+ return 1 if (nx < big_segment[idx][0]) || (flag && (nx == big_segment[idx][0]))
502
+ return (nx2 > big_segment[idx][1]) || (flag && (nx2 == big_segment[idx][1])) ? -1 : 0
503
+ end
504
+
505
+ #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
506
+ # 移動量が0のときは0、
507
+ # 移動後の小線分の範囲が大線分の範囲内のときは1、
508
+ # 範囲外に出るときは-1を返す
509
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
510
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
511
+ #_d_:: selfの移動量
512
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
513
+ #返却値:: 判別の結果
514
+ def in_bounds_rev_ex?(idx, big_segment, d, flag = false)
515
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
516
+ return 0 if d == 0
517
+ dir = (d <=> 0)
518
+ nx = self[idx][0] + d
519
+ nx2 = self[idx][1] + d - 1
520
+ nx, nx2 = nx2, nx if nx > nx2
521
+ return -dir if (nx < big_segment[idx][0]) || (flag && (nx == big_segment[idx][0]))
522
+ return (nx2 > big_segment[idx][1]) || (flag && (nx2 == big_segment[idx][1])) ? -dir : dir
523
+ end
524
+ end
525
+
526
+ #==座標などを構成するために使用する構造体
527
+ #_x_:: X座標の値
528
+ #_y_:: Y座標の値
529
+ Point = PointStruct.new(:x, :y)
530
+
531
+ #==サイズなどを構成するために使用する構造体
532
+ #_w_:: 横幅
533
+ #_h_:: 高さ
534
+ Size = SizeStruct.new(:w, :h)
535
+
536
+ #==矩形などを構成するために使用する構造体
537
+ #_x_:: X座標の値
538
+ #_y_:: Y座標の値
539
+ #_w_:: 横幅
540
+ #_h_:: 高さ
541
+ Rect = RectStruct.new(:x, :y, :w, :h)
542
+
543
+ #==矩形などを構成するために使用する構造体
544
+ #_left_:: 左上X座標の値
545
+ #_top_:: 左上Y座標の値
546
+ #_right_:: 右下X座標の値
547
+ #_bottom_:: 右下Y座標の値
548
+ Square = SquareStruct.new(:left, :top, :right, :bottom)
549
+
550
+ #==線分を構成するために使用する構造体
551
+ #_x_:: X方向の線分([min_x, max_x]で構成される配列)
552
+ #_y_:: Y方向の線分([min_y, max_y]で構成される配列)
553
+ Segment = SegmentStruct.new(:x, :y)
554
+
555
+ #==色を管理するクラス
556
+ #
557
+ #色情報は、[r(赤),g(緑),b(青),a(透明度)]、[r,g,b,a(透明度)]の2種類の配列
558
+ #
559
+ #それぞれの要素の値は0〜255の範囲
560
+ #
561
+ #4要素必要な色情報に3要素の配列を渡すと、自動的に4要素目(値は255)が挿入される
562
+ #
563
+ #(注)本クラスで採用する透明度と、画像が持つ透明度とは別物
564
+ class Color
565
+ @@symbol2color = {:black => [ 0, 0, 0, 255],
566
+ :white => [255,255,255, 255],
567
+ :blue => [ 0, 0,255, 255],
568
+ :green => [ 0,255, 0, 255],
569
+ :red => [255, 0, 0, 255],
570
+ :cyan => [ 0,255,255, 255],
571
+ :purple => [255, 0,255, 255],
572
+ :yellow => [255,255, 0, 255],
573
+ :light_gray => [200,200,200, 255],
574
+ :half_gray => [128,128,128, 255],
575
+ :half_blue => [ 0, 0,128, 255],
576
+ :half_green => [ 0,128, 0, 255],
577
+ :half_red => [128, 0, 0, 255],
578
+ :half_cyan => [ 0,128,128, 255],
579
+ :half_purple => [128, 0,128, 255],
580
+ :half_yellow => [128,128, 0, 255],
581
+ :dark_gray => [ 80, 80, 80, 255],
582
+ :dark_blue => [ 0, 0, 80, 255],
583
+ :dark_green => [ 0, 80, 0, 255],
584
+ :dark_red => [ 80, 0, 0, 255],
585
+ :dark_cyan => [ 0, 80, 80, 255],
586
+ :dark_purple => [ 80, 0, 80, 255],
587
+ :dark_yellow => [ 80, 80, 0, 255]}
588
+ @@symbol2color.default = nil
589
+
590
+ #===シンボルから色情報を取得する
591
+ #_name_::色に対応したシンボル(以下の一覧参照)。存在しないシンボルを渡したときはエラーを返す
592
+ #返却値::シンボルに対応した4要素の配列
593
+ #
594
+ #シンボル:: 色配列([赤,緑,青,透明度])
595
+ #:black:: [ 0, 0, 0, 255]
596
+ #:white:: [255,255,255, 255]
597
+ #:blue:: [ 0, 0,255, 255]
598
+ #:green:: [ 0,255, 0, 255]
599
+ #:red:: [255, 0, 0, 255]
600
+ #:cyan:: [ 0,255,255, 255]
601
+ #:purple:: [255, 0,255, 255]
602
+ #:yellow:: [255,255, 0, 255]
603
+ #:light_gray:: [200,200,200, 255]
604
+ #:half_gray:: [128,128,128, 255]
605
+ #:half_blue:: [ 0, 0,128, 255]
606
+ #:half_green:: [ 0,128, 0, 255]
607
+ #:half_red:: [128, 0, 0, 255]
608
+ #:half_cyan:: [ 0,128,128, 255]
609
+ #:half_purple:: [128, 0,128, 255]
610
+ #:half_yellow:: [128,128, 0, 255]
611
+ #:dark_gray:: [ 80, 80, 80, 255]
612
+ #:dark_blue:: [ 0, 0, 80, 255]
613
+ #:dark_green:: [ 0, 80, 0, 255]
614
+ #:dark_red:: [ 80, 0, 0, 255]
615
+ #:dark_cyan:: [ 0, 80, 80, 255]
616
+ #:dark_purple:: [ 80, 0, 80, 255]
617
+ #:dark_yellow:: [ 80, 80, 0, 255]
618
+ def Color.[](name, alpha = nil)
619
+ c = (@@symbol2color[name.to_sym] or raise MiyakoError, "Illegal Color Name! : #{name}")
620
+ c[3] = alpha if alpha
621
+ return c
622
+ end
623
+
624
+ #===Color.[]メソッドで使用できるシンボルと色情報との対を登録する
625
+ #_name_:: 色に対応させるシンボル
626
+ #_value_:: 色情報を示す3〜4要素の配列。3要素のときは4要素目を自動的に追加する
627
+ def Color.[]=(name, value)
628
+ @@symbol2color[name.to_sym] = value
629
+ @@symbol2color[name.to_sym] << 255 if value.length == 3
630
+ end
631
+
632
+ #===様々な形式のデータを色情報に変換する
633
+ #_v_::変換対象のインスタンス。変換可能な内容は以下の一覧参照
634
+ #_alpha_::透明度。デフォルトはnil
635
+ #
636
+ #インスタンス:: 書式
637
+ #配列:: 最低3要素の数値の配列
638
+ #文字列:: ”#RRGGBB"で示す16進数の文字列、もしくは"red"、"black"など。使える文字列はColor.[]で使えるシンボルに対応
639
+ #数値:: 32bitの値を8bitずつ割り当て(aaaaaaaarrrrrrrrggggggggbbbbbbbb)
640
+ #シンボル:: Color.[]と同じ
641
+ def Color::to_rgb(v, alpha = nil)
642
+ c = (v.to_miyako_color or raise MiyakoError, "Illegal parameter")
643
+ c[3] = alpha if alpha
644
+ return c
645
+ end
646
+
647
+ #===色情報をColor.[]メソッドで使用できるシンボルと色情報との対を登録する
648
+ #_cc_:: 色情報(シンボル、文字列)
649
+ #_value_:: 色情報を示す3〜4要素の配列。3要素のときは4要素目を自動的に追加する
650
+ def Color::to_s(cc)
651
+ c = to_rgb(cc)
652
+ return "[#{c[0]},#{c[1]},#{c[2]},#{c[3]}]"
653
+ end
654
+ end
655
+
656
+ #タイマーを管理するクラス
657
+ class WaitCounter
658
+ SECOND2TICK = 1000
659
+
660
+ #WaitCounterインスタンス固有の名前
661
+ #デフォルトはインスタンスIDを文字列化したもの
662
+ attr_accessor :name
663
+
664
+ def WaitCounter.get_second_to_tick(s) #:nodoc:
665
+ return (SECOND2TICK * s).to_i
666
+ end
667
+
668
+ #===インスタンスを生成する
669
+ #_seconds_:: タイマーとして設定する秒数(実数で指定可能)
670
+ #_name_:: インスタンス固有の名称。デフォルトはnil
671
+ #(nilを渡した場合、インスタンスIDを文字列化したものが名称になる)
672
+ #返却値:: 生成されたインスタンス
673
+ def initialize(seconds, name=nil)
674
+ @seconds = seconds
675
+ @name = name ? name : __id__.to_s
676
+ @wait = WaitCounter.get_second_to_tick(@seconds)
677
+ @st = 0
678
+ @counting = false
679
+ end
680
+
681
+ #===設定されているウェイトの長さを求める
682
+ #ウェイトの長さをミリセカンド単位で取得する
683
+ #返却値:: ウェイトの長さ
684
+ def length
685
+ return @wait
686
+ end
687
+
688
+ #===残りウェイトの長さを求める
689
+ #タイマー実行中のときウェイトの長さをミリセカンド単位で取得する
690
+ #返却値:: 残りウェイトの長さ(実行していない時はウェイトの長さ)
691
+ def remind
692
+ return @wait unless @counting
693
+ cnt = SDL.getTicks - @st
694
+ return @wait < cnt ? 0 : @wait - cnt
695
+ end
696
+
697
+ #===タイマー処理を開始する
698
+ #返却値:: 自分自身を返す
699
+ def start
700
+ @st = SDL.getTicks
701
+ @counting = true
702
+ return self
703
+ end
704
+
705
+ #===タイマー処理を停止する
706
+ #一旦タイマーを停止すると、復帰できない(一時停止ではない)
707
+ #返却値:: 自分自身を返す
708
+ def stop
709
+ @counting = false
710
+ @st = 0
711
+ return self
712
+ end
713
+
714
+ def wait_inner(f) #:nodoc:
715
+ return !f unless @counting
716
+ t = SDL.getTicks
717
+ return f unless (t - @st) >= @wait
718
+ @counting = false
719
+ return !f
720
+ end
721
+
722
+ private :wait_inner
723
+
724
+ #===タイマー処理中かを返す
725
+ #タイマー処理中ならばtrue、停止中ならばfalseを返す
726
+ #返却値:: タイマー処理中かどうかを示すフラグ
727
+ def waiting?
728
+ return wait_inner(true)
729
+ end
730
+
731
+ #===タイマー処理が終了したかを返す
732
+ #タイマー処理が終了したらtrue、処理中ならfalseを返す
733
+ #返却値:: タイマー処理が終わったかどうかを示すフラグ
734
+ def finish?
735
+ return wait_inner(false)
736
+ end
737
+
738
+ def wait #:nodoc:
739
+ st = SDL.getTicks
740
+ t = SDL.getTicks
741
+ until (t - st) >= @wait do
742
+ t = SDL.getTicks
743
+ end
744
+ return self
745
+ end
746
+
747
+ #===インスタンスないで所持している領域を開放する
748
+ #(現段階ではダミー)
749
+ def dispose
750
+ end
751
+ end
752
+ end
753
+
754
+ # for duck typing
755
+ class Object
756
+ def to_miyako_color #:nodoc:
757
+ raise Miyako::MiyakoError, "Illegal color parameter class!"
758
+ end
759
+ end
760
+
761
+ class String
762
+ def to_miyako_color #:nodoc:
763
+ case self
764
+ when /\A\[\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*(\d+)\s*\]\z/
765
+ #4要素の配列形式
766
+ return [$1.to_i, $2.to_i, $3.to_i, $4.to_i]
767
+ when /\A\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\z/
768
+ #4個の数列形式
769
+ return [$1.to_i, $2.to_i, $3.to_i, $4.to_i]
770
+ when /\A\#([\da-fA-F]{8})\z/
771
+ #HTML形式(#RRGGBBAA)
772
+ return [$1[0,2].hex, $1[2,2].hex, $1[4,2].hex, $1[6,2].hex]
773
+ when /\A\[\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\]\z/
774
+ #3要素の配列形式
775
+ return [$1.to_i, $2.to_i, $3.to_i, 255]
776
+ when /\A\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\z/
777
+ #3個の数列方式
778
+ [$1.to_i, $2.to_i, $3.to_i, 255]
779
+ when /\A\#([\da-fA-F]{6})\z/
780
+ #HTML形式(#RRGGBB)
781
+ return [$1[0,2].hex, $1[2,2].hex, $1[4,2].hex, 255]
782
+ else return self.to_sym.to_miyako_color
783
+ end
784
+ end
785
+ end
786
+
787
+ class Symbol
788
+ def to_miyako_color #:nodoc:
789
+ return Miyako::Color[self]
790
+ end
791
+ end
792
+
793
+ class Integer
794
+ def to_miyako_color #:nodoc:
795
+ return [(self >> 16) & 0xff, (self >> 8) & 0xff, self & 0xff, (self >> 24) & 0xff]
796
+ end
797
+ end
798
+
799
+ class Array
800
+ def to_miyako_color #:nodoc:
801
+ raise Miyako::MiyakoError, "Color Array needs more than 3 elements : #{self.length} elements" if self.length < 3
802
+ return (self[0,3] << 255) if self.length == 3
803
+ return self[0,4]
804
+ end
805
+ end
806
+
807
+ #=begin rdoc
808
+ #==1個のインスタンスでイテレータを実装できるモジュール
809
+ #=end
810
+ module SingleEnumerable
811
+ include Enumerable
812
+
813
+ #===ブロックの処理を実行する
814
+ #返却値:: 自分自身を返す
815
+ def each
816
+ yield self
817
+ return self
818
+ end
819
+
820
+ #===sizeメソッドと同様
821
+ #返却値:: sizeメソッドと同様
822
+ def length
823
+ return 1
824
+ end
825
+ end