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.
- data/README +275 -20
- data/extern.h +21 -1
- data/install_miyako.rb +5 -3
- data/lib/Miyako/API/audio.rb +11 -6
- data/lib/Miyako/API/basic_data.rb +0 -985
- data/lib/Miyako/API/bitmap.rb +19 -22
- data/lib/Miyako/API/choices.rb +203 -69
- data/lib/Miyako/API/collision.rb +451 -9
- data/lib/Miyako/API/color.rb +177 -0
- data/lib/Miyako/API/diagram.rb +18 -20
- data/lib/Miyako/API/fixedmap.rb +207 -73
- data/lib/Miyako/API/font.rb +111 -18
- data/lib/Miyako/API/i_yuki.rb +1201 -0
- data/lib/Miyako/API/input.rb +65 -0
- data/lib/Miyako/API/layout.rb +41 -29
- data/lib/Miyako/API/map.rb +202 -157
- data/lib/Miyako/API/map_event.rb +86 -19
- data/lib/Miyako/API/map_struct.rb +268 -0
- data/lib/Miyako/API/modules.rb +136 -37
- data/lib/Miyako/API/movie.rb +8 -8
- data/lib/Miyako/API/parts.rb +63 -20
- data/lib/Miyako/API/plane.rb +4 -4
- data/lib/Miyako/API/screen.rb +16 -8
- data/lib/Miyako/API/sprite.rb +290 -23
- data/lib/Miyako/API/sprite_animation.rb +23 -11
- data/lib/Miyako/API/sprite_list.rb +406 -183
- data/lib/Miyako/API/story.rb +4 -65
- data/lib/Miyako/API/struct_point.rb +157 -0
- data/lib/Miyako/API/struct_rect.rb +233 -0
- data/lib/Miyako/API/struct_segment.rb +641 -0
- data/lib/Miyako/API/struct_size.rb +158 -0
- data/lib/Miyako/API/struct_square.rb +253 -0
- data/lib/Miyako/API/textbox.rb +49 -35
- data/lib/Miyako/API/viewport.rb +5 -5
- data/lib/Miyako/API/wait_counter.rb +350 -0
- data/lib/Miyako/API/yuki.rb +95 -60
- data/lib/Miyako/EXT/raster_scroll.rb +30 -8
- data/lib/Miyako/EXT/slides.rb +6 -6
- data/lib/Miyako/miyako.rb +25 -11
- data/lib/miyako.rb +28 -0
- data/lib/miyako_require_only.rb +35 -0
- data/miyako_basicdata.c +201 -17
- data/miyako_collision.c +315 -6
- data/miyako_diagram.c +331 -0
- data/miyako_drawing.c +26 -7
- data/miyako_font.c +259 -129
- data/miyako_input_audio.c +24 -14
- data/miyako_layout.c +106 -8
- data/miyako_no_katana.c +398 -171
- data/miyako_sprite2.c +275 -38
- data/miyako_transform.c +113 -107
- data/miyako_utility.c +34 -48
- data/miyako_yuki.c +241 -0
- data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
- data/sample/Room3/blue.rb +19 -19
- data/sample/Room3/green.rb +9 -9
- data/sample/Room3/main.rb +12 -12
- data/sample/Room3/red.rb +12 -12
- data/sample/Room3/title.rb +15 -10
- data/sample/collision_test2.rb +2 -1
- data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
- data/sample/map_test/main_scene.rb +12 -10
- data/sample/map_test/map_manager.rb +14 -13
- data/sample/rasterscroll.rb +5 -5
- data/sample/takahashi.rb +3 -3
- data/sample/textbox_sample.rb +7 -6
- data/sample/transform.rb +2 -1
- data/uninstall_miyako.rb +4 -1
- data/win/miyako_no_katana.so +0 -0
- metadata +15 -4
- data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
- 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
|