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,433 +1,636 @@
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
- class Numeric
24
- #===自身の値を割合として、値を算出する
25
- #_base_:: 算出元の値
26
- #返却値:: baseのself割りの値を返す
27
- #
28
- #(例)self=0.5、base=1000のとき、1000*0.5=500が出力される
29
- def ratio(base)
30
- return self * base
31
- end
32
-
33
- #===自身の値をパーセンテージとして、値を算出する
34
- #_base_:: 算出元の値
35
- #返却値:: baseのself%の値を返す
36
- #
37
- #(例)self=10、base=100のとき、100*10/100(%)=10が出力される
38
- def percent(base)
39
- return self * base / 100
40
- end
41
-
42
- #ピクセル値をそのまま返す
43
- #返却値:: 自分自身を返す
44
- def px
45
- return self
46
- end
47
- end
48
-
49
- module Miyako
50
-
51
- #==レイアウト情報を示す構造体
52
- LayoutStruct = Struct.new(:pos, :size, :base, :snap, :on_move)
53
- #==スナップ構造体
54
- LayoutSnapStruct = Struct.new(:sprite, :children)
55
-
56
- #==レイアウト管理モジュール
57
- #位置情報やスナップ、座標丸めなどを管理する
58
- #本モジュールはmixinすることで機能する。
59
- #また、mixinする場合は、以下の処理を施すこと
60
- #1.クラスのinitializeメソッドの最初にinit_layoutメソッドを呼び出す
61
- #2.update_layout_positionメソッドを実装する
62
- #なお、本モジュールをmixinした場合は、インスタンス変数 @layout が予約される。
63
- #@layoutへのユーザアクセスは参照のみ許される。
64
- module Layout
65
- #===現在の位置情報を別のインスタンス変数に反映させるためのテンプレートメソッド
66
- #move や centering などのメソッドを呼び出した際に@layout[:pos]の値を反映させるときに使う
67
- #(例)@sprite.move(*@layout[:pos])
68
- def update_layout_position
69
- end
70
-
71
- #===レイアウト管理の初期化
72
- #mixin したクラスの initialize メソッド内で必ず呼び出しておくこと
73
- def init_layout
74
- @layout = LayoutStruct.new
75
- @layout.pos = Point.new(0, 0)
76
- @layout.size = Size.new(0, 0)
77
- @layout.base = Screen
78
- @layout.snap = LayoutSnapStruct.new(nil, Array.new)
79
- @layout.on_move = []
80
- end
81
-
82
- #===位置移動時に呼び出すブロックを管理する配列にアクセする
83
- #moveやleftメソッドを呼び出した時に評価したいブロックを渡すことで、付随処理を自律して行うことが出来る。
84
- #引数は、|self, x, y, dx, dy|の5つ。
85
- #各引数は、「レシーバ, 移動後x座標位置, 移動後y座標位置, x座標移動量, y座標移動量」の機能がある。
86
- #評価が行われるのは、left,outside_left,center,right,outside_right,top,outside_top,middle,bottom,outside_bottom
87
- #move,move_toの各メソッド。
88
- #返却値:: ブロック管理配列
89
- def on_move
90
- return @layout.on_move
91
- end
92
-
93
- #===mixinしたインスタンスの位置を左端(x軸)に移動させる
94
- #設置するとき、基準となる空間の内側に設置される
95
- #ブロックでは、数値を返却することで、左端からのマージンを設定できる(正の方向へ移動)
96
- #ブロック引数は、自分自身の幅
97
- #返却値:: 自分自身
98
- def left(&margin)
99
- base = @layout.base.rect
100
- t = @layout.pos[0]
101
- @layout.pos[0] = base[0] + (margin ? margin[base[2]].to_i : 0)
102
- @layout.snap.children.each{|c| c.left(&margin) }
103
- update_layout(@layout.pos[0]-t, 0)
104
- @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
105
- return self
106
- end
107
-
108
- #===mixinしたインスタンスの位置を左端(x軸)に移動させる
109
- #設置するとき、基準となる空間の外側に設置される
110
- #ブロックでは、数値を返却することで、左端からのマージンを設定できる(負の方向へ移動)
111
- #ブロック引数は、自分自身の幅
112
- #返却値:: 自分自身
113
- def outside_left(&margin)
114
- base = @layout.base.rect
115
- t = @layout.pos[0]
116
- @layout.pos[0] = base[0] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
117
- update_layout(@layout.pos[0]-t, 0)
118
- @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
119
- return self
120
- end
121
-
122
- #===mixinしたインスタンスの位置を中間(x軸)に移動させる
123
- #返却値:: 自分自身
124
- def center
125
- base = @layout.base.rect
126
- t = @layout.pos[0]
127
- @layout.pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
128
- update_layout(@layout.pos[0]-t, 0)
129
- @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
130
- return self
131
- end
132
-
133
- #===mixinしたインスタンスの位置を右端(x軸)に移動させる
134
- #設置するとき、基準となる空間の内側に設置される
135
- #ブロックでは、数値を返却することで、右端からのマージンを設定できる(負の方向へ移動)
136
- #ブロック引数は、自分自身の幅
137
- #返却値:: 自分自身
138
- def right(&margin)
139
- base = @layout.base.rect
140
- t = @layout.pos[0]
141
- @layout.pos[0] = base[0] + base[2] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
142
- update_layout(@layout.pos[0]-t, 0)
143
- @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
144
- return self
145
- end
146
-
147
- #===mixinしたインスタンスの位置を右端(x軸)に移動させる
148
- #設置するとき、基準となる空間の外側に設置される
149
- #ブロックでは、数値を返却することで、右端からのマージンを設定できる(正の方向へ移動)
150
- #ブロック引数は、自分自身の幅
151
- #返却値:: 自分自身
152
- def outside_right(&margin)
153
- base = @layout.base.rect
154
- t = @layout.pos[0]
155
- @layout.pos[0] = base[0] + base[2] + (margin ? margin[base[2]].to_i : 0)
156
- update_layout(@layout.pos[0]-t, 0)
157
- @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
158
- return self
159
- end
160
-
161
- #===mixinしたインスタンスの位置を上端(y軸)に移動させる
162
- #設置するとき、基準となる空間の内側に設置される
163
- #ブロックでは、数値を返却することで、上端からのマージンを設定できる(正の方向へ移動)
164
- #ブロック引数は、自分自身の幅
165
- #返却値:: 自分自身
166
- def top(&margin)
167
- base = @layout.base.rect
168
- t = @layout.pos[1]
169
- @layout.pos[1] = base[1] + (margin ? margin[base[3]].to_i : 0)
170
- update_layout(0, @layout.pos[1]-t)
171
- @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
172
- return self
173
- end
174
-
175
- #===mixinしたインスタンスの位置を上端(y軸)に移動させる
176
- #設置するとき、基準となる空間の内側に設置される
177
- #ブロックでは、数値を返却することで、上端からのマージンを設定できる(負の方向へ移動)
178
- #ブロック引数は、自分自身の幅
179
- #返却値:: 自分自身
180
- def outside_top(&margin)
181
- base = @layout.base.rect
182
- t = @layout.pos[1]
183
- @layout.pos[1] = base[1] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
184
- update_layout(0, @layout.pos[1]-t)
185
- @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
186
- return self
187
- end
188
-
189
- #===mixinしたインスタンスの位置を中間(y軸)に移動させる
190
- #返却値:: 自分自身
191
- def middle
192
- base = @layout.base.rect
193
- t = @layout.pos[1]
194
- @layout.pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
195
- update_layout(0, @layout.pos[1]-t)
196
- @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
197
- return self
198
- end
199
-
200
- #===mixinしたインスタンスの位置を下端(y軸)に移動させる
201
- #設置するとき、基準となる空間の内側に設置される
202
- #ブロックでは、数値を返却することで、下端からのマージンを設定できる(負の方向へ移動)
203
- #ブロック引数は、自分自身の幅
204
- #返却値:: 自分自身
205
- def bottom(&margin)
206
- base = @layout.base.rect
207
- t = @layout.pos[1]
208
- @layout.pos[1] = base[1] + base[3] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
209
- update_layout(0, @layout.pos[1]-t)
210
- @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
211
- return self
212
- end
213
-
214
- #===mixinしたインスタンスの位置を下端(y軸)に移動させる
215
- #設置するとき、基準となる空間の外側に設置される
216
- #ブロックでは、数値を返却することで、下端からのマージンを設定できる(正の方向へ移動)
217
- #ブロック引数は、自分自身の幅
218
- #返却値:: 自分自身
219
- def outside_bottom(&margin)
220
- base = @layout.base.rect
221
- t = @layout.pos[1]
222
- @layout.pos[1] = base[1] + base[3] + (margin ? margin[base[3]].to_i : 0)
223
- update_layout(0, @layout.pos[1]-t)
224
- @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
225
- return self
226
- end
227
-
228
- #===レイアウトに関するインスタンスを解放する
229
- #インスタンス変数 @layout 内のインスタンスを解放する
230
- def layout_dispose
231
- @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
232
- @layout.snap.children.each{|sc| sc.reset_snap }
233
- end
234
-
235
- #=== mixin されたインスタンスの x 座標の値を取得する
236
- #返却値:: x 座標の値(@layout[:pos][0]の値)
237
- def x
238
- return @layout.pos[0]
239
- end
240
-
241
- #=== mixin されたインスタンスの y 座標の値を取得する
242
- #返却値:: y 座標の値(@layout[:pos][1]の値)
243
- def y
244
- return @layout.pos[1]
245
- end
246
-
247
- #=== mixin されたインスタンスの幅を取得する
248
- #返却値:: インスタンスの幅(@layout[:size][0]の値)
249
- def w
250
- return @layout.size[0]
251
- end
252
-
253
- #=== mixin されたインスタンスの高さを取得する
254
- #返却値:: インスタンスの高さ(@layout[:size][1]の値)
255
- def h
256
- return @layout.size[1]
257
- end
258
-
259
- #=== mixin されたインスタンスの位置情報(x,yの値)を取得する
260
- #返却値:: インスタンスの位置情報(@layout[:pos]の値)
261
- def pos
262
- return @layout.pos
263
- end
264
-
265
- #=== mixin されたインスタンスのサイズ情報(w,hの値)を取得する
266
- #返却値:: インスタンスのサイズ情報(@layout[:size]の値)
267
- def size
268
- return @layout.size
269
- end
270
-
271
- #=== mixin されたインスタンスの表示上の幅を取得する
272
- #返却値:: インスタンスの幅(@layout[:size][0]の値)
273
- def ow
274
- return @layout.size[0]
275
- end
276
-
277
- #=== mixin されたインスタンスの表示上の高さを取得する
278
- #返却値:: インスタンスの高さ(@layout[:size][0]の値)
279
- def oh
280
- return @layout.size[1]
281
- end
282
-
283
- #===インスタンスのサイズをレイアウト情報に反映させる
284
- #このメソッドが呼び出されると、スナップ先のインスタンスの位置情報がリセットされることに注意
285
- #_w_:: インスタンスの幅(たとえば、Sprite#ow の値)
286
- #_h_:: インスタンスの幅(たとえば、Sprite#oh の値)
287
- #返却値:: 自分自身を返す
288
- def set_layout_size(w, h)
289
- @layout.size[0] = w
290
- @layout.size[1] = h
291
- return self
292
- end
293
-
294
- #===レイアウト情報の値を更新する
295
- #_dx_:: 位置の変化量(x方向)
296
- #_dx_:: 位置の変化量(y方向)
297
- def update_layout(dx, dy)
298
- update_layout_position
299
- @layout.snap.children.each{|sc| sc.update_layout(dx, dy) }
300
- end
301
-
302
- #===インスタンスの位置・大きさを求める
303
- #インスタンスの位置・大きさをRect構造体で求める
304
- #返却値:: Rect構造体
305
- def rect
306
- return Rect.new(@layout.pos[0], @layout.pos[1], @layout.size[0], @layout.size[1])
307
- end
308
-
309
- #===インスタンスのレイアウトを指定の別のインスタンスに依存(スナップ)させる
310
- #引数 spr で指定したインスタンスのレイアウト情報は、レシーバのレイアウト情報に依存した位置情報を算出される
311
- #デフォルトでは、画面にスナップされている状態になっている
312
- #_spr_:: 位置情報を依存させるインスタンス。デフォルトは nil (画面が対象になる)
313
- #返却値:: 自分自身を返す
314
- def snap(spr = nil)
315
- if spr
316
- @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
317
- @layout.snap.sprite = spr
318
- spr.add_snap_child(self)
319
- end
320
- @layout.base = @layout.snap.sprite || Screen
321
- return self
322
- end
323
-
324
- #===すべてのインスタンスとの依存関係を解消する
325
- #このメソッドが呼び出されると、スナップ先のインスタンスの位置情報がリセットされることに注意
326
- #返却値:: 自分自身を返す
327
- def reset_snap
328
- @layout.snap.sprite =nil
329
- @layout.base = Screen
330
- @layout.snap.children = Array.new
331
- return self
332
- end
333
-
334
- def add_snap_child(spr) #:nodoc:
335
- @layout.snap.children << spr unless @layout.snap.children.include?(spr)
336
- return self
337
- end
338
-
339
- def delete_snap_child(spr) #:nodoc:
340
- spr.each{|s| @layout.snap.children.delete(s) }
341
- return self
342
- end
343
-
344
- def get_snap_children #:nodoc:
345
- return @layout.snap.children
346
- end
347
-
348
- def set_snap_children(cs) #:nodoc:
349
- @layout.snap.children.each{|c| c.set_snap_sprite(nil) }
350
- @layout.snap.children = cs
351
- @layout.snap.children.each{|c| c.set_snap_sprite(self) }
352
- return self
353
- end
354
-
355
- def get_snap_sprite #:nodoc:
356
- return @layout.snap.sprite
357
- end
358
-
359
- def set_snap_sprite(ss) #:nodoc:
360
- @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
361
- @layout.snap.sprite = ss
362
- @layout.snap.sprite.add_snap_child(self) if @layout.snap.sprite
363
- return self
364
- end
365
-
366
- #===インスタンスを画面(スナップ先インスタンス)の中心に移動する
367
- #返却値:: 自分自身を返す
368
- def centering
369
- center
370
- middle
371
- return self
372
- end
373
-
374
- #===インスタンスを指定の移動量で移動させる
375
- #ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
376
- #_x_:: x 座標の移動量
377
- #_y_:: y 座標の移動量
378
- #返却値:: 自分自身を返す
379
- def move(x, y)
380
- end
381
-
382
- #===インスタンスを指定の位置に移動させる
383
- #ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
384
- #_x_:: 移動後の x 座標の位置
385
- #_y_:: 移動後の y 座標の位置
386
- #返却値:: 自分自身を返す
387
- def move_to(x, y, &block)
388
- end
389
-
390
- #===Segment構造体を生成する
391
- # 生成される線分は、x方向が[pos.x,pos.x+ow-1]、y方向が[pos.y,pos.y+oh-1]となる
392
- #返却値:: 生成したSegment構造体インスタンス
393
- def segment
394
- return Segment.new([@layout.pos[0],
395
- @layout.pos[0]+@layout.size[0]-1],
396
- [@layout.pos[1],
397
- @layout.pos[1]+@layout.size[1]-1])
398
- end
399
- end
400
-
401
- #==レイアウト空間クラス
402
- #画像を持たず、レイアウト空間のみを持つインスタンス
403
- #画像同士が離れているレイアウト構成を構築する際に用いる
404
- class LayoutSpace
405
- include SpriteBase
406
- include Animation
407
- include Layout
408
- include SingleEnumerable
409
- extend Forwardable
410
-
411
- attr_accessor :dp, :visible
412
-
413
- #===インスタンスを生成する
414
- #_size_:: インスタンスの大きさ[w,h]で指定する
415
- #返却値:: 生成されたインスタンスを返す
416
- def initialize(size)
417
- init_layout
418
- set_layout_size(*(size.to_a))
419
- end
420
-
421
- #===現在の画面の最大の大きさを矩形で取得する
422
- #但し、LayoutSpaceの場合は最大の大きさ=スプライトの大きさなので、rectと同じ値が得られる
423
- #返却値:: 生成された矩形(Rect構造体のインスタンス)
424
- def broad_rect
425
- return self.rect
426
- end
427
-
428
- #===インスタンスを解放させる
429
- def dispose
430
- layout_dispose
431
- end
432
- end
433
- 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
+ class Numeric
24
+ #===自身の値を割合として、値を算出する
25
+ #_base_:: 算出元の値
26
+ #返却値:: baseのself割りの値を返す
27
+ #
28
+ #(例)self=0.5、base=1000のとき、1000*0.5=500が出力される
29
+ def ratio(base)
30
+ return self * base
31
+ end
32
+
33
+ #===自身の値をパーセンテージとして、値を算出する
34
+ #_base_:: 算出元の値
35
+ #返却値:: baseのself%の値を返す
36
+ #
37
+ #(例)self=10、base=100のとき、100*10/100(%)=10が出力される
38
+ def percent(base)
39
+ return self * base / 100
40
+ end
41
+
42
+ #ピクセル値をそのまま返す
43
+ #返却値:: 自分自身を返す
44
+ def px
45
+ return self
46
+ end
47
+ end
48
+
49
+ module Miyako
50
+
51
+ #==レイアウト情報を示す構造体
52
+ LayoutStruct = Struct.new(:pos, :size, :base, :snap, :on_move)
53
+ #==スナップ構造体
54
+ LayoutSnapStruct = Struct.new(:sprite, :children)
55
+
56
+ #==レイアウト管理モジュール
57
+ #位置情報やスナップ、座標丸めなどを管理する
58
+ #本モジュールはmixinすることで機能する。
59
+ #また、mixinする場合は、以下の処理を施すこと
60
+ #1.クラスのinitializeメソッドの最初にinit_layoutメソッドを呼び出す
61
+ #2.update_layout_positionメソッドを実装する
62
+ #なお、本モジュールをmixinした場合は、インスタンス変数 @layout が予約される。
63
+ #@layoutへのユーザアクセスは参照のみ許される。
64
+ module Layout
65
+ #===現在の位置情報を別のインスタンス変数に反映させるためのテンプレートメソッド
66
+ #move や centering などのメソッドを呼び出した際に@layout[:pos]の値を反映させるときに使う
67
+ #(例)@sprite.move!(*@layout[:pos])
68
+ def update_layout_position
69
+ end
70
+
71
+ #===レイアウト管理の初期化
72
+ #mixin したクラスの initialize メソッド内で必ず呼び出しておくこと
73
+ def init_layout
74
+ @layout = LayoutStruct.new
75
+ @layout.pos = Point.new(0, 0)
76
+ @layout.size = Size.new(0, 0)
77
+ @layout.base = Screen
78
+ @layout.snap = LayoutSnapStruct.new(nil, Array.new)
79
+ @layout.on_move = []
80
+ end
81
+
82
+ #===レイアウト管理の複写
83
+ def copy_layout
84
+ tmp = @layout
85
+ @layout.pos = tmp.pos.dup
86
+ @layout.size = tmp.size.dup
87
+ @layout.on_move = tmp.on_move.dup
88
+
89
+ @layout.snap = tmp.snap.dup
90
+ # スナップ元との関係を張り直し(スナップ先が変わったので)
91
+ if @layout.snap.sprite
92
+ @layout.snap.sprite.delete_snap_child(self)
93
+ self.snap(@layout.snap.sprite)
94
+ end
95
+ @layout.snap.children = []
96
+ tmp.snap.children.each{|child| child.snap(self)}
97
+ end
98
+
99
+ #===位置移動時に呼び出すブロックを管理する配列にアクセする
100
+ #moveやleftメソッドを呼び出した時に評価したいブロックを渡すことで、
101
+ #付随処理を自律して行うことが出来る。
102
+ #引数は、|self, x, y, dx, dy|の5つ。
103
+ #各引数は、
104
+ # 「レシーバ, 移動後x座標位置, 移動後y座標位置, x座標移動量, y座標移動量」
105
+ #の機能がある。
106
+ #評価が行われるのは、
107
+ # left,outside_left,center,right,outside_right,top,
108
+ # outside_top,middle,bottom,outside_bottom,
109
+ # move,move_toの各メソッド。
110
+ #返却値:: ブロック管理配列
111
+ def on_move
112
+ return @layout.on_move
113
+ end
114
+
115
+ #===mixinしたインスタンスの位置を左端(x軸)に移動させる
116
+ #設置するとき、基準となる空間の内側に設置される
117
+ #ブロックでは、数値を返却することで、左端からのマージンを設定できる(正の方向へ移動)
118
+ #ブロック引数は、自分自身の幅
119
+ #返却値:: 自分自身
120
+ def left!(&margin)
121
+ base = @layout.base.rect
122
+ t = @layout.pos[0]
123
+ @layout.pos[0] = base[0] + (margin ? margin[base[2]].to_i : 0)
124
+ @layout.snap.children.each{|c| c.left(&margin) }
125
+ update_layout(@layout.pos[0]-t, 0)
126
+ @layout.on_move.each{|block|
127
+ block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
128
+ }
129
+ return self
130
+ end
131
+
132
+ #===mixinしたインスタンスの位置を左端(x軸)に移動させる
133
+ #設置するとき、基準となる空間の外側に設置される
134
+ #ブロックでは、数値を返却することで、左端からのマージンを設定できる(負の方向へ移動)
135
+ #ブロック引数は、自分自身の幅
136
+ #返却値:: 自分自身
137
+ def outside_left!(&margin)
138
+ base = @layout.base.rect
139
+ t = @layout.pos[0]
140
+ @layout.pos[0] = base[0] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
141
+ update_layout(@layout.pos[0]-t, 0)
142
+ @layout.on_move.each{|block|
143
+ block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
144
+ }
145
+ return self
146
+ end
147
+
148
+ #===mixinしたインスタンスの位置を中間(x軸)に移動させる
149
+ #返却値:: 自分自身
150
+ def center!
151
+ base = @layout.base.rect
152
+ t = @layout.pos[0]
153
+ @layout.pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
154
+ update_layout(@layout.pos[0]-t, 0)
155
+ @layout.on_move.each{|block|
156
+ block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
157
+ }
158
+ return self
159
+ end
160
+
161
+ #===mixinしたインスタンスの位置を右端(x軸)に移動させる
162
+ #設置するとき、基準となる空間の内側に設置される
163
+ #ブロックでは、数値を返却することで、右端からのマージンを設定できる(負の方向へ移動)
164
+ #ブロック引数は、自分自身の幅
165
+ #返却値:: 自分自身
166
+ def right!(&margin)
167
+ base = @layout.base.rect
168
+ t = @layout.pos[0]
169
+ @layout.pos[0] = base[0] + base[2] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
170
+ update_layout(@layout.pos[0]-t, 0)
171
+ @layout.on_move.each{|block|
172
+ block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
173
+ }
174
+ return self
175
+ end
176
+
177
+ #===mixinしたインスタンスの位置を右端(x軸)に移動させる
178
+ #設置するとき、基準となる空間の外側に設置される
179
+ #ブロックでは、数値を返却することで、右端からのマージンを設定できる(正の方向へ移動)
180
+ #ブロック引数は、自分自身の幅
181
+ #返却値:: 自分自身
182
+ def outside_right!(&margin)
183
+ base = @layout.base.rect
184
+ t = @layout.pos[0]
185
+ @layout.pos[0] = base[0] + base[2] + (margin ? margin[base[2]].to_i : 0)
186
+ update_layout(@layout.pos[0]-t, 0)
187
+ @layout.on_move.each{|block|
188
+ block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
189
+ }
190
+ return self
191
+ end
192
+
193
+ #===mixinしたインスタンスの位置を上端(y軸)に移動させる
194
+ #設置するとき、基準となる空間の内側に設置される
195
+ #ブロックでは、数値を返却することで、上端からのマージンを設定できる(正の方向へ移動)
196
+ #ブロック引数は、自分自身の幅
197
+ #返却値:: 自分自身
198
+ def top!(&margin)
199
+ base = @layout.base.rect
200
+ t = @layout.pos[1]
201
+ @layout.pos[1] = base[1] + (margin ? margin[base[3]].to_i : 0)
202
+ update_layout(0, @layout.pos[1]-t)
203
+ @layout.on_move.each{|block|
204
+ block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
205
+ }
206
+ return self
207
+ end
208
+
209
+ #===mixinしたインスタンスの位置を上端(y軸)に移動させる
210
+ #設置するとき、基準となる空間の内側に設置される
211
+ #ブロックでは、数値を返却することで、上端からのマージンを設定できる(負の方向へ移動)
212
+ #ブロック引数は、自分自身の幅
213
+ #返却値:: 自分自身
214
+ def outside_top!(&margin)
215
+ base = @layout.base.rect
216
+ t = @layout.pos[1]
217
+ @layout.pos[1] = base[1] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
218
+ update_layout(0, @layout.pos[1]-t)
219
+ @layout.on_move.each{|block|
220
+ block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
221
+ }
222
+ return self
223
+ end
224
+
225
+ #===mixinしたインスタンスの位置を中間(y軸)に移動させる
226
+ #返却値:: 自分自身
227
+ def middle!
228
+ base = @layout.base.rect
229
+ t = @layout.pos[1]
230
+ @layout.pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
231
+ update_layout(0, @layout.pos[1]-t)
232
+ @layout.on_move.each{|block|
233
+ block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
234
+ }
235
+ return self
236
+ end
237
+
238
+ #===mixinしたインスタンスの位置を下端(y軸)に移動させる
239
+ #設置するとき、基準となる空間の内側に設置される
240
+ #ブロックでは、数値を返却することで、下端からのマージンを設定できる(負の方向へ移動)
241
+ #ブロック引数は、自分自身の幅
242
+ #返却値:: 自分自身
243
+ def bottom!(&margin)
244
+ base = @layout.base.rect
245
+ t = @layout.pos[1]
246
+ @layout.pos[1] = base[1] + base[3] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
247
+ update_layout(0, @layout.pos[1]-t)
248
+ @layout.on_move.each{|block|
249
+ block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
250
+ }
251
+ return self
252
+ end
253
+
254
+ #===mixinしたインスタンスの位置を下端(y軸)に移動させる
255
+ #設置するとき、基準となる空間の外側に設置される
256
+ #ブロックでは、数値を返却することで、下端からのマージンを設定できる(正の方向へ移動)
257
+ #ブロック引数は、自分自身の幅
258
+ #返却値:: 自分自身
259
+ def outside_bottom!(&margin)
260
+ base = @layout.base.rect
261
+ t = @layout.pos[1]
262
+ @layout.pos[1] = base[1] + base[3] + (margin ? margin[base[3]].to_i : 0)
263
+ update_layout(0, @layout.pos[1]-t)
264
+ @layout.on_move.each{|block|
265
+ block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
266
+ }
267
+ return self
268
+ end
269
+
270
+ #===インスタンスを画面(スナップ先インスタンス)の中心に移動する
271
+ #返却値:: 自分自身を返す
272
+ def centering!
273
+ center!
274
+ middle!
275
+ return self
276
+ end
277
+
278
+ #===mixinしたインスタンスの位置を左端(x軸)に移動させたときの位置を返す
279
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
280
+ #基準となる空間の内側に設置されたとして算出する
281
+ #ブロックでは、数値を返却することで、左端からのマージンを設定できる(正の方向へ移動)
282
+ #ブロック引数は、自分自身の幅
283
+ #返却値:: 移動後の位置(Position構造体)
284
+ def left(&margin)
285
+ base = @layout.base.rect
286
+ pos = @layout.pos.dup
287
+ pos[0] = base[0] + (margin ? margin[base[2]].to_i : 0)
288
+ return pos
289
+ end
290
+
291
+ #===mixinしたインスタンスの位置を左端(x軸)に移動させたときの位置を返す
292
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
293
+ #基準となる空間の外側に設置されたとして算出する
294
+ #ブロックでは、数値を返却することで、左端からのマージンを設定できる(負の方向へ移動)
295
+ #ブロック引数は、自分自身の幅
296
+ #返却値:: 移動後の位置(Position構造体)
297
+ def outside_left(&margin)
298
+ base = @layout.base.rect
299
+ pos = @layout.pos.dup
300
+ pos[0] = base[0] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
301
+ return pos
302
+ end
303
+
304
+ #===mixinしたインスタンスの位置を中間(x軸)に移動させたときの位置を返す
305
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
306
+ #返却値:: 移動後の位置(Position構造体)
307
+ def center
308
+ base = @layout.base.rect
309
+ pos = @layout.pos.dup
310
+ pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
311
+ return pos
312
+ end
313
+
314
+ #===mixinしたインスタンスの位置を右端(x軸)に移動させたときの位置を返す
315
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
316
+ #基準となる空間の内側に設置されたとして算出する
317
+ #ブロックでは、数値を返却することで、右端からのマージンを設定できる(負の方向へ移動)
318
+ #ブロック引数は、自分自身の幅
319
+ #返却値:: 移動後の位置(Position構造体)
320
+ def right(&margin)
321
+ base = @layout.base.rect
322
+ pos = @layout.pos.dup
323
+ pos[0] = base[0] + base[2] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
324
+ return pos
325
+ end
326
+
327
+ #===mixinしたインスタンスの位置を右端(x軸)に移動させたときの位置を返す
328
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
329
+ #基準となる空間の外側に設置されたとして算出する
330
+ #ブロックでは、数値を返却することで、右端からのマージンを設定できる(正の方向へ移動)
331
+ #ブロック引数は、自分自身の幅
332
+ #返却値:: 移動後の位置(Position構造体)
333
+ def outside_right(&margin)
334
+ base = @layout.base.rect
335
+ pos = @layout.pos.dup
336
+ pos[0] = base[0] + base[2] + (margin ? margin[base[2]].to_i : 0)
337
+ return pos
338
+ end
339
+
340
+ #===mixinしたインスタンスの位置を上端(y軸)に移動させたときの位置を返す
341
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
342
+ #基準となる空間の内側に設置されたとして算出する
343
+ #ブロックでは、数値を返却することで、上端からのマージンを設定できる(正の方向へ移動)
344
+ #ブロック引数は、自分自身の幅
345
+ #返却値:: 移動後の位置(Position構造体)
346
+ def top(&margin)
347
+ base = @layout.base.rect
348
+ pos = @layout.pos.dup
349
+ pos[1] = base[1] + (margin ? margin[base[3]].to_i : 0)
350
+ return pos
351
+ end
352
+
353
+ #===mixinしたインスタンスの位置を上端(y軸)に移動させたときの位置を返す
354
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
355
+ #基準となる空間の外側に設置されたとして算出する
356
+ #ブロックでは、数値を返却することで、上端からのマージンを設定できる(負の方向へ移動)
357
+ #ブロック引数は、自分自身の幅
358
+ #返却値:: 移動後の位置(Position構造体)
359
+ def outside_top(&margin)
360
+ base = @layout.base.rect
361
+ pos = @layout.pos.dup
362
+ pos[1] = base[1] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
363
+ return pos
364
+ end
365
+
366
+ #===mixinしたインスタンスの位置を中間(y軸)に移動させたときの位置を返す
367
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
368
+ #返却値:: 移動後の位置(Position構造体)
369
+ def middle
370
+ base = @layout.base.rect
371
+ pos = @layout.pos.dup
372
+ pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
373
+ return pos
374
+ end
375
+
376
+ #===mixinしたインスタンスの位置を下端(y軸)に移動させたときの位置を返す
377
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
378
+ #基準となる空間の内側に設置されたとして算出する
379
+ #ブロックでは、数値を返却することで、下端からのマージンを設定できる(負の方向へ移動)
380
+ #ブロック引数は、自分自身の幅
381
+ #返却値:: 移動後の位置(Position構造体)
382
+ def bottom(&margin)
383
+ base = @layout.base.rect
384
+ pos = @layout.pos.dup
385
+ pos[1] = base[1] + base[3] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
386
+ return pos
387
+ end
388
+
389
+ #===mixinしたインスタンスの位置を下端(y軸)に移動させたときの位置を返す
390
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
391
+ #基準となる空間の外側に設置されたとして算出する
392
+ #ブロックでは、数値を返却することで、下端からのマージンを設定できる(正の方向へ移動)
393
+ #ブロック引数は、自分自身の幅
394
+ #返却値:: 移動後の位置(Position構造体)
395
+ def outside_bottom(&margin)
396
+ base = @layout.base.rect
397
+ pos = @layout.pos.dup
398
+ pos[1] = base[1] + base[3] + (margin ? margin[base[3]].to_i : 0)
399
+ return pos
400
+ end
401
+
402
+ #===インスタンスを画面(スナップ先インスタンス)の中心に移動したときの位置を返す
403
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
404
+ #返却値:: 移動後の位置(Position構造体)
405
+ def centering
406
+ base = @layout.base.rect
407
+ pos = @layout.pos.dup
408
+ pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
409
+ pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
410
+ return pos
411
+ end
412
+
413
+ #===レイアウトに関するインスタンスを解放する
414
+ #インスタンス変数 @layout 内のインスタンスを解放する
415
+ def layout_dispose
416
+ @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
417
+ @layout.snap.children.each{|sc| sc.reset_snap }
418
+ end
419
+
420
+ #=== mixin されたインスタンスの x 座標の値を取得する
421
+ #返却値:: x 座標の値(@layout[:pos][0]の値)
422
+ def x
423
+ return @layout.pos[0]
424
+ end
425
+
426
+ #=== mixin されたインスタンスの y 座標の値を取得する
427
+ #返却値:: y 座標の値(@layout[:pos][1]の値)
428
+ def y
429
+ return @layout.pos[1]
430
+ end
431
+
432
+ #=== mixin されたインスタンスの幅を取得する
433
+ #返却値:: インスタンスの幅(@layout[:size][0]の値)
434
+ def w
435
+ return @layout.size[0]
436
+ end
437
+
438
+ #=== mixin されたインスタンスの高さを取得する
439
+ #返却値:: インスタンスの高さ(@layout[:size][1]の値)
440
+ def h
441
+ return @layout.size[1]
442
+ end
443
+
444
+ #=== mixin されたインスタンスの位置情報(x,yの値)を取得する
445
+ #返却値:: インスタンスの位置情報(@layout[:pos]の値)
446
+ def pos
447
+ return @layout.pos
448
+ end
449
+
450
+ #=== mixin されたインスタンスのサイズ情報(w,hの値)を取得する
451
+ #返却値:: インスタンスのサイズ情報(@layout[:size]の値)
452
+ def size
453
+ return @layout.size
454
+ end
455
+
456
+ #=== mixin されたインスタンスの表示上の幅を取得する
457
+ #返却値:: インスタンスの幅(@layout[:size][0]の値)
458
+ def ow
459
+ return @layout.size[0]
460
+ end
461
+
462
+ #=== mixin されたインスタンスの表示上の高さを取得する
463
+ #返却値:: インスタンスの高さ(@layout[:size][0]の値)
464
+ def oh
465
+ return @layout.size[1]
466
+ end
467
+
468
+ #===インスタンスのサイズをレイアウト情報に反映させる
469
+ #このメソッドが呼び出されると、スナップ先のインスタンスの位置情報がリセットされることに注意
470
+ #_w_:: インスタンスの幅(たとえば、Sprite#ow の値)
471
+ #_h_:: インスタンスの幅(たとえば、Sprite#oh の値)
472
+ #返却値:: 自分自身を返す
473
+ def set_layout_size(w, h)
474
+ @layout.size[0] = w
475
+ @layout.size[1] = h
476
+ return self
477
+ end
478
+
479
+ #===レイアウト情報の値を更新する
480
+ #_dx_:: 位置の変化量(x方向)
481
+ #_dx_:: 位置の変化量(y方向)
482
+ def update_layout(dx, dy)
483
+ update_layout_position
484
+ @layout.snap.children.each{|sc| sc.update_layout(dx, dy) }
485
+ end
486
+
487
+ #===インスタンスの位置・大きさを求める
488
+ #インスタンスの位置・大きさをRect構造体で求める
489
+ #返却値:: Rect構造体
490
+ def rect
491
+ return Rect.new(@layout.pos[0], @layout.pos[1], @layout.size[0], @layout.size[1])
492
+ end
493
+
494
+ #===インスタンスのレイアウトを指定の別のインスタンスに依存(スナップ)させる
495
+ #引数 spr で指定したインスタンスのレイアウト情報は、レシーバのレイアウト情報に依存した位置情報を算出される
496
+ #デフォルトでは、画面にスナップされている状態になっている
497
+ #_spr_:: 位置情報を依存させるインスタンス。デフォルトは nil (画面が対象になる)
498
+ #返却値:: 自分自身を返す
499
+ def snap(spr = nil)
500
+ if spr
501
+ @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
502
+ @layout.snap.sprite = spr
503
+ spr.add_snap_child(self)
504
+ end
505
+ @layout.base = @layout.snap.sprite || Screen
506
+ return self
507
+ end
508
+
509
+ #===すべてのインスタンスとの依存関係を解消する
510
+ #このメソッドが呼び出されると、スナップ先のインスタンスの位置情報がリセットされることに注意
511
+ #返却値:: 自分自身を返す
512
+ def reset_snap
513
+ @layout.snap.sprite = nil
514
+ @layout.base = Screen
515
+ @layout.snap.children = Array.new
516
+ return self
517
+ end
518
+
519
+ def add_snap_child(spr) #:nodoc:
520
+ @layout.snap.children << spr unless @layout.snap.children.include?(spr)
521
+ return self
522
+ end
523
+
524
+ def delete_snap_child(spr) #:nodoc:
525
+ spr.each{|s| @layout.snap.children.delete(s) }
526
+ return self
527
+ end
528
+
529
+ def get_snap_children #:nodoc:
530
+ return @layout.snap.children
531
+ end
532
+
533
+ def set_snap_children(cs) #:nodoc:
534
+ @layout.snap.children.each{|c| c.set_snap_sprite(nil) }
535
+ @layout.snap.children = cs
536
+ @layout.snap.children.each{|c| c.set_snap_sprite(self) }
537
+ return self
538
+ end
539
+
540
+ def get_snap_sprite #:nodoc:
541
+ return @layout.snap.sprite
542
+ end
543
+
544
+ def set_snap_sprite(ss) #:nodoc:
545
+ @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
546
+ @layout.snap.sprite = ss
547
+ @layout.snap.sprite.add_snap_child(self) if @layout.snap.sprite
548
+ return self
549
+ end
550
+
551
+ #===インスタンスを指定の移動量で移動させる
552
+ #ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
553
+ #_x_:: x 座標の移動量
554
+ #_y_:: y 座標の移動量
555
+ #返却値:: 自分自身を返す
556
+ def move!(x, y)
557
+ end
558
+
559
+ #===インスタンスを指定の位置に移動させる
560
+ #ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
561
+ #_x_:: 移動後の x 座標の位置
562
+ #_y_:: 移動後の y 座標の位置
563
+ #返却値:: 自分自身を返す
564
+ def move_to!(x, y, &block)
565
+ end
566
+
567
+ #===インスタンスを指定の移動量で移動させた位置を返す
568
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
569
+ #自分自身の位置は変わらない
570
+ #_x_:: x 座標の移動量
571
+ #_y_:: y 座標の移動量
572
+ #返却値:: 更新後の値を設定したインスタンス
573
+ def move(x, y)
574
+ ret = @layout.pos.dup
575
+ ret.move!(x,y)
576
+ end
577
+
578
+ #===インスタンスを指定の位置に移動させた位置を返す
579
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
580
+ #自分自身の位置は変わらない
581
+ #_x_:: 移動後の x 座標の位置
582
+ #_y_:: 移動後の y 座標の位置
583
+ #返却値:: 更新後の値を設定したインスタンス
584
+ def move_to(x, y)
585
+ ret = @layout.pos.dup
586
+ ret.move_to!(x,y)
587
+ end
588
+
589
+ #===Segment構造体を生成する
590
+ # 生成される線分は、x方向が[pos.x,pos.x+ow-1]、y方向が[pos.y,pos.y+oh-1]となる
591
+ #返却値:: 生成したSegment構造体インスタンス
592
+ def segment
593
+ return Segment.new([@layout.pos[0],
594
+ @layout.pos[0]+@layout.size[0]-1],
595
+ [@layout.pos[1],
596
+ @layout.pos[1]+@layout.size[1]-1])
597
+ end
598
+ end
599
+
600
+ #==レイアウト空間クラス
601
+ #画像を持たず、レイアウト空間のみを持つインスタンス
602
+ #画像同士が離れているレイアウト構成を構築する際に用いる
603
+ class LayoutSpace
604
+ include SpriteBase
605
+ include Animation
606
+ include Layout
607
+ include SingleEnumerable
608
+ extend Forwardable
609
+
610
+ attr_accessor :dp, :visible
611
+
612
+ #===インスタンスを生成する
613
+ #_size_:: インスタンスの大きさ[w,h]で指定する
614
+ #返却値:: 生成されたインスタンスを返す
615
+ def initialize(size)
616
+ init_layout
617
+ set_layout_size(*(size.to_a))
618
+ end
619
+
620
+ def initialize_copy(obj) #:nodoc:
621
+ copy_layout
622
+ end
623
+
624
+ #===現在の画面の最大の大きさを矩形で取得する
625
+ #但し、LayoutSpaceの場合は最大の大きさ=スプライトの大きさなので、rectと同じ値が得られる
626
+ #返却値:: 生成された矩形(Rect構造体のインスタンス)
627
+ def broad_rect
628
+ return self.rect
629
+ end
630
+
631
+ #===インスタンスを解放させる
632
+ def dispose
633
+ layout_dispose
634
+ end
635
+ end
636
+ end