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,222 @@
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
+ require 'csv'
24
+ require 'forwardable'
25
+
26
+ module Miyako
27
+ #==マップ上のイベント全体を管理するクラス
28
+ #Map/FixedMapクラス内で使用する
29
+ #使い方:
30
+ #
31
+ #(1)インスタンスを生成する
32
+ #
33
+ #em = MapEventManager.new
34
+ #
35
+ #(2)MapEventクラスとIDを登録する
36
+ #
37
+ #(例)MapEventモジュールをmixinしたクラスXを、ID=0のイベントとして登録
38
+ #
39
+ #em.add(0, X)
40
+ #
41
+ #(3)Map/FixedMapクラスインスタンス生成時に引数として渡す
42
+ #
43
+ #@map = Map.new(...,em)
44
+ #
45
+ #(注)登録するIDは、イベントレイヤー上の番号と対応しておくこと
46
+ class MapEventManager
47
+ #===インスタンスを生成する
48
+ #_map_obj_:: Managerが属するMap/FixedMapクラスのインスタンス
49
+ #返却値:: 生成されたインスタンス
50
+ def initialize
51
+ @map = nil
52
+ @id2event = Hash.new
53
+ end
54
+
55
+ def initialize_copy(obj) #:nodoc:
56
+ @map = @map.dup if @map
57
+ @id2event = @id2event.dup
58
+ end
59
+
60
+ def set(map) #:nodoc:
61
+ @map = map
62
+ end
63
+
64
+ #===イベントクラスをマップに追加登録する
65
+ #_id_:: マップ(イベントレイヤ)上の番号。
66
+ #イベントレイヤ上に存在しない番号を渡してもエラーや警告は発しない
67
+ #_event_:: イベントクラス。クラスのインスタンスではないことに注意!
68
+ #返却値:: 自分自身を返す
69
+ def add(id, event)
70
+ @id2event[id] = event
71
+ return self
72
+ end
73
+
74
+ #===イベントが登録されているかを確認する
75
+ #引数で渡した番号に対応するイベントクラスが登録されているかどうかを確認する
76
+ #_id_:: イベントクラスに対応した番号
77
+ #返却値:: イベントクラスが登録されている時はtrueを返す
78
+ def include?(id)
79
+ raise MiyakoError, "This MapEventManager instance is not set Map/FixedMap instance!" unless @map
80
+ return @id2event.has_key?(id)
81
+ end
82
+
83
+ #===イベントのインスタンスを生成する(番号指定)
84
+ #インスタンス生成と同時に、マップ上の座標を渡して初期位置を設定する
85
+ #登録していないIDを指定するとエラーになる
86
+ #
87
+ #設置は、マップ上の座標に設置する。表示上の座標ではない事に注意。
88
+ #_id_:: イベントクラスと登録した際の番号
89
+ #_x_:: イベントを設置する位置(X座標)
90
+ #_y_:: イベントを設置する位置(Y座標)
91
+ #返却値:: 生成したインスタンス
92
+ def create(id, x = 0, y = 0)
93
+ raise MiyakoError, "This MapEventManager instance is not set Map/FixedMap instance!" unless @map
94
+ raise MiyakoError, "Unknown Map Event ID! : #{id}" unless include?(id)
95
+ return @id2event[id].new(@map, x, y)
96
+ end
97
+
98
+ #===すべての登録済みイベントクラスの登録を解除する
99
+ def clear
100
+ @id2event.keys.each{|k| @id2event[k] = nil }
101
+ end
102
+
103
+ def dispose
104
+ @map = nil
105
+ @id2event.clear
106
+ @id2event = nil
107
+ end
108
+ end
109
+
110
+ #==マップ上のイベントを管理するモジュール
111
+ #実際に使う際にはmix-inして使う
112
+ module MapEvent
113
+ include SpriteBase
114
+ include Animation
115
+
116
+ #===イベントのインスタンスを作成する
117
+ #引数として渡せるX,Y座標の値は、表示上ではなく理論上の座標位置
118
+ #_map_obj_:: 関連づけられたMap/FixedMapクラスのインスタンス
119
+ #_x_:: マップ上のX座標の値。デフォルトは0
120
+ #_y_:: マップ上のY座標の値。デフォルトは0
121
+ #返却値:: 生成されたインスタンス
122
+ def initialize(map_obj, x = 0, y = 0)
123
+ init(map_obj, x, y)
124
+ end
125
+
126
+ #===イベント生成時のテンプレートメソッド
127
+ #イベントクラスからインスタンスが生成された時の初期化処理を実装する
128
+ #_map_obj_:: 関連づけられたMap/FixedMapクラスのインスタンス
129
+ #_x_:: マップ上のX座標の値
130
+ #_y_:: マップ上のY座標の値
131
+ def init(map_obj, x, y)
132
+ end
133
+
134
+ #===インスタンス内の表示やデータを更新するテンプレートメソッド
135
+ #マップ画像が更新された時に呼び出される
136
+ #_map_obj_:: インスタンスが組み込まれているMap/FixedMapクラスのインスタンス
137
+ #_events_:: マップに登録されているイベントインスタンスの配列
138
+ #_params_:: 開発者が明示的に用意した引数。内容はハッシュ
139
+ def update(map_obj, events, params)
140
+ end
141
+
142
+ #===イベントを指定の分量で移動させる(テンプレートメソッド)
143
+ #_dx_:: 移動量(x座標)。単位はピクセル
144
+ #_dy_:: 移動量(y座標)。単位はピクセル
145
+ #返却値:: 自分自身を返す
146
+ def move!(dx,dy)
147
+ return self
148
+ end
149
+
150
+ #===イベントを指定の位置へ移動させる(テンプレートメソッド)
151
+ #_x_:: 移動先の位置(x座標)。単位はピクセル
152
+ #_y_:: 移動先の位置(y座標)。単位はピクセル
153
+ #返却値:: 自分自身を返す
154
+ def move_to!(x,y)
155
+ return self
156
+ end
157
+
158
+ #===イベントを指定の分量で移動させたときの値を求める(テンプレートメソッド)
159
+ #_dx_:: 移動量(x座標)。単位はピクセル
160
+ #_dy_:: 移動量(y座標)。単位はピクセル
161
+ #返却値:: 移動した位置のインスタンスを返す
162
+ def move(dx,dy)
163
+ return Position.new(0,0)
164
+ end
165
+
166
+ #===イベントを指定の位置へ移動させたときの値を求める(テンプレートメソッド)
167
+ #_x_:: 移動先の位置(x座標)。単位はピクセル
168
+ #_y_:: 移動先の位置(y座標)。単位はピクセル
169
+ #返却値:: 移動した位置のインスタンスを返す
170
+ def move_to(x,y)
171
+ return Position.new(0,0)
172
+ end
173
+
174
+ #===イベント発生可否問い合わせ(テンプレートメソッド)
175
+ #イベント発生が可能なときはtrueを返す(その後、startメソッドを呼び出す)処理を実装する
176
+ #_param_:: 問い合わせに使用するパラメータ群。デフォルトはnil
177
+ #返却値:: イベント発生可能ならばtrue
178
+ def met?(*params)
179
+ return false
180
+ end
181
+
182
+ #===画面に画像を描画する(テンプレートメソッド)
183
+ #イベントで所持している画像を描画するメソッドを実装する
184
+ #(イベント内部で用意している画像の描画用テンプレートメソッド)
185
+ def render
186
+ end
187
+
188
+ #===イベントを発生させる(テンプレートメソッド)
189
+ #ここに、イベント発生イベントを実装する。更新はupdateメソッドに実装する
190
+ #_param_:: イベント発生に必要なパラメータ群。デフォルトはnil
191
+ #返却値:: 自分自身を返す
192
+ def start(*params)
193
+ return self
194
+ end
195
+
196
+ #===イベントを停止・終了させる(テンプレートメソッド)
197
+ #ここに、イベント停止・終了イベントを実装する。更新はupdateメソッドに実装する
198
+ #_param_:: イベント発生に必要なパラメータ群。デフォルトはnil
199
+ #返却値:: 自分自身を返す
200
+ def stop(*params)
201
+ return self
202
+ end
203
+
204
+ #===イベント発生中問い合わせ(テンプレートメソッド)
205
+ #ここに、イベント発生中の問い合わせ処理を実装する。
206
+ #_param_:: あとで書く
207
+ #返却値:: イベント発生中の時はtrue
208
+ def executing?
209
+ return false
210
+ end
211
+
212
+ #===イベント終了後の後処理(テンプレートメソッド)
213
+ #ここに、イベント終了後の後処理を実装する。
214
+ def final
215
+ end
216
+
217
+ #===イベントに使用しているインスタンスを解放する(テンプレートメソッド)
218
+ #ここに、インスタンス解放処理を実装する。
219
+ def dispose
220
+ end
221
+ end
222
+ end
@@ -0,0 +1,357 @@
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
+ =begin rdoc
25
+ ==基本スプライトモジュール
26
+ スプライトの基本メソッドで構成されるテンプレートモジュール
27
+ =end
28
+ module SpriteBase
29
+ #===スプライトインスタンスを取得するメソッドのテンプレート
30
+ #_data_:: あとで書く
31
+ #返却値:: 自分自身を返す
32
+ def to_sprite(data = nil)
33
+ return self
34
+ end
35
+
36
+ #===SpriteUnit構造体を取得するメソッドのテンプレート
37
+ #返却値:: nilを返す
38
+ def to_unit
39
+ return nil
40
+ end
41
+
42
+ #===描画可能・不可状態を返すメソッドのテンプレート
43
+ #返却値:: falseを返す
44
+ def visible
45
+ return false
46
+ end
47
+
48
+ #===描画可能・不可状態を設定するメソッドのテンプレート
49
+ #返却値:: falseを返す
50
+ def visible=(v)
51
+ return self
52
+ end
53
+
54
+ #===描画可能状態にするメソッドのテンプレート
55
+ def show
56
+ self.visible = true
57
+ end
58
+
59
+ #===描画不可能状態にするメソッドのテンプレート
60
+ def hide
61
+ self.visible = false
62
+ end
63
+
64
+ #===領域の矩形を取得するメソッドのテンプレート
65
+ #返却値:: nilを返す
66
+ def rect
67
+ return nil
68
+ end
69
+
70
+ #===領域の最大矩形を取得するメソッドのテンプレート
71
+ #返却値:: nilを返す
72
+ def broad_rect
73
+ return nil
74
+ end
75
+
76
+ #===画像(Bitmapクラスのインスタンス)を取得するメソッドのテンプレート
77
+ #返却値:: nilを返す
78
+ def bitmap
79
+ return nil
80
+ end
81
+
82
+ #===画像内での描画開始位置(x座標)を取得するメソッドのテンプレート
83
+ #返却値:: 0を返す
84
+ def ox
85
+ return 0
86
+ end
87
+
88
+ #===画像内での描画開始位置(y座標)を取得するメソッドのテンプレート
89
+ #返却値:: 0を返す
90
+ def oy
91
+ return 0
92
+ end
93
+
94
+ #===画面への描画を指示するメソッドのテンプレート
95
+ #_block_:: 呼び出し時にブロック付き呼び出しが行われたときのブロック本体。呼び先に渡すことが出来る。ブロックがなければnilが入る
96
+ #返却値:: 自分自身を返す
97
+ def render(&block)
98
+ return self
99
+ end
100
+
101
+ #===画像への描画を指示するメソッドのテンプレート
102
+ #_dst_:: 対象の画像
103
+ #_block_:: 呼び出し時にブロック付き呼び出しが行われたときのブロック本体。呼び先に渡すことが出来る。ブロックがなければnilが入る
104
+ #返却値:: 自分自身を返す
105
+ def render_to(dst, &block)
106
+ return self
107
+ end
108
+ end
109
+
110
+ =begin rdoc
111
+ ==基本アニメーションモジュール
112
+ アニメーションの基本メソッドで構成されるテンプレートモジュール
113
+ =end
114
+ module Animation
115
+ #===アニメーションを開始するメソッドのテンプレート
116
+ #返却値:: 自分自身を返す
117
+ def start
118
+ return self
119
+ end
120
+
121
+ #===アニメーションを停止するメソッドのテンプレート
122
+ #返却値:: 自分自身を返す
123
+ def stop
124
+ return self
125
+ end
126
+
127
+ #===アニメーションパターンを先頭に戻すメソッドのテンプレート
128
+ #返却値:: 自分自身を返す
129
+ def reset
130
+ return self
131
+ end
132
+
133
+ #===アニメーションを更新するメソッドのテンプレート
134
+ #返却値:: falseを返す(アニメーションパターンが更新されたときにtrueを返す)
135
+ def update_animation
136
+ return false
137
+ end
138
+ end
139
+
140
+ #==複数スプライト管理(配列)機能を追加するモジュール
141
+ #配列にスプライトとして最低限の機能を追加する。
142
+ #また、独自にswapなどのメソッドを追加。
143
+ #render、render_toを用意し、一気に描画が可能。配列の要素順に描画される。
144
+ #各要素の位置関係は関与していない(そこがPartsとの違い)
145
+ module SpriteArray
146
+ include SpriteBase
147
+ include Animation
148
+ include Enumerable
149
+
150
+ #===各要素からスプライト以外の要素を取り除いた配列を作成する
151
+ #SpriteBaseモジュール、もしくはSpriteArrayモジュールをインクルードしていない要素を削除した配列を返す
152
+ #登録されている名前順の配列になる。
153
+ #返却値:: 生成したスプライトを返す
154
+ def sprite_only
155
+ self.select{|e| e.class.include?(SpriteBase) || e.class.include?(SpriteArray)}
156
+ end
157
+
158
+ #===各要素からスプライト以外の要素を取り除いた配列を破壊的に作成する
159
+ #SpriteBaseモジュール、もしくはSpriteArrayモジュールをインクルードしていない要素を削除する
160
+ #登録されている名前順の配列になる。
161
+ #返却値:: 自分自身を返す
162
+ def sprite_only!
163
+ self.delete_if{|e| !e.class.include?(SpriteBase) && !e.class.include?(SpriteArray)}
164
+ end
165
+
166
+ #===配列要素を複製したコピー配列を取得する
167
+ #通常、インスタンスの複写に使われるdup,cloneメソッドは、同じ配列要素を見ているが、
168
+ #このメソッドでは、要素も複製したものが複製される(各要素のdeep_copyメソッドを呼び出す)
169
+ #返却値:: 複写した配列を返す
170
+ def deep_copy
171
+ self.map{|e| e.deep_copy }
172
+ end
173
+
174
+ #===各要素の描画可能状態を取得する
175
+ #各要素のvisibleメソッドの値を配列で取得する。
176
+ #登録されている名前順の配列になる。
177
+ #返却値:: true/falseの配列
178
+ def visible
179
+ return self.sprite_only.map{|e| e.visible}
180
+ end
181
+
182
+ #===各要素の描画可能状態を一気に設定する
183
+ #すべての要素のvisibleメソッドの値を変更する
184
+ #登録されている名前順の配列になる。
185
+ #_v_:: 設定する値(true/false)
186
+ #返却値:: 自分自身を返す
187
+ def visible=(v)
188
+ self.sprite_only.each{|e| e.visible = v}
189
+ return self
190
+ end
191
+
192
+ #===各要素の位置を変更する(変化量を指定)
193
+ #ブロックを渡したとき、戻り値として[更新したdx,更新したdy]とした配列を返すと、
194
+ #それがその要素での移動量となる。
195
+ #ブロックの引数は、|要素, インデックス(0,1,2,...), dx, dy|となる。
196
+ #(例)q=[a, b, c]
197
+ # #各スプライトの位置=すべて(10,15)
198
+ # q.move!(20,25) => aの位置:(30,40)
199
+ # bの位置:(30,40)
200
+ # cの位置:(30,40)
201
+ # q.move!(20,25){|e,i,dx,dy|
202
+ # [i*dx, i*dy]
203
+ # }
204
+ # => aの位置:(10,15)
205
+ # bの位置:(30,40)
206
+ # cの位置:(50,65)
207
+ #_dx_:: 移動量(x方向)。単位はピクセル
208
+ #_dy_:: 移動量(y方向)。単位はピクセル
209
+ #返却値:: 自分自身を返す
210
+ def move!(dx, dy)
211
+ if block_given?
212
+ self.sprite_only.each_with_index{|e, i| e.move!(*(yield e, i, dx, dy))}
213
+ else
214
+ self.sprite_only.each{|e| e.move!(dx, dy)}
215
+ end
216
+ self
217
+ end
218
+
219
+ #===各要素の位置を変更する(変化量を指定)
220
+ #ブロックを渡したとき、戻り値として[更新したdx,更新したdy]とした配列を返すと、
221
+ #それがその要素での移動量となる。
222
+ #ブロックの引数は、|要素, インデックス(0,1,2,...), x, y|となる。
223
+ #(例)q=[a, b, c]
224
+ # #各スプライトの位置=すべて(10,15)
225
+ # q.move!(20,25) => aの位置:(20,25)
226
+ # bの位置:(20,25)
227
+ # cの位置:(20,25)
228
+ # q.move!(20,25){|e,i,dx,dy|
229
+ # [i*dx, i*dy]
230
+ # }
231
+ # => aの位置:( 0, 0)
232
+ # bの位置:(20,25)
233
+ # cの位置:(40,50)
234
+ #_x_:: 移動先位置(x方向)。単位はピクセル
235
+ #_y_:: 移動先位置(y方向)。単位はピクセル
236
+ #返却値:: 自分自身を返す
237
+ def move_to!(x, y)
238
+ if block_given?
239
+ self.sprite_only.each_with_index{|e, i| e.move_to!(*(yield e, i, x, y))}
240
+ else
241
+ self.sprite_only.each{|e| e.move_to!(x, y)}
242
+ end
243
+ self
244
+ end
245
+
246
+ #===描く画像のアニメーションを開始する
247
+ #各要素のstartメソッドを呼び出す
248
+ #返却値:: 自分自身を返す
249
+ def start
250
+ self.sprite_only.each{|sprite| sprite.start }
251
+ return self
252
+ end
253
+
254
+ #===描く画像のアニメーションを停止する
255
+ #各要素のstopメソッドを呼び出す
256
+ #返却値:: 自分自身を返す
257
+ def stop
258
+ self.sprite_only.each{|sprite| sprite.stop }
259
+ return self
260
+ end
261
+
262
+ #===描く画像のアニメーションを先頭パターンに戻す
263
+ #各要素のresetメソッドを呼び出す
264
+ #返却値:: 自分自身を返す
265
+ def reset
266
+ self.sprite_only.each{|sprite| sprite.reset }
267
+ return self
268
+ end
269
+
270
+ #===描く画像のアニメーションを更新する
271
+ #各要素のupdate_animationメソッドを呼び出す
272
+ #返却値:: 描く画像のupdate_spriteメソッドを呼び出した結果を配列で返す
273
+ def update_animation
274
+ self.sprite_only.map{|e|
275
+ e.update_animation
276
+ }
277
+ end
278
+
279
+ #===指定した要素の内容を入れ替える
280
+ #配列の先頭から順にrenderメソッドを呼び出す。
281
+ #描画するインスタンスは、引数がゼロのrenderメソッドを持っているもののみ(持っていないときは呼び出さない)
282
+ #_idx1,idx2_:: 入れ替え対象の配列要素インデックス
283
+ #返却値:: 自分自身を帰す
284
+ def swap(idx1, idx2)
285
+ l = self.length
286
+ raise MiyakoValueError, "Illegal index range! : idx1:#{idx1}" if (idx1 >= l || idx1 < -l)
287
+ raise MiyakoValueError, "Illegal index range! : idx2:#{idx2}" if (idx2 >= l || idx2 < -l)
288
+ self[idx1], self[idx2] = self[idx2], self[idx1]
289
+ return self
290
+ end
291
+
292
+ #===配列の要素を画面に描画する
293
+ #配列の先頭から順にrenderメソッドを呼び出す。
294
+ #描画するインスタンスは、SpriteBaseモジュールがmixinされているクラスのみ
295
+ #返却値:: 自分自身を帰す
296
+ def render
297
+ self.sprite_only.each{|e| e.render }
298
+ return self
299
+ end
300
+
301
+ #===配列の要素を対象の画像に描画する
302
+ #配列の先頭から順にrender_toメソッドを呼び出す。
303
+ #_dst_:: 描画対象の画像インスタンス
304
+ #返却値:: 自分自身を帰す
305
+ def render_to(dst)
306
+ self.each{|e| e.render_to(dst) }
307
+ return self
308
+ end
309
+ end
310
+
311
+ #==ディープコピーを実装するモジュール
312
+ #dup、cloneとは違い、「ディープコピー(配列などの要素も複製するコピー)」を実装するためのモジュール。
313
+ module DeepCopy
314
+ #===複製を取得する
315
+ #ただし、再定義しているクラス(例:Arrayクラス)以外はdupメソッドの結果
316
+ #返却値:: 複写したインスタンスを返す
317
+ def deep_dup
318
+ (self && self.methods.include?(:dup)) ? self.dup : self
319
+ end
320
+
321
+ #===複製を取得する
322
+ #ただし、再定義しているクラス(例:Arrayクラス)以外はdupメソッドの結果
323
+ #返却値:: 複写したインスタンスを返す
324
+ def deep_clone
325
+ self.deep_dup
326
+ end
327
+ end
328
+ end
329
+
330
+ class Object
331
+ include Miyako::DeepCopy
332
+ end
333
+
334
+ class Array
335
+ include Miyako::SpriteArray
336
+
337
+ #===複製を取得する
338
+ #ただし、配列の要素もdeep_dupメソッドで複製する
339
+ #返却値:: 複写したインスタンスを返す
340
+ def deep_dup
341
+ self.dup.map{|e| (e && e.methods.include?(:deep_dup)) ? e.deep_dup : e }
342
+ end
343
+ end
344
+
345
+ class Hash
346
+ #===複製を取得する
347
+ #ただし、配列の要素もdeep_dupメソッドで複製する
348
+ #返却値:: 複写したインスタンスを返す
349
+ def deep_dup
350
+ ret = self.dup
351
+ ret.keys.each{|key|
352
+ v = ret[key]
353
+ (v && v.methods.include?(:deep_dup)) ? v.deep_dup : v
354
+ }
355
+ ret
356
+ end
357
+ end