ruby-miyako-mswin32 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 (148) hide show
  1. data/README +1115 -0
  2. data/img/cursor.png +0 -0
  3. data/img/cursors.png +0 -0
  4. data/img/dice.png +0 -0
  5. data/img/wait_cursor.png +0 -0
  6. data/img/win_base.png +0 -0
  7. data/img/window.png +0 -0
  8. data/install_miyako.rb +87 -0
  9. data/lib/Miyako/API/audio.rb +584 -0
  10. data/lib/Miyako/API/basic_data.rb +1026 -0
  11. data/lib/Miyako/API/bitmap.rb +534 -0
  12. data/lib/Miyako/API/choices.rb +481 -0
  13. data/lib/Miyako/API/collision.rb +638 -0
  14. data/lib/Miyako/API/diagram.rb +586 -0
  15. data/lib/Miyako/API/drawing.rb +151 -0
  16. data/lib/Miyako/API/exceptions.rb +105 -0
  17. data/lib/Miyako/API/fixedmap.rb +462 -0
  18. data/lib/Miyako/API/font.rb +430 -0
  19. data/lib/Miyako/API/input.rb +456 -0
  20. data/lib/Miyako/API/layout.rb +644 -0
  21. data/lib/Miyako/API/map.rb +583 -0
  22. data/lib/Miyako/API/map_event.rb +222 -0
  23. data/lib/Miyako/API/modules.rb +357 -0
  24. data/lib/Miyako/API/movie.rb +166 -0
  25. data/lib/Miyako/API/parts.rb +188 -0
  26. data/lib/Miyako/API/plane.rb +205 -0
  27. data/lib/Miyako/API/screen.rb +341 -0
  28. data/lib/Miyako/API/shape.rb +443 -0
  29. data/lib/Miyako/API/sprite.rb +773 -0
  30. data/lib/Miyako/API/sprite_animation.rb +494 -0
  31. data/lib/Miyako/API/sprite_list.rb +1135 -0
  32. data/lib/Miyako/API/spriteunit.rb +168 -0
  33. data/lib/Miyako/API/story.rb +350 -0
  34. data/lib/Miyako/API/textbox.rb +773 -0
  35. data/lib/Miyako/API/utility.rb +419 -0
  36. data/lib/Miyako/API/viewport.rb +190 -0
  37. data/lib/Miyako/API/yuki.rb +1180 -0
  38. data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
  39. data/lib/Miyako/EXT/raster_scroll.rb +138 -0
  40. data/lib/Miyako/EXT/slides.rb +157 -0
  41. data/lib/Miyako/miyako.rb +201 -0
  42. data/lib/Miyako/miyako_no_katana.so +0 -0
  43. data/lib/Miyako/miyako_require_only.rb +35 -0
  44. data/logo/EGSR_logo.png +0 -0
  45. data/logo/EGSR_logo_bg.png +0 -0
  46. data/logo/EGSR_logo_fg.png +0 -0
  47. data/logo/EGSR_title_banner.png +0 -0
  48. data/logo/EGSR_title_logo.png +0 -0
  49. data/logo/miyako.png +0 -0
  50. data/logo/miyako_banner.png +0 -0
  51. data/logo/space.png +0 -0
  52. data/sample/Animation1/m1ku.rb +68 -0
  53. data/sample/Animation1/m1ku_arm_0.png +0 -0
  54. data/sample/Animation1/m1ku_arm_1.png +0 -0
  55. data/sample/Animation1/m1ku_arm_2.png +0 -0
  56. data/sample/Animation1/m1ku_arm_3.png +0 -0
  57. data/sample/Animation1/m1ku_back.jpg +0 -0
  58. data/sample/Animation1/m1ku_body.png +0 -0
  59. data/sample/Animation1/m1ku_eye_0.png +0 -0
  60. data/sample/Animation1/m1ku_eye_1.png +0 -0
  61. data/sample/Animation1/m1ku_eye_2.png +0 -0
  62. data/sample/Animation1/m1ku_eye_3.png +0 -0
  63. data/sample/Animation1/m1ku_hair_front.png +0 -0
  64. data/sample/Animation1/m1ku_hair_rear.png +0 -0
  65. data/sample/Animation1/readme.txt +72 -0
  66. data/sample/Animation2/lex.rb +96 -0
  67. data/sample/Animation2/lex_back.png +0 -0
  68. data/sample/Animation2/lex_body.png +0 -0
  69. data/sample/Animation2/lex_roadroller.png +0 -0
  70. data/sample/Animation2/lex_wheel_0.png +0 -0
  71. data/sample/Animation2/lex_wheel_1.png +0 -0
  72. data/sample/Animation2/lex_wheel_2.png +0 -0
  73. data/sample/Animation2/readme.txt +72 -0
  74. data/sample/Animation2/song_title.png +0 -0
  75. data/sample/Diagram_sample/back.png +0 -0
  76. data/sample/Diagram_sample/chr01.png +0 -0
  77. data/sample/Diagram_sample/chr02.png +0 -0
  78. data/sample/Diagram_sample/cursor.png +0 -0
  79. data/sample/Diagram_sample/diagram_sample_yuki2.rb +329 -0
  80. data/sample/Diagram_sample/readme.txt +90 -0
  81. data/sample/Diagram_sample/wait_cursor.png +0 -0
  82. data/sample/Room3/blue.rb +297 -0
  83. data/sample/Room3/ending.rb +180 -0
  84. data/sample/Room3/green.rb +220 -0
  85. data/sample/Room3/image/akamatsu.png +0 -0
  86. data/sample/Room3/image/aoyama.png +0 -0
  87. data/sample/Room3/image/congra.png +0 -0
  88. data/sample/Room3/image/congratulation.png +0 -0
  89. data/sample/Room3/image/congratulation_bg.png +0 -0
  90. data/sample/Room3/image/cursor.png +0 -0
  91. data/sample/Room3/image/midori.png +0 -0
  92. data/sample/Room3/image/mittsu_no_oheya.png +0 -0
  93. data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
  94. data/sample/Room3/image/room_blue.png +0 -0
  95. data/sample/Room3/image/room_green.png +0 -0
  96. data/sample/Room3/image/room_red.png +0 -0
  97. data/sample/Room3/image/start.png +0 -0
  98. data/sample/Room3/image/three_doors.png +0 -0
  99. data/sample/Room3/image/wait_cursor.png +0 -0
  100. data/sample/Room3/main.rb +120 -0
  101. data/sample/Room3/main_component.rb +59 -0
  102. data/sample/Room3/readme.txt +76 -0
  103. data/sample/Room3/red.rb +227 -0
  104. data/sample/Room3/room3.rb +25 -0
  105. data/sample/Room3/title.rb +184 -0
  106. data/sample/ball_action_sample.rb +204 -0
  107. data/sample/blit_rop.rb +70 -0
  108. data/sample/cairo_sample.rb +25 -0
  109. data/sample/circle_collision_test.rb +66 -0
  110. data/sample/collision_test.rb +33 -0
  111. data/sample/collision_test2.rb +108 -0
  112. data/sample/fixed_map_test/cursor.png +0 -0
  113. data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
  114. data/sample/fixed_map_test/map.csv +19 -0
  115. data/sample/fixed_map_test/map_01.png +0 -0
  116. data/sample/fixed_map_test/mapchip.csv +23 -0
  117. data/sample/fixed_map_test/monster.png +0 -0
  118. data/sample/fixed_map_test/readme.txt +72 -0
  119. data/sample/map_test/chara.rb +58 -0
  120. data/sample/map_test/chr1.png +0 -0
  121. data/sample/map_test/cursor.png +0 -0
  122. data/sample/map_test/main_parts.rb +69 -0
  123. data/sample/map_test/main_scene.rb +153 -0
  124. data/sample/map_test/map.png +0 -0
  125. data/sample/map_test/map2.png +0 -0
  126. data/sample/map_test/map_layer.csv +127 -0
  127. data/sample/map_test/map_manager.rb +75 -0
  128. data/sample/map_test/map_test.rb +23 -0
  129. data/sample/map_test/mapchip.csv +21 -0
  130. data/sample/map_test/oasis.rb +71 -0
  131. data/sample/map_test/readme.txt +89 -0
  132. data/sample/map_test/route.rb +157 -0
  133. data/sample/map_test/sea.png +0 -0
  134. data/sample/map_test/town.rb +74 -0
  135. data/sample/map_test/wait_cursor.png +0 -0
  136. data/sample/map_test/window.png +0 -0
  137. data/sample/polygon_test.rb +35 -0
  138. data/sample/rasterscroll.rb +25 -0
  139. data/sample/takahashi.rb +42 -0
  140. data/sample/text.png +0 -0
  141. data/sample/textbox_sample.rb +190 -0
  142. data/sample/transform.rb +54 -0
  143. data/sample/utility_test.rb +73 -0
  144. data/sample/utility_test2.rb +61 -0
  145. data/sample/utility_test3.rb +64 -0
  146. data/sample/utility_test4.rb +73 -0
  147. data/uninstall_miyako.rb +19 -0
  148. metadata +199 -0
@@ -0,0 +1,1026 @@
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 Point.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 Point.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
+
316
+ #===レシーバがotherの範囲内かどうかを求める
317
+ #最小数・最大数ともにotherの範囲内かどうかを確認する
318
+ #_other_:: 比較対象の線分
319
+ #返却値:: 最小値・最大値ともにotherの範囲内ならばtrueを返す
320
+ def between?(other)
321
+ return self[0] >= other[0] && self[1] <= other[1]
322
+ end
323
+
324
+ #===otherがレシーバの範囲内かどうかを求める
325
+ #最小数・最大数ともにotherの範囲外かどうかを確認する
326
+ #_other_:: 比較対象の線分
327
+ #返却値:: 最小値・最大値ともにotherの範囲外ならばtrueを返す
328
+ def covers?(other)
329
+ return self[0] <= other[0] && self[1] >= other[1]
330
+ end
331
+
332
+ #===レシーバがotherの範囲と重なっているかどうかを求める
333
+ #最小数・最大数のどちらかがotherの範囲内かどうかを確認する
334
+ #_other_:: 比較対象の線分
335
+ #返却値:: 最小値・最大値のどちらかがotherの範囲内ならばtrueを返す
336
+ def collision?(other)
337
+ return (self[0] >= other[0] && self[0] <= other[1]) || (self[1] >= other[0] && self[1] <= other[1])
338
+ end
339
+
340
+ #===線分の大きさを求める
341
+ #max - min + 1 の値を求めて返す
342
+ #返却値:: 線分の大きさ
343
+ def size
344
+ self[1] - self[0] + 1
345
+ end
346
+
347
+ #===位置を変更する(変化量を指定)
348
+ #_d_:: 移動量
349
+ #返却値:: 自分自身を返す
350
+ def move!(d)
351
+ self[0] += d
352
+ self[1] += d
353
+ return self
354
+ end
355
+
356
+ #===位置を変更する(位置指定)
357
+ #_v_:: 移動先位置。単位はピクセル
358
+ #返却値:: 自分自身を返す
359
+ def move_to!(v)
360
+ self[1] = self[1] - self[0] + v
361
+ self[0] = v
362
+ return self
363
+ end
364
+
365
+ #===位置を変更したインスタンスを返す(変化量を指定)
366
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
367
+ #自分自身の値は変わらない
368
+ #_d_:: 移動量
369
+ #返却値:: 自分自身の複製を更新したインスタンス
370
+ def move(d)
371
+ return self.dup.move!(d)
372
+ end
373
+
374
+ #===位置を変更したインスタンスを返す(位置指定)
375
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
376
+ #自分自身の値は変わらない
377
+ #_v_:: 移動先位置。単位はピクセル
378
+ #返却値:: 自分自身の複製を更新したインスタンス
379
+ def move_to(v)
380
+ return self.dup.move_to!(v)
381
+ end
382
+
383
+ #===幅を変更する(変化量を指定)
384
+ #_d_:: 変更量。単位はピクセル
385
+ #返却値:: 自分自身を返す
386
+ def resize!(d)
387
+ self[1] += d
388
+ return self
389
+ end
390
+
391
+ #===幅を変更する
392
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
393
+ #_v_:: 変更後の幅。単位はピクセル
394
+ #返却値:: 自分自身を返す
395
+ def resize_to!(v)
396
+ self[1] = self[0] + v - 1
397
+ return self
398
+ end
399
+
400
+ #===サイズを変更したインスタンスを返す(変化量を指定)
401
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
402
+ #自分自身の値は変わらない
403
+ #_d_:: 変更量。単位はピクセル
404
+ #返却値:: 自分自身の複製を更新したインスタンス
405
+ def resize(d)
406
+ self.dup.resize!(d)
407
+ end
408
+
409
+ #===サイズを変更したインスタンスを返す
410
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
411
+ #自分自身の値は変わらない
412
+ #_v_:: 変更後の幅。単位はピクセル
413
+ #返却値:: 自分自身の複製を更新したインスタンス
414
+ def resize_to(v)
415
+ self.dup.resize_to!(v)
416
+ end
417
+
418
+ def reset!(min, max) #:nodoc:
419
+ self[0], self[1] = min, max
420
+ end
421
+
422
+ def to_ary #:nodoc:
423
+ [self[0], self[1]]
424
+ end
425
+
426
+ #===小線分を移動させたとき、大線分が範囲内かどうかを判別する
427
+ # 移動後の小線分が大線分の範囲内にあるかどうかをtrue/falseで取得する
428
+ #_big_segment_:: 大線分の範囲。Segment構造体、もしくは[min,max]で構成された配列
429
+ #_d_:: selfの移動量
430
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
431
+ #返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
432
+ def in_bounds?(big_segment, d, flag = false)
433
+ nx = self[0] + d
434
+ nx2 = self[1] + d
435
+ nx, nx2 = nx2, nx if nx > nx2
436
+ return flag ?
437
+ (nx >= big_segment[0] && nx2 <= big_segment[1]) :
438
+ (nx > big_segment[0] && (nx2 - 1) < big_segment[1])
439
+ end
440
+
441
+ #===小線分を移動させたとき、大線分が範囲内かどうかを判別して、その状態によって値を整数で返す
442
+ # 移動後の小線分の範囲が大線分の範囲内のときは0、
443
+ # マイナス方向で範囲外に出るときは-1、
444
+ # プラス方向で出るときは1を返す
445
+ #_big_segment_:: 大線分の範囲。Segment構造体、もしくは[min,max]で構成された配列
446
+ #_d_:: selfの移動量
447
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
448
+ #返却値:: 判別の結果
449
+ def in_bounds_ex?(big_segment, d, flag = false)
450
+ nx = self[0] + d
451
+ nx2 = self[1] + d - 1
452
+ nx, nx2 = nx2, nx if nx > nx2
453
+ return -1 if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
454
+ return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? 1 : 0
455
+ end
456
+
457
+ #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
458
+ # 移動後の小線分の範囲が大線分の範囲内のときは0、
459
+ # マイナス方向で範囲外に出るときは1、
460
+ # プラス方向で出るときは-1を返す
461
+ #_big_segment_:: 大線分の範囲。Segment構造体、もしくは[min,max]で構成された配列
462
+ #_d_:: selfの移動量
463
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
464
+ #返却値:: 判別の結果
465
+ def in_bounds_rev?(big_segment, d, flag = false)
466
+ nx = self[0] + d
467
+ nx2 = self[1] + d - 1
468
+ nx, nx2 = nx2, nx if nx > nx2
469
+ return 1 if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
470
+ return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? -1 : 0
471
+ end
472
+
473
+ #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
474
+ # 移動量が0のときは0、
475
+ # 移動後の小線分の範囲が大線分の範囲内のときは1、
476
+ # 範囲外に出るときは-1を返す
477
+ #_big_segment_:: 大線分の範囲。Segment構造体、もしくは[min,max]で構成された配列
478
+ #_d_:: selfの移動量
479
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
480
+ #返却値:: 判別の結果
481
+ def in_bounds_rev_ex?(big_segment, d, flag = false)
482
+ return 0 if d == 0
483
+ dir = (d <=> 0)
484
+ nx = self[0] + d
485
+ nx2 = self[1] + d - 1
486
+ nx, nx2 = nx2, nx if nx > nx2
487
+ return -dir if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
488
+ return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? -dir : dir
489
+ end
490
+ end
491
+
492
+ #==X方向・Y方向線分の区間情報を操作するクラス
493
+ #本クラスでは、X方向・Y方向2つのSegmentを管理する。
494
+ #位置変更メソッドを追加
495
+ class Segments
496
+
497
+ #===x座標の線分を返す
498
+ #(例)segments = (x:[10,20],y:[100,200])
499
+ # segments.x => segment[10,20]
500
+ #返却値:: Segment構造体
501
+ attr_reader :x
502
+
503
+ #===y座標の線分を返す
504
+ #(例)segment = (x:[10,20],y:[100,200])
505
+ # segment.y => segment[100,200]
506
+ #返却値:: Segment構造体
507
+ attr_reader :y
508
+
509
+ #===矩形情報からSegmentsインスタンスを生成する
510
+ #入力した矩形情報(Rect構造体、[x,y,w,h]で表される配列)から、構造体インスタンスを生成する
511
+ #(前バージョンまでの互換性のために残している)
512
+ #_rect_:: 算出に使用する矩形情報
513
+ #返却値:: 生成したインスタンスを返す
514
+ def Segments.create(rect)
515
+ return Segments.new(Segment.new(rect[0], rect[0] + rect[2] - 1),
516
+ Segment.new(rect[1], rect[1] + rect[3] - 1))
517
+ end
518
+
519
+ #===矩形情報からSegmentsインスタンスを生成する
520
+ #入力した情報から、Segment構造体二つを持ったインスタンスを生成する
521
+ #引数には、Rect構造体、Square構造体、[(x)[min,max],(y)[min,max]],[min_x,max_x,min_y,max_y]の形式を持つ
522
+ #
523
+ #引数を省略したときはすべて0のSegment構造体を持つ
524
+ #また、引数が3つ、5つ以上の時はMiyakoValueError例外が発生する
525
+ #_params_:: 情報を渡す引数(複数可)
526
+ #返却値:: 生成したインスタンスを返す
527
+ def initialize(*params)
528
+ case params.length
529
+ when 0
530
+ @x = Segment.new(0,0)
531
+ @y = Segment.new(0,0)
532
+ when 1
533
+ pm = params[0]
534
+ if pm.is_a?(Rect)
535
+ @x = Segment.new(pm[0], pm[0] + pm[2] - 1)
536
+ @y = Segment.new(pm[1], pm[1] + pm[3] - 1)
537
+ elsif pm.is_a?(Square) || (pm.is_a?(Array) && pm.length==4)
538
+ @x = Segment.new(pm[0], pm[2])
539
+ @y = Segment.new(pm[1], pm[3])
540
+ else
541
+ @x = Segment.new(pm[0][0],pm[0][1])
542
+ @y = Segment.new(pm[1][0],pm[1][1])
543
+ end
544
+ when 2
545
+ @x = Segment.new(params[0][0],params[0][1])
546
+ @y = Segment.new(params[1][0],params[1][1])
547
+ when 4
548
+ @x = Segment.new(params[0],params[1])
549
+ @y = Segment.new(params[2],params[3])
550
+ else
551
+ raise MiyakoValueError, "illegal params : params is 0,1,2,4! params = #{params.length}"
552
+ end
553
+ end
554
+
555
+ #===インデックスから対象のSegment構造体を取得する
556
+ #インデックスの値に対応した
557
+ #上記以外のインデックスを渡したときはnilを返す
558
+ #Segmentsは以前構造体だったため、互換性のために用意している
559
+ #_idx_:: Segmentを指すインデックス
560
+ #返却値:: インデックスに対応したSegment構造体(対応していないインデックスの時はnil)
561
+ def [](idx)
562
+ case idx
563
+ when 0, :x
564
+ return @x
565
+ when 1, :y
566
+ return @y
567
+ else
568
+ return nil
569
+ end
570
+ end
571
+
572
+ #===位置を変更する(変化量を指定)
573
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
574
+ #_dx_:: 移動量(x方向)。単位はピクセル
575
+ #_dy_:: 移動量(y方向)。単位はピクセル
576
+ #返却値:: 自分自身を返す
577
+ def move!(dx, dy)
578
+ @x.move!(dx)
579
+ @y.move!(dy)
580
+ return self
581
+ end
582
+
583
+ #===位置を変更する(位置指定)
584
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
585
+ #_x_:: 移動先位置(x方向)。単位はピクセル
586
+ #_y_:: 移動先位置(y方向)。単位はピクセル
587
+ #返却値:: 自分自身を返す
588
+ def move_to!(x, y)
589
+ @x.move_to!(x)
590
+ @y.move_to!(y)
591
+ return self
592
+ end
593
+
594
+ #===位置を変更したインスタンスを返す(変化量を指定)
595
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
596
+ #自分自身の値は変わらない
597
+ #_dx_:: 移動量(x方向)。単位はピクセル
598
+ #_dy_:: 移動量(y方向)。単位はピクセル
599
+ #返却値:: 自分自身の複製を更新したインスタンス
600
+ def move(dx, dy)
601
+ self.dup.move!(dx, dy)
602
+ end
603
+
604
+ #===位置を変更したインスタンスを返す(位置指定)
605
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
606
+ #自分自身の値は変わらない
607
+ #_x_:: 移動先位置(x方向)。単位はピクセル
608
+ #_y_:: 移動先位置(y方向)。単位はピクセル
609
+ #返却値:: 自分自身の複製を更新したインスタンス
610
+ def move_to(x, y)
611
+ self.dup.move_to!(x, y)
612
+ end
613
+
614
+ #===サイズを変更する(変化量を指定)
615
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
616
+ #_dw_:: 幅変更。単位はピクセル
617
+ #_dh_:: 高さ変更。単位はピクセル
618
+ #返却値:: 自分自身を返す
619
+ def resize!(dw, dh)
620
+ @x.resize!(dw)
621
+ @y.resize!(dh)
622
+ return self
623
+ end
624
+
625
+ #===サイズを変更する
626
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
627
+ #_w_:: 幅変更。単位はピクセル
628
+ #_h_:: 高さ変更。単位はピクセル
629
+ #返却値:: 自分自身を返す
630
+ def resize_to!(w, h)
631
+ @x.resize_to!(w)
632
+ @y.resize_to!(h)
633
+ return self
634
+ end
635
+
636
+ #===サイズを変更したインスタンスを返す(変化量を指定)
637
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
638
+ #自分自身の値は変わらない
639
+ #_dw_:: 幅変更。単位はピクセル
640
+ #_dh_:: 高さ変更。単位はピクセル
641
+ #返却値:: 自分自身の複製を更新したインスタンス
642
+ def resize(dw, dh)
643
+ self.dup.resize!(dw,dh)
644
+ end
645
+
646
+ #===サイズを変更したインスタンスを返す
647
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
648
+ #自分自身の値は変わらない
649
+ #_w_:: 幅変更。単位はピクセル
650
+ #_h_:: 高さ変更。単位はピクセル
651
+ #返却値:: 自分自身の複製を更新したインスタンス
652
+ def resize_to(w, h)
653
+ self.dup.resize_to!(w,h)
654
+ end
655
+
656
+ def reset!(min_x, max_x, min_y, max_y) #:nodoc:
657
+ @x[0], @x[1], @y[0], @y[1] = min_x, max_x, min_y, max_y
658
+ end
659
+
660
+ def to_ary #:nodoc:
661
+ [@x.to_ary, @y.to_ary]
662
+ end
663
+
664
+ #===小線分を移動させたとき、大線分が範囲内かどうかを判別する
665
+ # 移動後の小線分が大線分の範囲内にあるかどうかをtrue/falseで取得する
666
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
667
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
668
+ #_d_:: selfの移動量
669
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
670
+ #返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
671
+ def in_bounds?(idx, big_segment, d, flag = false)
672
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
673
+ return self[idx].in_bounds?(big_segment, d, flag)
674
+ end
675
+
676
+ #===小線分を移動させたとき、大線分が範囲内かどうかを判別して、その状態によって値を整数で返す
677
+ # 移動後の小線分の範囲が大線分の範囲内のときは0、
678
+ # マイナス方向で範囲外に出るときは-1、
679
+ # プラス方向で出るときは1を返す
680
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
681
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
682
+ #_d_:: selfの移動量
683
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
684
+ #返却値:: 判別の結果
685
+ def in_bounds_ex?(idx, big_segment, d, flag = false)
686
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
687
+ return self[idx].in_bounds_ex?(big_segment, d, flag)
688
+ end
689
+
690
+ #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
691
+ # 移動後の小線分の範囲が大線分の範囲内のときは0、
692
+ # マイナス方向で範囲外に出るときは1、
693
+ # プラス方向で出るときは-1を返す
694
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
695
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
696
+ #_d_:: selfの移動量
697
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
698
+ #返却値:: 判別の結果
699
+ def in_bounds_rev?(idx, big_segment, d, flag = false)
700
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
701
+ return self[idx].in_bounds_rev?(big_segment, d, flag)
702
+ end
703
+
704
+ #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
705
+ # 移動量が0のときは0、
706
+ # 移動後の小線分の範囲が大線分の範囲内のときは1、
707
+ # 範囲外に出るときは-1を返す
708
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
709
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
710
+ #_d_:: selfの移動量
711
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
712
+ #返却値:: 判別の結果
713
+ def in_bounds_rev_ex?(idx, big_segment, d, flag = false)
714
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
715
+ return self[idx].in_bounds_rev_ex?(big_segment, d, flag)
716
+ end
717
+ end
718
+
719
+ #==座標などを構成するために使用する構造体
720
+ #_x_:: X座標の値
721
+ #_y_:: Y座標の値
722
+ Point = PointStruct.new(:x, :y)
723
+
724
+ #==サイズなどを構成するために使用する構造体
725
+ #_w_:: 横幅
726
+ #_h_:: 高さ
727
+ Size = SizeStruct.new(:w, :h)
728
+
729
+ #==矩形などを構成するために使用する構造体
730
+ #_x_:: X座標の値
731
+ #_y_:: Y座標の値
732
+ #_w_:: 横幅
733
+ #_h_:: 高さ
734
+ Rect = RectStruct.new(:x, :y, :w, :h)
735
+
736
+ #==矩形などを構成するために使用する構造体
737
+ #_left_:: 左上X座標の値
738
+ #_top_:: 左上Y座標の値
739
+ #_right_:: 右下X座標の値
740
+ #_bottom_:: 右下Y座標の値
741
+ Square = SquareStruct.new(:left, :top, :right, :bottom)
742
+
743
+ #==線分を構成するために使用する構造体
744
+ #min,maxは、逆に入っていてもコンストラクタで入れ替える
745
+ #_min_:: 線分の小さい方の値
746
+ #_max_:: 線分の大きい方の値
747
+ Segment = SegmentStruct.new(:min, :max)
748
+
749
+ class Segment
750
+ def initialize(*params)
751
+ super(*params)
752
+ self.min, self.max = self.max, self.min if self.min > self.max
753
+ end
754
+ end
755
+
756
+ #==色を管理するクラス
757
+ #
758
+ #色情報は、[r(赤),g(緑),b(青),a(透明度)]、[r,g,b,a(透明度)]の2種類の配列
759
+ #
760
+ #それぞれの要素の値は0〜255の範囲
761
+ #
762
+ #4要素必要な色情報に3要素の配列を渡すと、自動的に4要素目(値は255)が挿入される
763
+ #
764
+ #(注)本クラスで採用する透明度と、画像が持つ透明度とは別物
765
+ class Color
766
+ @@symbol2color = {:black => [ 0, 0, 0, 255],
767
+ :white => [255,255,255, 255],
768
+ :blue => [ 0, 0,255, 255],
769
+ :green => [ 0,255, 0, 255],
770
+ :red => [255, 0, 0, 255],
771
+ :cyan => [ 0,255,255, 255],
772
+ :purple => [255, 0,255, 255],
773
+ :yellow => [255,255, 0, 255],
774
+ :light_gray => [200,200,200, 255],
775
+ :half_gray => [128,128,128, 255],
776
+ :half_blue => [ 0, 0,128, 255],
777
+ :half_green => [ 0,128, 0, 255],
778
+ :half_red => [128, 0, 0, 255],
779
+ :half_cyan => [ 0,128,128, 255],
780
+ :half_purple => [128, 0,128, 255],
781
+ :half_yellow => [128,128, 0, 255],
782
+ :dark_gray => [ 80, 80, 80, 255],
783
+ :dark_blue => [ 0, 0, 80, 255],
784
+ :dark_green => [ 0, 80, 0, 255],
785
+ :dark_red => [ 80, 0, 0, 255],
786
+ :dark_cyan => [ 0, 80, 80, 255],
787
+ :dark_purple => [ 80, 0, 80, 255],
788
+ :dark_yellow => [ 80, 80, 0, 255]}
789
+ @@symbol2color.default = nil
790
+
791
+ #===シンボルから色情報を取得する
792
+ #_name_::色に対応したシンボル(以下の一覧参照)。存在しないシンボルを渡したときはエラーを返す
793
+ #返却値::シンボルに対応した4要素の配列
794
+ #
795
+ #シンボル:: 色配列([赤,緑,青,透明度])
796
+ #:black:: [ 0, 0, 0, 255]
797
+ #:white:: [255,255,255, 255]
798
+ #:blue:: [ 0, 0,255, 255]
799
+ #:green:: [ 0,255, 0, 255]
800
+ #:red:: [255, 0, 0, 255]
801
+ #:cyan:: [ 0,255,255, 255]
802
+ #:purple:: [255, 0,255, 255]
803
+ #:yellow:: [255,255, 0, 255]
804
+ #:light_gray:: [200,200,200, 255]
805
+ #:half_gray:: [128,128,128, 255]
806
+ #:half_blue:: [ 0, 0,128, 255]
807
+ #:half_green:: [ 0,128, 0, 255]
808
+ #:half_red:: [128, 0, 0, 255]
809
+ #:half_cyan:: [ 0,128,128, 255]
810
+ #:half_purple:: [128, 0,128, 255]
811
+ #:half_yellow:: [128,128, 0, 255]
812
+ #:dark_gray:: [ 80, 80, 80, 255]
813
+ #:dark_blue:: [ 0, 0, 80, 255]
814
+ #:dark_green:: [ 0, 80, 0, 255]
815
+ #:dark_red:: [ 80, 0, 0, 255]
816
+ #:dark_cyan:: [ 0, 80, 80, 255]
817
+ #:dark_purple:: [ 80, 0, 80, 255]
818
+ #:dark_yellow:: [ 80, 80, 0, 255]
819
+ def Color.[](name, alpha = nil)
820
+ c = (@@symbol2color[name.to_sym] or raise MiyakoError, "Illegal Color Name! : #{name}")
821
+ c[3] = alpha if alpha
822
+ return c
823
+ end
824
+
825
+ #===Color.[]メソッドで使用できるシンボルと色情報との対を登録する
826
+ #_name_:: 色に対応させるシンボル
827
+ #_value_:: 色情報を示す3〜4要素の配列。3要素のときは4要素目を自動的に追加する
828
+ def Color.[]=(name, value)
829
+ @@symbol2color[name.to_sym] = value
830
+ @@symbol2color[name.to_sym] << 255 if value.length == 3
831
+ end
832
+
833
+ #===様々な形式のデータを色情報に変換する
834
+ #_v_::変換対象のインスタンス。変換可能な内容は以下の一覧参照
835
+ #_alpha_::透明度。デフォルトはnil
836
+ #
837
+ #インスタンス:: 書式
838
+ #配列:: 最低3要素の数値の配列
839
+ #文字列:: ”#RRGGBB"で示す16進数の文字列、もしくは"red"、"black"など。使える文字列はColor.[]で使えるシンボルに対応
840
+ #数値:: 32bitの値を8bitずつ割り当て(aaaaaaaarrrrrrrrggggggggbbbbbbbb)
841
+ #シンボル:: Color.[]と同じ
842
+ def Color::to_rgb(v, alpha = nil)
843
+ c = (v.to_miyako_color or raise MiyakoError, "Illegal parameter")
844
+ c[3] = alpha if alpha
845
+ return c
846
+ end
847
+
848
+ #===色情報をColor.[]メソッドで使用できるシンボルと色情報との対を登録する
849
+ #_cc_:: 色情報(シンボル、文字列)
850
+ #_value_:: 色情報を示す3〜4要素の配列。3要素のときは4要素目を自動的に追加する
851
+ def Color::to_s(cc)
852
+ c = to_rgb(cc)
853
+ return "[#{c[0]},#{c[1]},#{c[2]},#{c[3]}]"
854
+ end
855
+ end
856
+
857
+ #タイマーを管理するクラス
858
+ class WaitCounter
859
+ SECOND2TICK = 1000
860
+
861
+ #WaitCounterインスタンス固有の名前
862
+ #デフォルトはインスタンスIDを文字列化したもの
863
+ attr_accessor :name
864
+
865
+ def WaitCounter.get_second_to_tick(s) #:nodoc:
866
+ return (SECOND2TICK * s).to_i
867
+ end
868
+
869
+ #===インスタンスを生成する
870
+ #_seconds_:: タイマーとして設定する秒数(実数で指定可能)
871
+ #_name_:: インスタンス固有の名称。デフォルトはnil
872
+ #(nilを渡した場合、インスタンスIDを文字列化したものが名称になる)
873
+ #返却値:: 生成されたインスタンス
874
+ def initialize(seconds, name=nil)
875
+ @seconds = seconds
876
+ @name = name ? name : __id__.to_s
877
+ @wait = WaitCounter.get_second_to_tick(@seconds)
878
+ @st = 0
879
+ @counting = false
880
+ end
881
+
882
+ #===設定されているウェイトの長さを求める
883
+ #ウェイトの長さをミリセカンド単位で取得する
884
+ #返却値:: ウェイトの長さ
885
+ def length
886
+ return @wait
887
+ end
888
+
889
+ #===残りウェイトの長さを求める
890
+ #タイマー実行中のときウェイトの長さをミリセカンド単位で取得する
891
+ #返却値:: 残りウェイトの長さ(実行していない時はウェイトの長さ)
892
+ def remind
893
+ return @wait unless @counting
894
+ cnt = SDL.getTicks - @st
895
+ return @wait < cnt ? 0 : @wait - cnt
896
+ end
897
+
898
+ #===タイマー処理を開始する
899
+ #返却値:: 自分自身を返す
900
+ def start
901
+ @st = SDL.getTicks
902
+ @counting = true
903
+ return self
904
+ end
905
+
906
+ #===タイマー処理を停止する
907
+ #一旦タイマーを停止すると、復帰できない(一時停止ではない)
908
+ #返却値:: 自分自身を返す
909
+ def stop
910
+ @counting = false
911
+ @st = 0
912
+ return self
913
+ end
914
+
915
+ def wait_inner(f) #:nodoc:
916
+ return !f unless @counting
917
+ t = SDL.getTicks
918
+ return f unless (t - @st) >= @wait
919
+ @counting = false
920
+ return !f
921
+ end
922
+
923
+ private :wait_inner
924
+
925
+ #===タイマー処理中かを返す
926
+ #タイマー処理中ならばtrue、停止中ならばfalseを返す
927
+ #返却値:: タイマー処理中かどうかを示すフラグ
928
+ def waiting?
929
+ return wait_inner(true)
930
+ end
931
+
932
+ #===タイマー処理が終了したかを返す
933
+ #タイマー処理が終了したらtrue、処理中ならfalseを返す
934
+ #返却値:: タイマー処理が終わったかどうかを示すフラグ
935
+ def finish?
936
+ return wait_inner(false)
937
+ end
938
+
939
+ def wait #:nodoc:
940
+ st = SDL.getTicks
941
+ t = SDL.getTicks
942
+ until (t - st) >= @wait do
943
+ t = SDL.getTicks
944
+ end
945
+ return self
946
+ end
947
+
948
+ #===インスタンスないで所持している領域を開放する
949
+ #(現段階ではダミー)
950
+ def dispose
951
+ end
952
+ end
953
+ end
954
+
955
+ # for duck typing
956
+ class Object
957
+ def to_miyako_color #:nodoc:
958
+ raise Miyako::MiyakoError, "Illegal color parameter class!"
959
+ end
960
+ end
961
+
962
+ class String
963
+ def to_miyako_color #:nodoc:
964
+ case self
965
+ when /\A\[\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*(\d+)\s*\]\z/
966
+ #4要素の配列形式
967
+ return [$1.to_i, $2.to_i, $3.to_i, $4.to_i]
968
+ when /\A\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\z/
969
+ #4個の数列形式
970
+ return [$1.to_i, $2.to_i, $3.to_i, $4.to_i]
971
+ when /\A\#([\da-fA-F]{8})\z/
972
+ #HTML形式(#RRGGBBAA)
973
+ return [$1[0,2].hex, $1[2,2].hex, $1[4,2].hex, $1[6,2].hex]
974
+ when /\A\[\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\]\z/
975
+ #3要素の配列形式
976
+ return [$1.to_i, $2.to_i, $3.to_i, 255]
977
+ when /\A\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\z/
978
+ #3個の数列方式
979
+ [$1.to_i, $2.to_i, $3.to_i, 255]
980
+ when /\A\#([\da-fA-F]{6})\z/
981
+ #HTML形式(#RRGGBB)
982
+ return [$1[0,2].hex, $1[2,2].hex, $1[4,2].hex, 255]
983
+ else return self.to_sym.to_miyako_color
984
+ end
985
+ end
986
+ end
987
+
988
+ class Symbol
989
+ def to_miyako_color #:nodoc:
990
+ return Miyako::Color[self]
991
+ end
992
+ end
993
+
994
+ class Integer
995
+ def to_miyako_color #:nodoc:
996
+ return [(self >> 16) & 0xff, (self >> 8) & 0xff, self & 0xff, (self >> 24) & 0xff]
997
+ end
998
+ end
999
+
1000
+ class Array
1001
+ def to_miyako_color #:nodoc:
1002
+ raise Miyako::MiyakoError, "Color Array needs more than 3 elements : #{self.length} elements" if self.length < 3
1003
+ return (self[0,3] << 255) if self.length == 3
1004
+ return self[0,4]
1005
+ end
1006
+ end
1007
+
1008
+ #=begin rdoc
1009
+ #==1個のインスタンスでイテレータを実装できるモジュール
1010
+ #=end
1011
+ module SingleEnumerable
1012
+ include Enumerable
1013
+
1014
+ #===ブロックの処理を実行する
1015
+ #返却値:: 自分自身を返す
1016
+ def each
1017
+ yield self
1018
+ return self
1019
+ end
1020
+
1021
+ #===sizeメソッドと同様
1022
+ #返却値:: sizeメソッドと同様
1023
+ def length
1024
+ return 1
1025
+ end
1026
+ end