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,462 @@
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
+ class FixedMap
29
+ include SpriteBase
30
+ include Animation
31
+ include Layout
32
+
33
+ @@idx_ix = [-1, 2, 4]
34
+ @@idx_iy = [-1, 0, 6]
35
+
36
+ attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
37
+ attr_reader :name, :map_layers, :mapchips, :pos, :size, :w, :h
38
+
39
+ #==あとで書く
40
+ class FixedMapLayer #:nodoc: all
41
+ include SpriteBase
42
+ include Animation
43
+ extend Forwardable
44
+
45
+ @@use_chip_list = Hash.new(nil)
46
+
47
+ attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
48
+ attr_accessor :mapchip, :mapchip_units
49
+ attr_reader :pos
50
+
51
+ def round(v, max) #:nodoc:
52
+ v = max + (v % max) if v < 0
53
+ v %= max if v >= max
54
+ return v
55
+ end
56
+
57
+ def reSize #:nodoc:
58
+ @cw = @real_size.w % @ow == 0 ? @real_size.w / @ow : (@real_size.w + @ow - 1)/ @ow + 1
59
+ @ch = @real_size.h % @oh == 0 ? @real_size.h / @oh : (@real_size.h + @oh - 1)/ @oh + 1
60
+ end
61
+
62
+ def initialize(mapchip, mapdat, layer_size) #:nodoc:
63
+ @mapchip = mapchip
64
+ @pos = Point.new(0, 0)
65
+ @size = layer_size.dup
66
+ @ow = @mapchip.chip_size.w
67
+ @oh = @mapchip.chip_size.h
68
+ @real_size = Size.new(@size.w * @ow, @size.h * @oh)
69
+ @mapdat = mapdat
70
+ @baseimg = nil
71
+ @baseimg = @mapchip.chip_image
72
+ @units = nil
73
+ @visible = true
74
+ @divpx = get_div_array(0, @real_size.w, @ow)
75
+ @divpy = get_div_array(0, @real_size.h, @oh)
76
+ @modpx = get_mod_array(0, @real_size.w, @ow)
77
+ @modpy = get_mod_array(0, @real_size.h, @oh)
78
+ @modpx2 = get_mod_array(0, @size.w * 2 + 1, @size.w)
79
+ @modpy2 = get_mod_array(0, @size.h * 2 + 1, @size.h)
80
+ @cdivsx = get_div_array(0, @mapchip.chips, @mapchip.size.w)
81
+ @cmodsx = get_mod_array(0, @mapchip.chips, @mapchip.size.w)
82
+ @cdivsy = get_div_array(0, @mapchip.chips, @mapchip.size.h)
83
+ @cmodsy = get_mod_array(0, @mapchip.chips, @mapchip.size.h)
84
+ @cdivsx = @cdivsx.map{|v| v * @ow }
85
+ @cdivsy = @cdivsy.map{|v| v * @oh }
86
+ @cmodsx = @cmodsx.map{|v| v * @ow }
87
+ @cmodsy = @cmodsy.map{|v| v * @oh }
88
+ @mapchip_units = Array.new(@mapchip.chips){|idx|
89
+ SpriteUnitFactory.create(:bitmap=>@baseimg.bitmap,
90
+ :ox => (idx % @mapchip.size.w) * @ow, :oy => (idx / @mapchip.size.w) * @oh,
91
+ :ow => @ow, :oh => @oh)
92
+ }
93
+ reSize
94
+ end
95
+
96
+ def initialize_copy(obj) #:nodoc:
97
+ @mapchip = @mapchip.dup
98
+ @size = @size.dup
99
+ @mapchip_unit = @mapchip_unit.dup
100
+ @divpx = get_div_array(0, @real_size.w, @ow)
101
+ @divpy = get_div_array(0, @real_size.h, @oh)
102
+ @modpx = get_mod_array(0, @real_size.w, @ow)
103
+ @modpy = get_mod_array(0, @real_size.h, @oh)
104
+ @modpx2 = get_mod_array(0, @size.w * 2 + 1, @size.w)
105
+ @modpy2 = get_mod_array(0, @size.h * 2 + 1, @size.h)
106
+ @cdivsx = get_div_array(0, @mapchip.chips, @mapchip.size.w)
107
+ @cmodsx = get_mod_array(0, @mapchip.chips, @mapchip.size.w)
108
+ @cdivsy = get_div_array(0, @mapchip.chips, @mapchip.size.h)
109
+ @cmodsy = get_mod_array(0, @mapchip.chips, @mapchip.size.h)
110
+ @cdivsx = @cdivsx.map{|v| v * @ow }
111
+ @cdivsy = @cdivsy.map{|v| v * @oh }
112
+ @cmodsx = @cmodsx.map{|v| v * @ow }
113
+ @cmodsy = @cmodsy.map{|v| v * @oh }
114
+ end
115
+
116
+ def get_div_array(s, t, v) #:nodoc:
117
+ a = Array.new
118
+ (s..t).each{|i| a.push(i / v)}
119
+ return a
120
+ end
121
+
122
+ def get_mod_array(s, t, v) #:nodoc:
123
+ a = Array.new
124
+ (s..t).each{|i| a.push(i % v)}
125
+ return a
126
+ end
127
+
128
+ def convert_position(x, y) #:nodoc:
129
+ return Point.new(@modpx2[round(x, @size.w)],
130
+ @modpy2[round(y, @size.h)])
131
+ end
132
+
133
+ #===指定の矩形のキャラクタに掛かるマップチップの左上位置の組み合わせを返す
134
+ #但し、引数には、Rect(x,y,w,h)形式のインスタンスを渡す
135
+ #_rect_:: キャラクタの矩形
136
+ #返却値:: マップチップ左上位置の配列(キャラクタに掛かる位置の組み合わせ)
137
+ def product_position(rect)
138
+ return Utility.product_position(rect, @mapchip.chip_size)
139
+ end
140
+
141
+ #===指定の矩形のキャラクタに掛かるマップチップの左上位置の組み合わせを返す
142
+ #但し、引数には、Square([x1,y1,x2,y2])形式のインスタンスを渡す
143
+ #_square_:: キャラクタの矩形
144
+ #返却値:: マップチップ左上位置の配列(キャラクタに掛かる位置の組み合わせ)
145
+ def product_position_by_square(square)
146
+ return Utility.product_position_by_square(square, @mapchip.chip_size)
147
+ end
148
+
149
+ #===実座標を使用して、指定のレイヤー・位置のマップチップ番号を取得
150
+ #イベントレイヤーでの番号はイベント番号と一致する
151
+ #_x_:: マップチップ単位での位置(ピクセル単位)
152
+ #_y_:: マップチップ単位での位置(ピクセル単位)
153
+ #返却値:: マップチップ番号(マップチップが設定されている時は0以上の整数、設定されていない場合は-1が返る)
154
+ def get_code(x, y)
155
+ pos = convert_position(x / @mapchip.chip_size[0], y / @mapchip.chip_size[1])
156
+ return @mapdat[pos.y][pos.x]
157
+ end
158
+
159
+ #===キャラクタとマップチップが重なっているかどうか問い合わせる
160
+ #指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと重なっているかどうか問い合わせる
161
+ #引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
162
+ #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
163
+ #_type_:: 移動形式(0以上の整数)
164
+ #_pos_:: 調査対象のマップチップの位置
165
+ #_collision_:: キャラクタのコリジョン
166
+ #_rect_:: キャラクタの矩形
167
+ #返却値:: コリジョンが重なっていればtrueを返す
168
+ def collision?(type, pos, collision, rect)
169
+ code = get_code(*pos.to_a)
170
+ return false if code == -1
171
+ return @mapchip.collision_table[type][code].collision?(pos, collision, rect)
172
+ end
173
+
174
+ #===キャラクタとマップチップが隣り合っているかどうか問い合わせる
175
+ #指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと隣り合っているかどうか問い合わせる
176
+ #引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
177
+ #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
178
+ #_type_:: 移動形式(0以上の整数)
179
+ #_pos_:: 調査対象のマップチップの位置
180
+ #_collision_:: キャラクタのコリジョン
181
+ #_rect_:: キャラクタの矩形
182
+ #返却値:: コリジョンが隣り合っていればtrueを返す
183
+ def meet?(type, pos, collision, rect)
184
+ code = get_code(*pos.to_a)
185
+ return false if code == -1
186
+ return @mapchip.collision_table[type][code].meet?(pos, collision, rect)
187
+ end
188
+
189
+ #===キャラクタとマップチップが覆い被さっているかどうか問い合わせる
190
+ #指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンを覆い被さっているかどうか問い合わせる
191
+ #引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
192
+ #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
193
+ #_type_:: 移動形式(0以上の整数)
194
+ #_pos_:: 調査対象のマップチップの位置
195
+ #_collision_:: キャラクタのコリジョン
196
+ #_rect_:: キャラクタの矩形
197
+ #返却値:: どちらかのコリジョンが覆い被さっていればtrueを返す
198
+ def cover?(type, pos, collision, rect)
199
+ code = get_code(*pos.to_a)
200
+ return false if code == -1
201
+ return @mapchip.collision_table[type][code].cover?(pos, collision, rect)
202
+ end
203
+
204
+ #===キャラクタとマップチップが重なっているかどうか問い合わせる
205
+ #指定の位置と方向で、指定の位置のマップチップ上で移動できるかどうか問い合わせる
206
+ #指定の位置のマップチップ番号が-1(未定義)のとき、移動していない(dx==0 and dy==0)ときはtrueを返す
207
+ #_type_:: 移動形式(0以上の整数)
208
+ #_inout_:: 入退形式(:in もしくは :out)
209
+ #_pos_:: 調査対象のマップチップの位置
210
+ #_dx_:: 移動量(x座標)
211
+ #_dy_:: 移動量(y座標)
212
+ #返却値:: 移動可能ならばtrueを返す
213
+ def can_access?(type, inout, pos, dx, dy)
214
+ code = get_code(pos[0]+dx, pos[1]+dy)
215
+ return true if code == -1
216
+ index = AccessIndex.index2(inout, dx, dy)
217
+ return true if index == -1
218
+ return @mapchip.access_table[type][code][index]
219
+ end
220
+
221
+ def dispose #:nodoc:
222
+ @mapdat = nil
223
+ @baseimg = nil
224
+ end
225
+
226
+ #===マップレイヤーを画面に描画する
227
+ #すべてのマップチップを画面に描画する
228
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
229
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
230
+ #ブロックの引数は、|画面のSpriteUnit|となる。
231
+ #visibleメソッドの値がfalseのときは描画されない。
232
+ #返却値:: 自分自身を返す
233
+ def render
234
+ end
235
+
236
+ #===マップを画像に描画する
237
+ #すべてのマップチップを画像に描画する
238
+ #各レイヤ-を、レイヤーインデックス番号の若い順に描画する
239
+ #但し、マップイベントは描画しない
240
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
241
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
242
+ #ブロックの引数は、|転送先のSpriteUnit|となる。
243
+ #visibleメソッドの値がfalseのときは描画されない。
244
+ #_dst_:: 転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)
245
+ #返却値:: 自分自身を返す
246
+ def render_to(dst)
247
+ end
248
+
249
+ def_delegators(:@size, :w, :h)
250
+ end
251
+
252
+
253
+ #===インスタンスを生成する
254
+ #各レイヤにMapChip構造体を渡す
255
+ #但し、すべてのレイヤーに同一のMapChip構造体を使うときは、単体で渡すことも可能
256
+ #第1引数にto_aメソッドが実装されていれば、配列化した要素をMapChip構造体として各レイヤに渡す
257
+ #また、各レイヤにMapChip構造体を渡すとき、レイヤ数より要素数が少ないときは、
258
+ #先頭に戻って繰り返し渡す仕様になっている
259
+ #各MapChip構造体のマップチップの大きさを同じにしておく必要がある
260
+ #_mapchips_:: マップチップ構造体群(MapChip構造体単体もしくは配列)
261
+ #_layer_csv_:: レイヤーファイル(CSVファイル)
262
+ #_event_manager_:: MapEventManagerクラスのインスタンス
263
+ #返却値:: 生成したインスタンス
264
+ def initialize(mapchips, layer_csv, event_manager)
265
+ raise MiyakoIOError.no_file(layer_csv) unless File.exist?(layer_csv)
266
+ init_layout
267
+ @visible = true
268
+ @event_layers = []
269
+ @em = event_manager.dup
270
+ @em.set(self)
271
+ @mapchips = mapchips.to_a
272
+ layer_data = CSV.readlines(layer_csv)
273
+
274
+ raise MiyakoFileFormatError, "This file is not Miyako Map Layer file! : #{layer_csv}" unless layer_data.shift[0] == "Miyako Maplayer"
275
+
276
+ tmp = layer_data.shift # 空行の空読み込み
277
+
278
+ @size = Size.new(tmp[0].to_i, tmp[1].to_i)
279
+ @w = @size.w * @mapchips.first.chip_size.w
280
+ @h = @size.h * @mapchips.first.chip_size.h
281
+
282
+ layers = layer_data.shift[0].to_i
283
+
284
+ evlist = []
285
+ brlist = []
286
+ layers.times{|n|
287
+ name = layer_data.shift[0]
288
+ values = []
289
+ @size.h.times{|y|
290
+ values << layer_data.shift.map{|m| m.to_i}
291
+ }
292
+ if name == "<event>"
293
+ evlist << values
294
+ else
295
+ brlist << values
296
+ end
297
+ }
298
+
299
+ @event_layer = nil
300
+
301
+ evlist.each{|events|
302
+ event_layer = Array.new
303
+ events.each_with_index{|ly, y|
304
+ ly.each_with_index{|code, x|
305
+ next unless @em.include?(code)
306
+ event_layer.push(@em.create(code, x * @mapchips.first.chip_size.w, y * @mapchips.first.chip_size.h))
307
+ }
308
+ }
309
+ @event_layers << event_layer
310
+ }
311
+
312
+ mc = @mapchips.cycle
313
+ @mapchips = mc.take(layers)
314
+ @map_layers = []
315
+ brlist.each{|br|
316
+ br = br.map{|b| b.map{|bb| bb >= @mapchips.first.chips ? -1 : bb } }
317
+ @map_layers.push(FixedMapLayer.new(mc.next, br, @size))
318
+ }
319
+ set_layout_size(@w, @h)
320
+ end
321
+
322
+ def initialize_copy(obj) #:nodoc:
323
+ @map_layers = @map_layers.dup
324
+ @event_layers = @event_layers.dup
325
+ @em = em.dup
326
+ @mapchips = @mapchips.dup
327
+ @size = @size.dup
328
+ copy_layout
329
+ end
330
+
331
+ #===マップにイベントを追加する
332
+ #_idx_:: 追加するイベントレイヤの指標
333
+ #_code_:: イベント番号(Map.newメソッドで渡したイベント番号に対応)
334
+ #_x_:: マップ上の位置(x方向)
335
+ #_y_:: マップ常温位置(y方向)
336
+ #返却値:: 自分自身を返す
337
+ def add_event(idx, code, x, y)
338
+ return self unless @em.include?(code)
339
+ @event_layers[idx].push(@em.create(code, x, y))
340
+ return self
341
+ end
342
+
343
+ def update_layout_position #:nodoc:
344
+ @map_layers.each{|ml| ml.pos.move_to!(*@layout.pos) }
345
+ end
346
+
347
+ def [](idx) #:nodoc:
348
+ return @map_layers[idx]
349
+ end
350
+
351
+ #===実座標を使用して、指定のレイヤー・位置のマップチップ番号を取得
352
+ #イベントレイヤーでの番号はイベント番号と一致する
353
+ #ブロックを渡すと、求めたマップチップ番号をブロック引数として受け取る評価を行える
354
+ #_idx_:: マップレイヤー配列のインデックス
355
+ #_x_:: マップチップ単位での位置(ピクセル単位)
356
+ #_y_:: マップチップ単位での位置(ピクセル単位)
357
+ #返却値:: マップチップ番号(マップチップが設定されている時は0以上の整数、設定されていない場合は-1が返る)
358
+ def get_code(idx, x = 0, y = 0)
359
+ code = @map_layers[idx].get_code(x, y)
360
+ yield code if block_given?
361
+ return code
362
+ end
363
+
364
+ #===対象のマップチップ番号の画像を置き換える
365
+ #_idx_:: 置き換えるマップチップレイヤー番号
366
+ #_code_:: 置き換えるマップチップ番号
367
+ #_base_:: 置き換え対象の画像・アニメーション
368
+ #返却値:: 自分自身を返す
369
+ def set_mapchip_base(idx, code, base)
370
+ @map_layers[idx].mapchip_units[code] = base
371
+ return self
372
+ end
373
+
374
+ #===現在の画面の最大の大きさを矩形で取得する
375
+ #但し、FixedMapの場合は最大の大きさ=画面の大きさなので、rectと同じ値が得られる
376
+ #返却値:: 画像の大きさ(Rect構造体のインスタンス)
377
+ def broad_rect
378
+ return self.rect
379
+ end
380
+
381
+ #===スプライトに変換した画像を表示する
382
+ #すべてのパーツを貼り付けた、1枚のスプライトを返す
383
+ #引数1個のブロックを渡せば、スプライトに補正をかけることが出来る
384
+ #返却値:: 描画したスプライト
385
+ def to_sprite
386
+ rect = self.broad_rect
387
+ sprite = Sprite.new(:size=>rect.to_a[2,2], :type=>:ac)
388
+ Drawing.fill(sprite, [0,0,0])
389
+ Bitmap.ck_to_ac!(sprite, [0,0,0])
390
+ self.render_to(sprite){|sunit, dunit| sunit.x -= rect.x; sunit.y -= rect.y }
391
+ yield sprite if block_given?
392
+ return sprite
393
+ end
394
+
395
+ #===SpriteUnit構造体を生成する
396
+ #いったんSpriteインスタンスを作成し、それをもとにSpriteUnit構造体を生成する。
397
+ #返却値:: 生成したSpriteUnit構造体
398
+ def to_unit
399
+ return self.to_sprite.to_unit
400
+ end
401
+
402
+ #===マップチップ1枚の大きさを取得する
403
+ #マップチップの大きさが32×32ピクセルの場合は、[32,32]のSize構造体が返る
404
+ #返却値:: マップチップのサイズ(Size構造体)
405
+ def chipSize
406
+ return @mapchips.first.chip_size
407
+ end
408
+
409
+ #===すべてのマップイベントを終了させる
410
+ #マップに登録しているイベントすべてのfinalメソッドを呼び出す
411
+ def final
412
+ @event_layers.each{|ee| ee.each{|e| e.final }}
413
+ end
414
+
415
+ #===マップ情報を解放する
416
+ def dispose
417
+ @map_layers.each{|l|
418
+ l.dispose
419
+ l = nil
420
+ }
421
+ @map_layers = Array.new
422
+
423
+ @event_layers.each{|ee|
424
+ ee.each{|e| e.dispose }
425
+ ee.clear
426
+ }
427
+ @event_layers.clear
428
+
429
+ @mapchips.clear
430
+ @mapchips = nil
431
+ end
432
+
433
+ #===マップに登録しているイベントインスタンス(マップイベント)を取得する
434
+ #返却値:: マップイベントの配列
435
+ def events
436
+ return @event_layers
437
+ end
438
+
439
+ #===マップを画面に描画する
440
+ #すべてのマップチップを画面に描画する
441
+ #各レイヤ-を、レイヤーインデックス番号の若い順に描画する
442
+ #但し、マップイベントは描画しない
443
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
444
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
445
+ #ブロックの引数は、|画面のSpriteUnit|となる。
446
+ #visibleメソッドの値がfalseのときは描画されない。
447
+ #返却値:: 自分自身を返す
448
+ def render
449
+ end
450
+
451
+ #===マップレイヤーを画像に転送する
452
+ #すべてのマップチップを画像に描画する
453
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
454
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
455
+ #ブロックの引数は、|転送先のSpriteUnit|となる。
456
+ #visibleメソッドの値がfalseのときは描画されない。
457
+ #_dst_:: 転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)
458
+ #返却値:: 自分自身を返す
459
+ def render_to(dst)
460
+ end
461
+ end
462
+ end