ruby-miyako 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/README +1115 -0
  2. data/Rakefile +7 -0
  3. data/defines.h +144 -0
  4. data/extconf.rb +44 -0
  5. data/extern.h +29 -0
  6. data/img/cursor.png +0 -0
  7. data/img/cursors.png +0 -0
  8. data/img/dice.png +0 -0
  9. data/img/wait_cursor.png +0 -0
  10. data/img/win_base.png +0 -0
  11. data/img/window.png +0 -0
  12. data/install_miyako.rb +87 -0
  13. data/lib/Miyako/API/audio.rb +584 -0
  14. data/lib/Miyako/API/basic_data.rb +1026 -0
  15. data/lib/Miyako/API/bitmap.rb +534 -0
  16. data/lib/Miyako/API/choices.rb +481 -0
  17. data/lib/Miyako/API/collision.rb +638 -0
  18. data/lib/Miyako/API/diagram.rb +586 -0
  19. data/lib/Miyako/API/drawing.rb +151 -0
  20. data/lib/Miyako/API/exceptions.rb +105 -0
  21. data/lib/Miyako/API/fixedmap.rb +462 -0
  22. data/lib/Miyako/API/font.rb +430 -0
  23. data/lib/Miyako/API/input.rb +456 -0
  24. data/lib/Miyako/API/layout.rb +644 -0
  25. data/lib/Miyako/API/map.rb +583 -0
  26. data/lib/Miyako/API/map_event.rb +222 -0
  27. data/lib/Miyako/API/modules.rb +357 -0
  28. data/lib/Miyako/API/movie.rb +166 -0
  29. data/lib/Miyako/API/parts.rb +188 -0
  30. data/lib/Miyako/API/plane.rb +205 -0
  31. data/lib/Miyako/API/screen.rb +341 -0
  32. data/lib/Miyako/API/shape.rb +443 -0
  33. data/lib/Miyako/API/sprite.rb +773 -0
  34. data/lib/Miyako/API/sprite_animation.rb +494 -0
  35. data/lib/Miyako/API/sprite_list.rb +1135 -0
  36. data/lib/Miyako/API/spriteunit.rb +168 -0
  37. data/lib/Miyako/API/story.rb +350 -0
  38. data/lib/Miyako/API/textbox.rb +773 -0
  39. data/lib/Miyako/API/utility.rb +419 -0
  40. data/lib/Miyako/API/viewport.rb +190 -0
  41. data/lib/Miyako/API/yuki.rb +1180 -0
  42. data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
  43. data/lib/Miyako/EXT/raster_scroll.rb +138 -0
  44. data/lib/Miyako/EXT/slides.rb +157 -0
  45. data/lib/Miyako/miyako.rb +201 -0
  46. data/lib/Miyako/miyako_require_only.rb +35 -0
  47. data/logo/EGSR_logo.png +0 -0
  48. data/logo/EGSR_logo_bg.png +0 -0
  49. data/logo/EGSR_logo_fg.png +0 -0
  50. data/logo/EGSR_title_banner.png +0 -0
  51. data/logo/EGSR_title_logo.png +0 -0
  52. data/logo/miyako.png +0 -0
  53. data/logo/miyako_banner.png +0 -0
  54. data/logo/space.png +0 -0
  55. data/miyako_basicdata.c +484 -0
  56. data/miyako_bitmap.c +1225 -0
  57. data/miyako_collision.c +403 -0
  58. data/miyako_drawing.c +187 -0
  59. data/miyako_font.c +334 -0
  60. data/miyako_hsv.c +830 -0
  61. data/miyako_input_audio.c +254 -0
  62. data/miyako_layout.c +191 -0
  63. data/miyako_no_katana.c +1086 -0
  64. data/miyako_sprite2.c +431 -0
  65. data/miyako_transform.c +438 -0
  66. data/miyako_utility.c +288 -0
  67. data/sample/Animation1/m1ku.rb +68 -0
  68. data/sample/Animation1/m1ku_arm_0.png +0 -0
  69. data/sample/Animation1/m1ku_arm_1.png +0 -0
  70. data/sample/Animation1/m1ku_arm_2.png +0 -0
  71. data/sample/Animation1/m1ku_arm_3.png +0 -0
  72. data/sample/Animation1/m1ku_back.jpg +0 -0
  73. data/sample/Animation1/m1ku_body.png +0 -0
  74. data/sample/Animation1/m1ku_eye_0.png +0 -0
  75. data/sample/Animation1/m1ku_eye_1.png +0 -0
  76. data/sample/Animation1/m1ku_eye_2.png +0 -0
  77. data/sample/Animation1/m1ku_eye_3.png +0 -0
  78. data/sample/Animation1/m1ku_hair_front.png +0 -0
  79. data/sample/Animation1/m1ku_hair_rear.png +0 -0
  80. data/sample/Animation1/readme.txt +72 -0
  81. data/sample/Animation2/lex.rb +96 -0
  82. data/sample/Animation2/lex_back.png +0 -0
  83. data/sample/Animation2/lex_body.png +0 -0
  84. data/sample/Animation2/lex_roadroller.png +0 -0
  85. data/sample/Animation2/lex_wheel_0.png +0 -0
  86. data/sample/Animation2/lex_wheel_1.png +0 -0
  87. data/sample/Animation2/lex_wheel_2.png +0 -0
  88. data/sample/Animation2/readme.txt +72 -0
  89. data/sample/Animation2/song_title.png +0 -0
  90. data/sample/Diagram_sample/back.png +0 -0
  91. data/sample/Diagram_sample/chr01.png +0 -0
  92. data/sample/Diagram_sample/chr02.png +0 -0
  93. data/sample/Diagram_sample/cursor.png +0 -0
  94. data/sample/Diagram_sample/diagram_sample_yuki2.rb +329 -0
  95. data/sample/Diagram_sample/readme.txt +90 -0
  96. data/sample/Diagram_sample/wait_cursor.png +0 -0
  97. data/sample/Room3/blue.rb +297 -0
  98. data/sample/Room3/ending.rb +180 -0
  99. data/sample/Room3/green.rb +220 -0
  100. data/sample/Room3/image/akamatsu.png +0 -0
  101. data/sample/Room3/image/aoyama.png +0 -0
  102. data/sample/Room3/image/congra.png +0 -0
  103. data/sample/Room3/image/congratulation.png +0 -0
  104. data/sample/Room3/image/congratulation_bg.png +0 -0
  105. data/sample/Room3/image/cursor.png +0 -0
  106. data/sample/Room3/image/midori.png +0 -0
  107. data/sample/Room3/image/mittsu_no_oheya.png +0 -0
  108. data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
  109. data/sample/Room3/image/room_blue.png +0 -0
  110. data/sample/Room3/image/room_green.png +0 -0
  111. data/sample/Room3/image/room_red.png +0 -0
  112. data/sample/Room3/image/start.png +0 -0
  113. data/sample/Room3/image/three_doors.png +0 -0
  114. data/sample/Room3/image/wait_cursor.png +0 -0
  115. data/sample/Room3/main.rb +120 -0
  116. data/sample/Room3/main_component.rb +59 -0
  117. data/sample/Room3/readme.txt +76 -0
  118. data/sample/Room3/red.rb +227 -0
  119. data/sample/Room3/room3.rb +25 -0
  120. data/sample/Room3/title.rb +184 -0
  121. data/sample/ball_action_sample.rb +204 -0
  122. data/sample/blit_rop.rb +70 -0
  123. data/sample/cairo_sample.rb +25 -0
  124. data/sample/circle_collision_test.rb +66 -0
  125. data/sample/collision_test.rb +33 -0
  126. data/sample/collision_test2.rb +108 -0
  127. data/sample/fixed_map_test/cursor.png +0 -0
  128. data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
  129. data/sample/fixed_map_test/map.csv +19 -0
  130. data/sample/fixed_map_test/map_01.png +0 -0
  131. data/sample/fixed_map_test/mapchip.csv +23 -0
  132. data/sample/fixed_map_test/monster.png +0 -0
  133. data/sample/fixed_map_test/readme.txt +72 -0
  134. data/sample/map_test/chara.rb +58 -0
  135. data/sample/map_test/chr1.png +0 -0
  136. data/sample/map_test/cursor.png +0 -0
  137. data/sample/map_test/main_parts.rb +69 -0
  138. data/sample/map_test/main_scene.rb +153 -0
  139. data/sample/map_test/map.png +0 -0
  140. data/sample/map_test/map2.png +0 -0
  141. data/sample/map_test/map_layer.csv +127 -0
  142. data/sample/map_test/map_manager.rb +75 -0
  143. data/sample/map_test/map_test.rb +23 -0
  144. data/sample/map_test/mapchip.csv +21 -0
  145. data/sample/map_test/oasis.rb +71 -0
  146. data/sample/map_test/readme.txt +89 -0
  147. data/sample/map_test/route.rb +157 -0
  148. data/sample/map_test/sea.png +0 -0
  149. data/sample/map_test/town.rb +74 -0
  150. data/sample/map_test/wait_cursor.png +0 -0
  151. data/sample/map_test/window.png +0 -0
  152. data/sample/polygon_test.rb +35 -0
  153. data/sample/rasterscroll.rb +25 -0
  154. data/sample/takahashi.rb +42 -0
  155. data/sample/text.png +0 -0
  156. data/sample/textbox_sample.rb +192 -0
  157. data/sample/transform.rb +54 -0
  158. data/sample/utility_test.rb +73 -0
  159. data/sample/utility_test2.rb +61 -0
  160. data/sample/utility_test3.rb +64 -0
  161. data/sample/utility_test4.rb +73 -0
  162. data/uninstall_miyako.rb +19 -0
  163. data/win/miyako_no_katana.so +0 -0
  164. metadata +216 -0
@@ -0,0 +1,644 @@
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 = tmp.dup
86
+ @layout.pos = Point.new(*tmp.pos)
87
+ @layout.size = Size.new(*tmp.size)
88
+ @layout.on_move = tmp.on_move.dup
89
+
90
+ @layout.snap = tmp.snap.dup
91
+ # スナップ関係を解消
92
+ if @layout.snap.sprite
93
+ @layout.snap.sprite.delete_snap_child(self)
94
+ @layout.snap.sprite = nil
95
+ @layout.base = Screen
96
+ end
97
+ @layout.snap.children = []
98
+ end
99
+
100
+ #===位置移動時に呼び出すブロックを管理する配列にアクセする
101
+ #moveやleftメソッドを呼び出した時に評価したいブロックを渡すことで、
102
+ #付随処理を自律して行うことが出来る。
103
+ #引数は、|self, x, y, dx, dy|の5つ。
104
+ #各引数は、
105
+ # 「レシーバ, 移動後x座標位置, 移動後y座標位置, x座標移動量, y座標移動量」
106
+ #の機能がある。
107
+ #評価が行われるのは、
108
+ # left,outside_left,center,right,outside_right,top,
109
+ # outside_top,middle,bottom,outside_bottom,
110
+ # move,move_toの各メソッド。
111
+ #返却値:: ブロック管理配列
112
+ def on_move
113
+ return @layout.on_move
114
+ end
115
+
116
+ #===mixinしたインスタンスの位置を左端(x軸)に移動させる
117
+ #設置するとき、基準となる空間の内側に設置される
118
+ #ブロックでは、数値を返却することで、左端からのマージンを設定できる(正の方向へ移動)
119
+ #ブロック引数は、自分自身の幅
120
+ #返却値:: 自分自身
121
+ def left!(&margin)
122
+ base = @layout.base.rect
123
+ t = @layout.pos[0]
124
+ @layout.pos[0] = base[0] + (margin ? margin[base[2]].to_i : 0)
125
+ @layout.snap.children.each{|c| c.left(&margin) }
126
+ update_layout(@layout.pos[0]-t, 0)
127
+ @layout.on_move.each{|block|
128
+ block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
129
+ }
130
+ return self
131
+ end
132
+
133
+ #===mixinしたインスタンスの位置を左端(x軸)に移動させる
134
+ #設置するとき、基準となる空間の外側に設置される
135
+ #ブロックでは、数値を返却することで、左端からのマージンを設定できる(負の方向へ移動)
136
+ #ブロック引数は、自分自身の幅
137
+ #返却値:: 自分自身
138
+ def outside_left!(&margin)
139
+ base = @layout.base.rect
140
+ t = @layout.pos[0]
141
+ @layout.pos[0] = base[0] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
142
+ update_layout(@layout.pos[0]-t, 0)
143
+ @layout.on_move.each{|block|
144
+ block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
145
+ }
146
+ return self
147
+ end
148
+
149
+ #===mixinしたインスタンスの位置を中間(x軸)に移動させる
150
+ #返却値:: 自分自身
151
+ def center!
152
+ base = @layout.base.rect
153
+ t = @layout.pos[0]
154
+ @layout.pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
155
+ update_layout(@layout.pos[0]-t, 0)
156
+ @layout.on_move.each{|block|
157
+ block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
158
+ }
159
+ return self
160
+ end
161
+
162
+ #===mixinしたインスタンスの位置を右端(x軸)に移動させる
163
+ #設置するとき、基準となる空間の内側に設置される
164
+ #ブロックでは、数値を返却することで、右端からのマージンを設定できる(負の方向へ移動)
165
+ #ブロック引数は、自分自身の幅
166
+ #返却値:: 自分自身
167
+ def right!(&margin)
168
+ base = @layout.base.rect
169
+ t = @layout.pos[0]
170
+ @layout.pos[0] = base[0] + base[2] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
171
+ update_layout(@layout.pos[0]-t, 0)
172
+ @layout.on_move.each{|block|
173
+ block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
174
+ }
175
+ return self
176
+ end
177
+
178
+ #===mixinしたインスタンスの位置を右端(x軸)に移動させる
179
+ #設置するとき、基準となる空間の外側に設置される
180
+ #ブロックでは、数値を返却することで、右端からのマージンを設定できる(正の方向へ移動)
181
+ #ブロック引数は、自分自身の幅
182
+ #返却値:: 自分自身
183
+ def outside_right!(&margin)
184
+ base = @layout.base.rect
185
+ t = @layout.pos[0]
186
+ @layout.pos[0] = base[0] + base[2] + (margin ? margin[base[2]].to_i : 0)
187
+ update_layout(@layout.pos[0]-t, 0)
188
+ @layout.on_move.each{|block|
189
+ block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
190
+ }
191
+ return self
192
+ end
193
+
194
+ #===mixinしたインスタンスの位置を上端(y軸)に移動させる
195
+ #設置するとき、基準となる空間の内側に設置される
196
+ #ブロックでは、数値を返却することで、上端からのマージンを設定できる(正の方向へ移動)
197
+ #ブロック引数は、自分自身の幅
198
+ #返却値:: 自分自身
199
+ def top!(&margin)
200
+ base = @layout.base.rect
201
+ t = @layout.pos[1]
202
+ @layout.pos[1] = base[1] + (margin ? margin[base[3]].to_i : 0)
203
+ update_layout(0, @layout.pos[1]-t)
204
+ @layout.on_move.each{|block|
205
+ block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
206
+ }
207
+ return self
208
+ end
209
+
210
+ #===mixinしたインスタンスの位置を上端(y軸)に移動させる
211
+ #設置するとき、基準となる空間の内側に設置される
212
+ #ブロックでは、数値を返却することで、上端からのマージンを設定できる(負の方向へ移動)
213
+ #ブロック引数は、自分自身の幅
214
+ #返却値:: 自分自身
215
+ def outside_top!(&margin)
216
+ base = @layout.base.rect
217
+ t = @layout.pos[1]
218
+ @layout.pos[1] = base[1] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
219
+ update_layout(0, @layout.pos[1]-t)
220
+ @layout.on_move.each{|block|
221
+ block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
222
+ }
223
+ return self
224
+ end
225
+
226
+ #===mixinしたインスタンスの位置を中間(y軸)に移動させる
227
+ #返却値:: 自分自身
228
+ def middle!
229
+ base = @layout.base.rect
230
+ t = @layout.pos[1]
231
+ @layout.pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
232
+ update_layout(0, @layout.pos[1]-t)
233
+ @layout.on_move.each{|block|
234
+ block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
235
+ }
236
+ return self
237
+ end
238
+
239
+ #===mixinしたインスタンスの位置を下端(y軸)に移動させる
240
+ #設置するとき、基準となる空間の内側に設置される
241
+ #ブロックでは、数値を返却することで、下端からのマージンを設定できる(負の方向へ移動)
242
+ #ブロック引数は、自分自身の幅
243
+ #返却値:: 自分自身
244
+ def bottom!(&margin)
245
+ base = @layout.base.rect
246
+ t = @layout.pos[1]
247
+ @layout.pos[1] = base[1] + base[3] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
248
+ update_layout(0, @layout.pos[1]-t)
249
+ @layout.on_move.each{|block|
250
+ block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
251
+ }
252
+ return self
253
+ end
254
+
255
+ #===mixinしたインスタンスの位置を下端(y軸)に移動させる
256
+ #設置するとき、基準となる空間の外側に設置される
257
+ #ブロックでは、数値を返却することで、下端からのマージンを設定できる(正の方向へ移動)
258
+ #ブロック引数は、自分自身の幅
259
+ #返却値:: 自分自身
260
+ def outside_bottom!(&margin)
261
+ base = @layout.base.rect
262
+ t = @layout.pos[1]
263
+ @layout.pos[1] = base[1] + base[3] + (margin ? margin[base[3]].to_i : 0)
264
+ update_layout(0, @layout.pos[1]-t)
265
+ @layout.on_move.each{|block|
266
+ block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
267
+ }
268
+ return self
269
+ end
270
+
271
+ #===インスタンスを画面(スナップ先インスタンス)の中心に移動する
272
+ #返却値:: 自分自身を返す
273
+ def centering!
274
+ center!
275
+ middle!
276
+ return self
277
+ end
278
+
279
+ #===mixinしたインスタンスの位置を左端(x軸)に移動させたときの位置を返す
280
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
281
+ #基準となる空間の内側に設置されたとして算出する
282
+ #ブロックでは、数値を返却することで、左端からのマージンを設定できる(正の方向へ移動)
283
+ #ブロック引数は、自分自身の幅
284
+ #返却値:: 移動後の位置(Position構造体)
285
+ def left(&margin)
286
+ base = @layout.base.rect
287
+ pos = @layout.pos.dup
288
+ pos[0] = base[0] + (margin ? margin[base[2]].to_i : 0)
289
+ return pos
290
+ end
291
+
292
+ #===mixinしたインスタンスの位置を左端(x軸)に移動させたときの位置を返す
293
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
294
+ #基準となる空間の外側に設置されたとして算出する
295
+ #ブロックでは、数値を返却することで、左端からのマージンを設定できる(負の方向へ移動)
296
+ #ブロック引数は、自分自身の幅
297
+ #返却値:: 移動後の位置(Position構造体)
298
+ def outside_left(&margin)
299
+ base = @layout.base.rect
300
+ pos = @layout.pos.dup
301
+ pos[0] = base[0] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
302
+ return pos
303
+ end
304
+
305
+ #===mixinしたインスタンスの位置を中間(x軸)に移動させたときの位置を返す
306
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
307
+ #返却値:: 移動後の位置(Position構造体)
308
+ def center
309
+ base = @layout.base.rect
310
+ pos = @layout.pos.dup
311
+ pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
312
+ return pos
313
+ end
314
+
315
+ #===mixinしたインスタンスの位置を右端(x軸)に移動させたときの位置を返す
316
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
317
+ #基準となる空間の内側に設置されたとして算出する
318
+ #ブロックでは、数値を返却することで、右端からのマージンを設定できる(負の方向へ移動)
319
+ #ブロック引数は、自分自身の幅
320
+ #返却値:: 移動後の位置(Position構造体)
321
+ def right(&margin)
322
+ base = @layout.base.rect
323
+ pos = @layout.pos.dup
324
+ pos[0] = base[0] + base[2] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
325
+ return pos
326
+ end
327
+
328
+ #===mixinしたインスタンスの位置を右端(x軸)に移動させたときの位置を返す
329
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
330
+ #基準となる空間の外側に設置されたとして算出する
331
+ #ブロックでは、数値を返却することで、右端からのマージンを設定できる(正の方向へ移動)
332
+ #ブロック引数は、自分自身の幅
333
+ #返却値:: 移動後の位置(Position構造体)
334
+ def outside_right(&margin)
335
+ base = @layout.base.rect
336
+ pos = @layout.pos.dup
337
+ pos[0] = base[0] + base[2] + (margin ? margin[base[2]].to_i : 0)
338
+ return pos
339
+ end
340
+
341
+ #===mixinしたインスタンスの位置を上端(y軸)に移動させたときの位置を返す
342
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
343
+ #基準となる空間の内側に設置されたとして算出する
344
+ #ブロックでは、数値を返却することで、上端からのマージンを設定できる(正の方向へ移動)
345
+ #ブロック引数は、自分自身の幅
346
+ #返却値:: 移動後の位置(Position構造体)
347
+ def top(&margin)
348
+ base = @layout.base.rect
349
+ pos = @layout.pos.dup
350
+ pos[1] = base[1] + (margin ? margin[base[3]].to_i : 0)
351
+ return pos
352
+ end
353
+
354
+ #===mixinしたインスタンスの位置を上端(y軸)に移動させたときの位置を返す
355
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
356
+ #基準となる空間の外側に設置されたとして算出する
357
+ #ブロックでは、数値を返却することで、上端からのマージンを設定できる(負の方向へ移動)
358
+ #ブロック引数は、自分自身の幅
359
+ #返却値:: 移動後の位置(Position構造体)
360
+ def outside_top(&margin)
361
+ base = @layout.base.rect
362
+ pos = @layout.pos.dup
363
+ pos[1] = base[1] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
364
+ return pos
365
+ end
366
+
367
+ #===mixinしたインスタンスの位置を中間(y軸)に移動させたときの位置を返す
368
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
369
+ #返却値:: 移動後の位置(Position構造体)
370
+ def middle
371
+ base = @layout.base.rect
372
+ pos = @layout.pos.dup
373
+ pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
374
+ return pos
375
+ end
376
+
377
+ #===mixinしたインスタンスの位置を下端(y軸)に移動させたときの位置を返す
378
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
379
+ #基準となる空間の内側に設置されたとして算出する
380
+ #ブロックでは、数値を返却することで、下端からのマージンを設定できる(負の方向へ移動)
381
+ #ブロック引数は、自分自身の幅
382
+ #返却値:: 移動後の位置(Position構造体)
383
+ def bottom(&margin)
384
+ base = @layout.base.rect
385
+ pos = @layout.pos.dup
386
+ pos[1] = base[1] + base[3] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
387
+ return pos
388
+ end
389
+
390
+ #===mixinしたインスタンスの位置を下端(y軸)に移動させたときの位置を返す
391
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
392
+ #基準となる空間の外側に設置されたとして算出する
393
+ #ブロックでは、数値を返却することで、下端からのマージンを設定できる(正の方向へ移動)
394
+ #ブロック引数は、自分自身の幅
395
+ #返却値:: 移動後の位置(Position構造体)
396
+ def outside_bottom(&margin)
397
+ base = @layout.base.rect
398
+ pos = @layout.pos.dup
399
+ pos[1] = base[1] + base[3] + (margin ? margin[base[3]].to_i : 0)
400
+ return pos
401
+ end
402
+
403
+ #===インスタンスを画面(スナップ先インスタンス)の中心に移動したときの位置を返す
404
+ #但し、移動したときの位置を返すだけで、自身の位置は変わらない
405
+ #返却値:: 移動後の位置(Position構造体)
406
+ def centering
407
+ base = @layout.base.rect
408
+ pos = @layout.pos.dup
409
+ pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
410
+ pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
411
+ return pos
412
+ end
413
+
414
+ #===レイアウトに関するインスタンスを解放する
415
+ #インスタンス変数 @layout 内のインスタンスを解放する
416
+ def layout_dispose
417
+ @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
418
+ @layout.snap.children.each{|sc| sc.reset_snap }
419
+ end
420
+
421
+ #=== mixin されたインスタンスの x 座標の値を取得する
422
+ #返却値:: x 座標の値(@layout[:pos][0]の値)
423
+ def x
424
+ return @layout.pos[0]
425
+ end
426
+
427
+ #=== mixin されたインスタンスの y 座標の値を取得する
428
+ #返却値:: y 座標の値(@layout[:pos][1]の値)
429
+ def y
430
+ return @layout.pos[1]
431
+ end
432
+
433
+ #=== mixin されたインスタンスの幅を取得する
434
+ #返却値:: インスタンスの幅(@layout[:size][0]の値)
435
+ def w
436
+ return @layout.size[0]
437
+ end
438
+
439
+ #=== mixin されたインスタンスの高さを取得する
440
+ #返却値:: インスタンスの高さ(@layout[:size][1]の値)
441
+ def h
442
+ return @layout.size[1]
443
+ end
444
+
445
+ #=== mixin されたインスタンスの位置情報(x,yの値)を取得する
446
+ #返却値:: インスタンスの位置情報(@layout[:pos]の値)
447
+ def pos
448
+ return @layout.pos.dup
449
+ end
450
+
451
+ #=== mixin されたインスタンスのサイズ情報(w,hの値)を取得する
452
+ #返却値:: インスタンスのサイズ情報(@layout[:size]の値)
453
+ def size
454
+ return @layout.size.dup
455
+ end
456
+
457
+ #=== mixin されたインスタンスの表示上の幅を取得する
458
+ #返却値:: インスタンスの幅(@layout[:size][0]の値)
459
+ def ow
460
+ return @layout.size[0]
461
+ end
462
+
463
+ #=== mixin されたインスタンスの表示上の高さを取得する
464
+ #返却値:: インスタンスの高さ(@layout[:size][0]の値)
465
+ def oh
466
+ return @layout.size[1]
467
+ end
468
+
469
+ #===インスタンスのサイズをレイアウト情報に反映させる
470
+ #このメソッドが呼び出されると、スナップ先のインスタンスの位置情報がリセットされることに注意
471
+ #_w_:: インスタンスの幅(たとえば、Sprite#ow の値)
472
+ #_h_:: インスタンスの幅(たとえば、Sprite#oh の値)
473
+ #返却値:: 自分自身を返す
474
+ def set_layout_size(w, h)
475
+ @layout.size[0] = w
476
+ @layout.size[1] = h
477
+ return self
478
+ end
479
+
480
+ #===レイアウト情報の値を更新する
481
+ #_dx_:: 位置の変化量(x方向)
482
+ #_dx_:: 位置の変化量(y方向)
483
+ def update_layout(dx, dy)
484
+ update_layout_position
485
+ @layout.snap.children.each{|sc| sc.update_layout(dx, dy) }
486
+ end
487
+
488
+ #===インスタンスの位置・大きさを求める
489
+ #インスタンスの位置・大きさをRect構造体で求める
490
+ #返却値:: Rect構造体
491
+ def rect
492
+ return Rect.new(@layout.pos[0], @layout.pos[1], @layout.size[0], @layout.size[1])
493
+ end
494
+
495
+ #===インスタンスのレイアウトを指定の別のインスタンスに依存(スナップ)させる
496
+ #引数 spr で指定したインスタンスのレイアウト情報は、レシーバのレイアウト情報に依存した位置情報を算出される
497
+ #デフォルトでは、画面にスナップされている状態になっている
498
+ #_spr_:: 位置情報を依存させるインスタンス。デフォルトは nil (画面が対象になる)
499
+ #返却値:: 自分自身を返す
500
+ def snap(spr = nil)
501
+ if spr
502
+ @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
503
+ @layout.snap.sprite = spr
504
+ spr.add_snap_child(self)
505
+ end
506
+ @layout.base = @layout.snap.sprite || Screen
507
+ return self
508
+ end
509
+
510
+ #===すべてのインスタンスとの依存関係を解消する
511
+ #このメソッドが呼び出されると、スナップ先のインスタンスの位置情報がリセットされることに注意
512
+ #返却値:: 自分自身を返す
513
+ def reset_snap
514
+ @layout.snap.sprite = nil
515
+ @layout.base = Screen
516
+ @layout.snap.children = Array.new
517
+ return self
518
+ end
519
+
520
+ #===すでに指定したスプライトがスナップ元として登録されているかどうか確認する
521
+ #返却値:: スナップ元として登録されていればtrue、登録されていなければfalse
522
+ def include_snap_child?(spr)
523
+ @layout.snap.children.include?(spr)
524
+ return self
525
+ end
526
+
527
+ def add_snap_child(spr) #:nodoc:
528
+ @layout.snap.children << spr unless @layout.snap.children.include?(spr)
529
+ return self
530
+ end
531
+
532
+ def delete_snap_child(spr) #:nodoc:
533
+ spr.each{|s| @layout.snap.children.delete(s) }
534
+ return self
535
+ end
536
+
537
+ def get_snap_children #:nodoc:
538
+ return @layout.snap.children
539
+ end
540
+
541
+ def set_snap_children(cs) #:nodoc:
542
+ @layout.snap.children.each{|c| c.set_snap_sprite(nil) }
543
+ @layout.snap.children = cs
544
+ @layout.snap.children.each{|c| c.set_snap_sprite(self) }
545
+ return self
546
+ end
547
+
548
+ def get_snap_sprite #:nodoc:
549
+ return @layout.snap.sprite
550
+ end
551
+
552
+ def set_snap_sprite(ss) #:nodoc:
553
+ @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
554
+ @layout.snap.sprite = ss
555
+ @layout.snap.sprite.add_snap_child(self) if @layout.snap.sprite
556
+ return self
557
+ end
558
+
559
+ #===インスタンスを指定の移動量で移動させる
560
+ #ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
561
+ #_x_:: x 座標の移動量
562
+ #_y_:: y 座標の移動量
563
+ #返却値:: 自分自身を返す
564
+ def move!(x, y)
565
+ end
566
+
567
+ #===インスタンスを指定の位置に移動させる
568
+ #ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
569
+ #_x_:: 移動後の x 座標の位置
570
+ #_y_:: 移動後の y 座標の位置
571
+ #返却値:: 自分自身を返す
572
+ def move_to!(x, y, &block)
573
+ end
574
+
575
+ #===インスタンスを指定の移動量で移動させた位置を返す
576
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
577
+ #自分自身の位置は変わらない
578
+ #_x_:: x 座標の移動量
579
+ #_y_:: y 座標の移動量
580
+ #返却値:: 更新後の値を設定したインスタンス
581
+ def move(x, y)
582
+ ret = @layout.pos.dup
583
+ ret.move!(x,y)
584
+ end
585
+
586
+ #===インスタンスを指定の位置に移動させた位置を返す
587
+ #引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す
588
+ #自分自身の位置は変わらない
589
+ #_x_:: 移動後の x 座標の位置
590
+ #_y_:: 移動後の y 座標の位置
591
+ #返却値:: 更新後の値を設定したインスタンス
592
+ def move_to(x, y)
593
+ ret = @layout.pos.dup
594
+ ret.move_to!(x,y)
595
+ end
596
+
597
+ #===Segment構造体を生成する
598
+ # 生成される線分は、x方向が[pos.x,pos.x+ow-1]、y方向が[pos.y,pos.y+oh-1]となる
599
+ #返却値:: 生成したSegments構造体インスタンス
600
+ def segment
601
+ return Segments.new([@layout.pos[0],
602
+ @layout.pos[0]+@layout.size[0]-1],
603
+ [@layout.pos[1],
604
+ @layout.pos[1]+@layout.size[1]-1])
605
+ end
606
+ end
607
+
608
+ #==レイアウト空間クラス
609
+ #画像を持たず、レイアウト空間のみを持つインスタンス
610
+ #画像同士が離れているレイアウト構成を構築する際に用いる
611
+ class LayoutSpace
612
+ include SpriteBase
613
+ include Animation
614
+ include Layout
615
+ include SingleEnumerable
616
+ extend Forwardable
617
+
618
+ attr_accessor :dp, :visible
619
+
620
+ #===インスタンスを生成する
621
+ #_size_:: インスタンスの大きさ[w,h]で指定する
622
+ #返却値:: 生成されたインスタンスを返す
623
+ def initialize(size)
624
+ init_layout
625
+ set_layout_size(*(size.to_a))
626
+ end
627
+
628
+ def initialize_copy(obj) #:nodoc:
629
+ copy_layout
630
+ end
631
+
632
+ #===現在の画面の最大の大きさを矩形で取得する
633
+ #但し、LayoutSpaceの場合は最大の大きさ=スプライトの大きさなので、rectと同じ値が得られる
634
+ #返却値:: 生成された矩形(Rect構造体のインスタンス)
635
+ def broad_rect
636
+ return self.rect
637
+ end
638
+
639
+ #===インスタンスを解放させる
640
+ def dispose
641
+ layout_dispose
642
+ end
643
+ end
644
+ end