ruby-miyako 2.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/README +275 -20
  2. data/extern.h +21 -1
  3. data/install_miyako.rb +5 -3
  4. data/lib/Miyako/API/audio.rb +11 -6
  5. data/lib/Miyako/API/basic_data.rb +0 -985
  6. data/lib/Miyako/API/bitmap.rb +19 -22
  7. data/lib/Miyako/API/choices.rb +203 -69
  8. data/lib/Miyako/API/collision.rb +451 -9
  9. data/lib/Miyako/API/color.rb +177 -0
  10. data/lib/Miyako/API/diagram.rb +18 -20
  11. data/lib/Miyako/API/fixedmap.rb +207 -73
  12. data/lib/Miyako/API/font.rb +111 -18
  13. data/lib/Miyako/API/i_yuki.rb +1201 -0
  14. data/lib/Miyako/API/input.rb +65 -0
  15. data/lib/Miyako/API/layout.rb +41 -29
  16. data/lib/Miyako/API/map.rb +202 -157
  17. data/lib/Miyako/API/map_event.rb +86 -19
  18. data/lib/Miyako/API/map_struct.rb +268 -0
  19. data/lib/Miyako/API/modules.rb +136 -37
  20. data/lib/Miyako/API/movie.rb +8 -8
  21. data/lib/Miyako/API/parts.rb +63 -20
  22. data/lib/Miyako/API/plane.rb +4 -4
  23. data/lib/Miyako/API/screen.rb +16 -8
  24. data/lib/Miyako/API/sprite.rb +290 -23
  25. data/lib/Miyako/API/sprite_animation.rb +23 -11
  26. data/lib/Miyako/API/sprite_list.rb +406 -183
  27. data/lib/Miyako/API/story.rb +4 -65
  28. data/lib/Miyako/API/struct_point.rb +157 -0
  29. data/lib/Miyako/API/struct_rect.rb +233 -0
  30. data/lib/Miyako/API/struct_segment.rb +641 -0
  31. data/lib/Miyako/API/struct_size.rb +158 -0
  32. data/lib/Miyako/API/struct_square.rb +253 -0
  33. data/lib/Miyako/API/textbox.rb +49 -35
  34. data/lib/Miyako/API/viewport.rb +5 -5
  35. data/lib/Miyako/API/wait_counter.rb +350 -0
  36. data/lib/Miyako/API/yuki.rb +95 -60
  37. data/lib/Miyako/EXT/raster_scroll.rb +30 -8
  38. data/lib/Miyako/EXT/slides.rb +6 -6
  39. data/lib/Miyako/miyako.rb +25 -11
  40. data/lib/miyako.rb +28 -0
  41. data/lib/miyako_require_only.rb +35 -0
  42. data/miyako_basicdata.c +201 -17
  43. data/miyako_collision.c +315 -6
  44. data/miyako_diagram.c +331 -0
  45. data/miyako_drawing.c +26 -7
  46. data/miyako_font.c +259 -129
  47. data/miyako_input_audio.c +24 -14
  48. data/miyako_layout.c +106 -8
  49. data/miyako_no_katana.c +398 -171
  50. data/miyako_sprite2.c +275 -38
  51. data/miyako_transform.c +113 -107
  52. data/miyako_utility.c +34 -48
  53. data/miyako_yuki.c +241 -0
  54. data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
  55. data/sample/Room3/blue.rb +19 -19
  56. data/sample/Room3/green.rb +9 -9
  57. data/sample/Room3/main.rb +12 -12
  58. data/sample/Room3/red.rb +12 -12
  59. data/sample/Room3/title.rb +15 -10
  60. data/sample/collision_test2.rb +2 -1
  61. data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
  62. data/sample/map_test/main_scene.rb +12 -10
  63. data/sample/map_test/map_manager.rb +14 -13
  64. data/sample/rasterscroll.rb +5 -5
  65. data/sample/takahashi.rb +3 -3
  66. data/sample/textbox_sample.rb +7 -6
  67. data/sample/transform.rb +2 -1
  68. data/uninstall_miyako.rb +4 -1
  69. data/win/miyako_no_katana.so +0 -0
  70. metadata +15 -4
  71. data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
  72. data/sample/cairo_sample.rb +0 -25
@@ -0,0 +1,641 @@
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 SegmentStruct < Struct
27
+
28
+ #===レシーバがotherの範囲内かどうかを求める
29
+ #最小数・最大数ともにotherの範囲内かどうかを確認する
30
+ #_other_:: 比較対象の線分
31
+ #返却値:: 最小値・最大値ともにotherの範囲内ならばtrueを返す
32
+ def between?(other)
33
+ return self[0] >= other[0] && self[1] <= other[1]
34
+ end
35
+
36
+ #===otherがレシーバの範囲内かどうかを求める
37
+ #最小数・最大数ともにotherの範囲外かどうかを確認する
38
+ #_other_:: 比較対象の線分
39
+ #返却値:: 最小値・最大値ともにotherの範囲外ならばtrueを返す
40
+ def covers?(other)
41
+ return self[0] <= other[0] && self[1] >= other[1]
42
+ end
43
+
44
+ #===レシーバがotherの範囲と重なっているかどうかを求める
45
+ #最小数・最大数のどちらかがotherの範囲内かどうかを確認する
46
+ #_other_:: 比較対象の線分
47
+ #返却値:: 最小値・最大値のどちらかがotherの範囲内ならばtrueを返す
48
+ def collision?(other)
49
+ return (self[0] >= other[0] && self[0] <= other[1]) || (self[1] >= other[0] && self[1] <= other[1])
50
+ end
51
+
52
+ #===線分の大きさを求める
53
+ #max - min + 1 の値を求めて返す
54
+ #返却値:: 線分の大きさ
55
+ def size
56
+ self[1] - self[0] + 1
57
+ end
58
+
59
+ #===位置を変更する(変化量を指定)
60
+ #_d_:: 移動量
61
+ #返却値:: 自分自身を返す
62
+ def move!(d)
63
+ self[0] += d
64
+ self[1] += d
65
+ return self
66
+ end
67
+
68
+ #===位置を変更する(位置指定)
69
+ #_v_:: 移動先位置。単位はピクセル
70
+ #返却値:: 自分自身を返す
71
+ def move_to!(v)
72
+ self[1] = self[1] - self[0] + v
73
+ self[0] = v
74
+ return self
75
+ end
76
+
77
+ #===位置を変更したインスタンスを返す(変化量を指定)
78
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
79
+ #自分自身の値は変わらない
80
+ #_d_:: 移動量
81
+ #返却値:: 自分自身の複製を更新したインスタンス
82
+ def move(d)
83
+ return self.dup.move!(d)
84
+ end
85
+
86
+ #===位置を変更したインスタンスを返す(位置指定)
87
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
88
+ #自分自身の値は変わらない
89
+ #_v_:: 移動先位置。単位はピクセル
90
+ #返却値:: 自分自身の複製を更新したインスタンス
91
+ def move_to(v)
92
+ return self.dup.move_to!(v)
93
+ end
94
+
95
+ #===幅を変更する(変化量を指定)
96
+ #_d_:: 変更量。単位はピクセル
97
+ #返却値:: 自分自身を返す
98
+ def resize!(d)
99
+ self[1] += d
100
+ return self
101
+ end
102
+
103
+ #===幅を変更する
104
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
105
+ #_v_:: 変更後の幅。単位はピクセル
106
+ #返却値:: 自分自身を返す
107
+ def resize_to!(v)
108
+ self[1] = self[0] + v - 1
109
+ return self
110
+ end
111
+
112
+ #===サイズを変更したインスタンスを返す(変化量を指定)
113
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
114
+ #自分自身の値は変わらない
115
+ #_d_:: 変更量。単位はピクセル
116
+ #返却値:: 自分自身の複製を更新したインスタンス
117
+ def resize(d)
118
+ self.dup.resize!(d)
119
+ end
120
+
121
+ #===サイズを変更したインスタンスを返す
122
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
123
+ #自分自身の値は変わらない
124
+ #_v_:: 変更後の幅。単位はピクセル
125
+ #返却値:: 自分自身の複製を更新したインスタンス
126
+ def resize_to(v)
127
+ self.dup.resize_to!(v)
128
+ end
129
+
130
+ #===インスタンスの足し算
131
+ #もう一方が整数のとき、x,yにotherを足したものを返す
132
+ #Point構造体や配列など、[]メソッドがつかえるもののとき、x,y同士を足したものを返す
133
+ #それ以外の時は例外が発生する
134
+ #自分自身の値は変わらない
135
+ #_other_:: 整数もしくはPoint構造体
136
+ #返却値:: Point構造体
137
+ def +(other)
138
+ ret = self.dup
139
+ if other.kind_of?(Numeric)
140
+ ret[0] += other
141
+ ret[1] += other
142
+ elsif other.methods.include?(:[])
143
+ ret[0] += other[0]
144
+ ret[1] += other[1]
145
+ else
146
+ raise MiyakoError, "this parameter cannot access!"
147
+ end
148
+ ret
149
+ end
150
+
151
+ #===インスタンスの引き算
152
+ #もう一方が整数のとき、x,yからotherを引いたものを返す
153
+ #Point構造体や配列など、[]メソッドがつかえるもののとき、x,y同士を引いたものを返す
154
+ #それ以外の時は例外が発生する
155
+ #自分自身の値は変わらない
156
+ #_other_:: 整数もしくはPoint構造体
157
+ #返却値:: Point構造体
158
+ def -(other)
159
+ ret = self.dup
160
+ if other.kind_of?(Numeric)
161
+ ret[0] -= other
162
+ ret[1] -= other
163
+ elsif other.methods.include?(:[])
164
+ ret[0] -= other[0]
165
+ ret[1] -= other[1]
166
+ else
167
+ raise MiyakoError, "this parameter cannot access!"
168
+ end
169
+ ret
170
+ end
171
+
172
+ #===インスタンスのかけ算
173
+ #もう一方が整数のとき、x,yにotherを掛けたものを返す
174
+ #Point構造体や配列など、[]メソッドがつかえるもののとき、x,y同士を掛けたものを返す
175
+ #それ以外の時は例外が発生する
176
+ #自分自身の値は変わらない
177
+ #_other_:: 整数もしくはPoint構造体
178
+ #返却値:: Point構造体
179
+ def *(other)
180
+ ret = self.dup
181
+ if other.kind_of?(Numeric)
182
+ ret[0] *= other
183
+ ret[1] *= other
184
+ elsif other.methods.include?(:[])
185
+ ret[0] *= other[0]
186
+ ret[1] *= other[1]
187
+ else
188
+ raise MiyakoError, "this parameter cannot access!"
189
+ end
190
+ ret
191
+ end
192
+
193
+ #===インスタンスの割り算
194
+ #もう一方が整数のとき、x,yからotherを割ったものを返す
195
+ #Point構造体や配列など、[]メソッドがつかえるもののとき、x,y同士を割ったものを返す
196
+ #それ以外の時は例外が発生する
197
+ #自分自身の値は変わらない
198
+ #_other_:: 整数もしくはPoint構造体
199
+ #返却値:: Point構造体
200
+ def /(other)
201
+ ret = self.dup
202
+ if other.kind_of?(Numeric)
203
+ raise MiyakoValueError, "0 div!" if other == 0
204
+ ret[0] /= other
205
+ ret[1] /= other
206
+ elsif other.methods.include?(:[])
207
+ raise MiyakoValueError, "0 div!" if (other[0] == 0 || other[1] == 0)
208
+ ret[0] /= other[0]
209
+ ret[1] /= other[1]
210
+ else
211
+ raise MiyakoError, "this parameter cannot access!"
212
+ end
213
+ ret
214
+ end
215
+
216
+ #===線分情報を変更する
217
+ #minとmaxを一緒に更新する
218
+ #min>maxのときは、それぞれの値を入れ替える
219
+ #_min_:: 線分の最小値
220
+ #_max_:: 線分の最大値
221
+ #返却値:: 自分自身
222
+ def reset!(min, max) #:nodoc:
223
+ self[0], self[1] = min, max
224
+ self[0], self[1] = self[1], self[0] if self[0] > self[1]
225
+ self
226
+ end
227
+
228
+ #===線分情報を配列に変換する
229
+ #[min, max]の配列を生成して返す。
230
+ #返却値:: 生成した配列
231
+ def to_ary
232
+ [self[0], self[1]]
233
+ end
234
+
235
+ #===値が線分の範囲内かどうかを判別する
236
+ #値がminとmaxの値の範囲内にあるかどうかを判別する。範囲内にあればtrueを返す
237
+ #値がminもしくはmaxに等しいときもtrueを返す
238
+ #_v_:: 判別する値
239
+ #返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
240
+ def in_range?(v)
241
+ v >= self[0] && v <= self[1]
242
+ end
243
+
244
+ #===値が線分の範囲内かどうかを判別する
245
+ #値がminとmaxの値の範囲内にあるかどうかを判別する。範囲内にあればtrueを返す
246
+ #値がminもしくはmaxに等しいときもtrueを返す
247
+ #_v_:: 判別する値
248
+ #返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
249
+ def between?(v)
250
+ in_range?(v)
251
+ end
252
+
253
+ #===値が線分の端かどうかを判別する
254
+ #値がminもしくはmaxと等しければtrueを返す
255
+ #_v_:: 判別する値
256
+ #返却値:: vがminもしくはmaxと等しければtrue、それ以外の時はfalseを返す
257
+ def in_edge?(v)
258
+ v == self[0] || v == self[1]
259
+ end
260
+
261
+ #===値が最小値かどうかを判別する
262
+ #値がminと等しければtrueを返す
263
+ #_v_:: 判別する値
264
+ #返却値:: vがminと等しければtrue、それ以外の時はfalseを返す
265
+ def min?(v)
266
+ v == self[0]
267
+ end
268
+
269
+ #===値が最大値かどうかを判別する
270
+ #値がmaxと等しければtrueを返す
271
+ #_v_:: 判別する値
272
+ #返却値:: vがmaxと等しければtrue、それ以外の時はfalseを返す
273
+ def max?(v)
274
+ v == self[1]
275
+ end
276
+
277
+ #===小線分を移動させたとき、大線分が範囲内かどうかを判別する
278
+ # 移動後の小線分が大線分の範囲内にあるかどうかをtrue/falseで取得する
279
+ #_big_segment_:: 大線分の範囲。Segment構造体、もしくは[min,max]で構成された配列
280
+ #_d_:: selfの移動量
281
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
282
+ #返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
283
+ def in_bounds?(big_segment, d, flag = false)
284
+ nx = self[0] + d
285
+ nx2 = self[1] + d
286
+ nx, nx2 = nx2, nx if nx > nx2
287
+ return flag ?
288
+ (nx >= big_segment[0] && nx2 <= big_segment[1]) :
289
+ (nx > big_segment[0] && (nx2 - 1) < big_segment[1])
290
+ end
291
+
292
+ #===小線分を移動させたとき、大線分が範囲内かどうかを判別して、その状態によって値を整数で返す
293
+ # 移動後の小線分の範囲が大線分の範囲内のときは0、
294
+ # マイナス方向で範囲外に出るときは-1、
295
+ # プラス方向で出るときは1を返す
296
+ #_big_segment_:: 大線分の範囲。Segment構造体、もしくは[min,max]で構成された配列
297
+ #_d_:: selfの移動量
298
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
299
+ #返却値:: 判別の結果
300
+ def in_bounds_ex?(big_segment, d, flag = false)
301
+ nx = self[0] + d
302
+ nx2 = self[1] + d - 1
303
+ nx, nx2 = nx2, nx if nx > nx2
304
+ return -1 if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
305
+ return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? 1 : 0
306
+ end
307
+
308
+ #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
309
+ # 移動後の小線分の範囲が大線分の範囲内のときは0、
310
+ # マイナス方向で範囲外に出るときは1、
311
+ # プラス方向で出るときは-1を返す
312
+ #_big_segment_:: 大線分の範囲。Segment構造体、もしくは[min,max]で構成された配列
313
+ #_d_:: selfの移動量
314
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
315
+ #返却値:: 判別の結果
316
+ def in_bounds_rev?(big_segment, d, flag = false)
317
+ nx = self[0] + d
318
+ nx2 = self[1] + d - 1
319
+ nx, nx2 = nx2, nx if nx > nx2
320
+ return 1 if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
321
+ return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? -1 : 0
322
+ end
323
+
324
+ #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
325
+ # 移動量が0のときは0、
326
+ # 移動後の小線分の範囲が大線分の範囲内のときは1、
327
+ # 範囲外に出るときは-1を返す
328
+ #_big_segment_:: 大線分の範囲。Segment構造体、もしくは[min,max]で構成された配列
329
+ #_d_:: selfの移動量
330
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
331
+ #返却値:: 判別の結果
332
+ def in_bounds_rev_ex?(big_segment, d, flag = false)
333
+ return 0 if d == 0
334
+ dir = (d <=> 0)
335
+ nx = self[0] + d
336
+ nx2 = self[1] + d - 1
337
+ nx, nx2 = nx2, nx if nx > nx2
338
+ return -dir if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
339
+ return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? -dir : dir
340
+ end
341
+ end
342
+
343
+ #==X方向・Y方向線分の区間情報を操作するクラス
344
+ #本クラスでは、X方向・Y方向2つのSegmentを管理する。
345
+ #位置変更メソッドを追加
346
+ class Segments
347
+
348
+ #===x座標の線分を返す
349
+ #(例)segments = (x:[10,20],y:[100,200])
350
+ # segments.x => segment[10,20]
351
+ #返却値:: Segment構造体
352
+ attr_reader :x
353
+
354
+ #===y座標の線分を返す
355
+ #(例)segment = (x:[10,20],y:[100,200])
356
+ # segment.y => segment[100,200]
357
+ #返却値:: Segment構造体
358
+ attr_reader :y
359
+
360
+ #===矩形情報からSegmentsインスタンスを生成する
361
+ #入力した矩形情報(Rect構造体、[x,y,w,h]で表される配列)から、構造体インスタンスを生成する
362
+ #(前バージョンまでの互換性のために残している)
363
+ #_rect_:: 算出に使用する矩形情報
364
+ #返却値:: 生成したインスタンスを返す
365
+ def Segments.create(rect)
366
+ return Segments.new(Segment.new(rect[0], rect[0] + rect[2] - 1),
367
+ Segment.new(rect[1], rect[1] + rect[3] - 1))
368
+ end
369
+
370
+ #===矩形情報からSegmentsインスタンスを生成する
371
+ #入力した情報から、Segment構造体二つを持ったインスタンスを生成する
372
+ #引数には、Rect構造体、Square構造体、[(x)[min,max],(y)[min,max]],[min_x,max_x,min_y,max_y]の形式を持つ
373
+ #
374
+ #引数を省略したときはすべて0のSegment構造体を持つ
375
+ #また、引数が3つ、5つ以上の時はMiyakoValueError例外が発生する
376
+ #_params_:: 情報を渡す引数(複数可)
377
+ #返却値:: 生成したインスタンスを返す
378
+ def initialize(*params)
379
+ case params.length
380
+ when 0
381
+ @x = Segment.new(0,0)
382
+ @y = Segment.new(0,0)
383
+ when 1
384
+ pm = params[0]
385
+ if pm.is_a?(Rect)
386
+ @x = Segment.new(pm[0], pm[0] + pm[2] - 1)
387
+ @y = Segment.new(pm[1], pm[1] + pm[3] - 1)
388
+ elsif pm.is_a?(Square) || (pm.is_a?(Array) && pm.length==4)
389
+ @x = Segment.new(pm[0], pm[2])
390
+ @y = Segment.new(pm[1], pm[3])
391
+ else
392
+ @x = Segment.new(pm[0][0],pm[0][1])
393
+ @y = Segment.new(pm[1][0],pm[1][1])
394
+ end
395
+ when 2
396
+ @x = Segment.new(params[0][0],params[0][1])
397
+ @y = Segment.new(params[1][0],params[1][1])
398
+ when 4
399
+ @x = Segment.new(params[0],params[1])
400
+ @y = Segment.new(params[2],params[3])
401
+ else
402
+ raise MiyakoValueError, "illegal params : params is 0,1,2,4! params = #{params.length}"
403
+ end
404
+ end
405
+
406
+ #===インデックスから対象のSegment構造体を取得する
407
+ #インデックスの値に対応した
408
+ #上記以外のインデックスを渡したときはnilを返す
409
+ #Segmentsは以前構造体だったため、互換性のために用意している
410
+ #_idx_:: Segmentを指すインデックス
411
+ #返却値:: インデックスに対応したSegment構造体(対応していないインデックスの時はnil)
412
+ def [](idx)
413
+ case idx
414
+ when 0, :x
415
+ return @x
416
+ when 1, :y
417
+ return @y
418
+ else
419
+ return nil
420
+ end
421
+ end
422
+
423
+ #===位置を変更する(変化量を指定)
424
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
425
+ #_dx_:: 移動量(x方向)。単位はピクセル
426
+ #_dy_:: 移動量(y方向)。単位はピクセル
427
+ #返却値:: 自分自身を返す
428
+ def move!(dx, dy)
429
+ @x.move!(dx)
430
+ @y.move!(dy)
431
+ return self
432
+ end
433
+
434
+ #===位置を変更する(位置指定)
435
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
436
+ #_x_:: 移動先位置(x方向)。単位はピクセル
437
+ #_y_:: 移動先位置(y方向)。単位はピクセル
438
+ #返却値:: 自分自身を返す
439
+ def move_to!(x, y)
440
+ @x.move_to!(x)
441
+ @y.move_to!(y)
442
+ return self
443
+ end
444
+
445
+ #===位置を変更したインスタンスを返す(変化量を指定)
446
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
447
+ #自分自身の値は変わらない
448
+ #_dx_:: 移動量(x方向)。単位はピクセル
449
+ #_dy_:: 移動量(y方向)。単位はピクセル
450
+ #返却値:: 自分自身の複製を更新したインスタンス
451
+ def move(dx, dy)
452
+ self.dup.move!(dx, dy)
453
+ end
454
+
455
+ #===位置を変更したインスタンスを返す(位置指定)
456
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
457
+ #自分自身の値は変わらない
458
+ #_x_:: 移動先位置(x方向)。単位はピクセル
459
+ #_y_:: 移動先位置(y方向)。単位はピクセル
460
+ #返却値:: 自分自身の複製を更新したインスタンス
461
+ def move_to(x, y)
462
+ self.dup.move_to!(x, y)
463
+ end
464
+
465
+ #===サイズを変更する(変化量を指定)
466
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
467
+ #_dw_:: 幅変更。単位はピクセル
468
+ #_dh_:: 高さ変更。単位はピクセル
469
+ #返却値:: 自分自身を返す
470
+ def resize!(dw, dh)
471
+ @x.resize!(dw)
472
+ @y.resize!(dh)
473
+ return self
474
+ end
475
+
476
+ #===サイズを変更する
477
+ # ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
478
+ #_w_:: 幅変更。単位はピクセル
479
+ #_h_:: 高さ変更。単位はピクセル
480
+ #返却値:: 自分自身を返す
481
+ def resize_to!(w, h)
482
+ @x.resize_to!(w)
483
+ @y.resize_to!(h)
484
+ return self
485
+ end
486
+
487
+ #===サイズを変更したインスタンスを返す(変化量を指定)
488
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
489
+ #自分自身の値は変わらない
490
+ #_dw_:: 幅変更。単位はピクセル
491
+ #_dh_:: 高さ変更。単位はピクセル
492
+ #返却値:: 自分自身の複製を更新したインスタンス
493
+ def resize(dw, dh)
494
+ self.dup.resize!(dw,dh)
495
+ end
496
+
497
+ #===サイズを変更したインスタンスを返す
498
+ #引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す
499
+ #自分自身の値は変わらない
500
+ #_w_:: 幅変更。単位はピクセル
501
+ #_h_:: 高さ変更。単位はピクセル
502
+ #返却値:: 自分自身の複製を更新したインスタンス
503
+ def resize_to(w, h)
504
+ self.dup.resize_to!(w,h)
505
+ end
506
+
507
+ #===線分情報を変更する
508
+ #x,yそれぞれのminとmaxを一緒に更新する
509
+ #min>maxのときは、それぞれの値を入れ替える
510
+ #_min_x_:: x方向の線分の最小値
511
+ #_max_x_:: x方向の線分の最大値
512
+ #_min_y_:: y方向の線分の最小値
513
+ #_max_y_:: y方向の線分の最大値
514
+ #返却値:: 自分自身
515
+ def reset!(min_x, max_x, min_y, max_y) #:nodoc:
516
+ @x.reset!(min_x, max_x)
517
+ @y.reset!(min_y, max_y)
518
+ end
519
+
520
+ #===線分情報を配列に変換する
521
+ #[[min, max],[min, max]]の配列を生成して返す。
522
+ #返却値:: 生成した配列
523
+ def to_ary
524
+ [@x.to_ary, @y.to_ary]
525
+ end
526
+
527
+ #===値がともに線分の範囲内かどうかを判別する
528
+ #x,yの値がともにminとmaxの値の範囲内にあるかどうかを判別する。範囲内にあればtrueを返す
529
+ #値がminもしくはmaxに等しいときもtrueを返す
530
+ #_x_:: x方向の値
531
+ #_y_:: y方向の値
532
+ #返却値:: x,yが範囲内のときはtrue、範囲外の時はfalseを返す
533
+ def in_range?(x, y)
534
+ @x.in_range?(x) && @y.in_range?(y)
535
+ end
536
+
537
+ #===値がともに線分の範囲内かどうかを判別する
538
+ #x,yの値がともにminとmaxの値の範囲内にあるかどうかを判別する。範囲内にあればtrueを返す
539
+ #値がminもしくはmaxに等しいときもtrueを返す
540
+ #_x_:: x方向の値
541
+ #_y_:: y方向の値
542
+ #返却値:: x,yが範囲内のときはtrue、範囲外の時はfalseを返す
543
+ def between?(x, y)
544
+ in_range?(x, y)
545
+ end
546
+
547
+ #===値がともに線分の端かどうかを判別する
548
+ #x,yの値がともにminもしくはmaxと等しければtrueを返す
549
+ #_x_:: x方向の値
550
+ #_y_:: y方向の値
551
+ #返却値:: x,yがminもしくはmaxと等しければtrue、それ以外の時はfalseを返す
552
+ def in_edge?(x, y)
553
+ @x.in_edge?(x) && @y.in_edge?(y)
554
+ end
555
+
556
+ #===値がともに最小値かどうかを判別する
557
+ #値がminと等しければtrueを返す
558
+ #_x_:: x方向の値
559
+ #_y_:: y方向の値
560
+ #返却値:: x,yがminと等しければtrue、それ以外の時はfalseを返す
561
+ def min?(x, y)
562
+ @x.min?(x) && @y.min?(y)
563
+ end
564
+
565
+ #===値がともに最大値かどうかを判別する
566
+ #値がmaxと等しければtrueを返す
567
+ #_x_:: x方向の値
568
+ #_y_:: y方向の値
569
+ #返却値:: x,yがmaxと等しければtrue、それ以外の時はfalseを返す
570
+ def max?(x, y)
571
+ @x.max?(x) && @y.max?(y)
572
+ end
573
+
574
+ #===小線分を移動させたとき、大線分が範囲内かどうかを判別する
575
+ # 移動後の小線分が大線分の範囲内にあるかどうかをtrue/falseで取得する
576
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
577
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
578
+ #_d_:: selfの移動量
579
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
580
+ #返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
581
+ def in_bounds?(idx, big_segment, d, flag = false)
582
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
583
+ return self[idx].in_bounds?(big_segment[idx], d, flag)
584
+ end
585
+
586
+ #===小線分を移動させたとき、大線分が範囲内かどうかを判別して、その状態によって値を整数で返す
587
+ # 移動後の小線分の範囲が大線分の範囲内のときは0、
588
+ # マイナス方向で範囲外に出るときは-1、
589
+ # プラス方向で出るときは1を返す
590
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
591
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
592
+ #_d_:: selfの移動量
593
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
594
+ #返却値:: 判別の結果
595
+ def in_bounds_ex?(idx, big_segment, d, flag = false)
596
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
597
+ return self[idx].in_bounds_ex?(big_segment[idx], d, flag)
598
+ end
599
+
600
+ #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
601
+ # 移動後の小線分の範囲が大線分の範囲内のときは0、
602
+ # マイナス方向で範囲外に出るときは1、
603
+ # プラス方向で出るときは-1を返す
604
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
605
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
606
+ #_d_:: selfの移動量
607
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
608
+ #返却値:: 判別の結果
609
+ def in_bounds_rev?(idx, big_segment, d, flag = false)
610
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
611
+ return self[idx].in_bounds_rev?(big_segment[idx], d, flag)
612
+ end
613
+
614
+ #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
615
+ # 移動量が0のときは0、
616
+ # 移動後の小線分の範囲が大線分の範囲内のときは1、
617
+ # 範囲外に出るときは-1を返す
618
+ #_idx_:: 判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する
619
+ #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
620
+ #_d_:: selfの移動量
621
+ #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
622
+ #返却値:: 判別の結果
623
+ def in_bounds_rev_ex?(idx, big_segment, d, flag = false)
624
+ raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
625
+ return self[idx].in_bounds_rev_ex?(big_segment[idx], d, flag)
626
+ end
627
+ end
628
+
629
+ #==線分を構成するために使用する構造体
630
+ #min,maxは、逆に入っていてもコンストラクタで入れ替える
631
+ #_min_:: 線分の小さい方の値
632
+ #_max_:: 線分の大きい方の値
633
+ Segment = SegmentStruct.new(:min, :max)
634
+
635
+ class Segment
636
+ def initialize(*params)
637
+ super(*params)
638
+ self.min, self.max = self.max, self.min if self.min > self.max
639
+ end
640
+ end
641
+ end