ruby-miyako 2.1.0 → 2.1.1

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 (72) hide show
  1. data/README +275 -20
  2. data/extern.h +21 -1
  3. data/install_miyako.rb +5 -3
  4. data/lib/Miyako/API/audio.rb +11 -6
  5. data/lib/Miyako/API/basic_data.rb +0 -985
  6. data/lib/Miyako/API/bitmap.rb +19 -22
  7. data/lib/Miyako/API/choices.rb +203 -69
  8. data/lib/Miyako/API/collision.rb +451 -9
  9. data/lib/Miyako/API/color.rb +177 -0
  10. data/lib/Miyako/API/diagram.rb +18 -20
  11. data/lib/Miyako/API/fixedmap.rb +207 -73
  12. data/lib/Miyako/API/font.rb +111 -18
  13. data/lib/Miyako/API/i_yuki.rb +1201 -0
  14. data/lib/Miyako/API/input.rb +65 -0
  15. data/lib/Miyako/API/layout.rb +41 -29
  16. data/lib/Miyako/API/map.rb +202 -157
  17. data/lib/Miyako/API/map_event.rb +86 -19
  18. data/lib/Miyako/API/map_struct.rb +268 -0
  19. data/lib/Miyako/API/modules.rb +136 -37
  20. data/lib/Miyako/API/movie.rb +8 -8
  21. data/lib/Miyako/API/parts.rb +63 -20
  22. data/lib/Miyako/API/plane.rb +4 -4
  23. data/lib/Miyako/API/screen.rb +16 -8
  24. data/lib/Miyako/API/sprite.rb +290 -23
  25. data/lib/Miyako/API/sprite_animation.rb +23 -11
  26. data/lib/Miyako/API/sprite_list.rb +406 -183
  27. data/lib/Miyako/API/story.rb +4 -65
  28. data/lib/Miyako/API/struct_point.rb +157 -0
  29. data/lib/Miyako/API/struct_rect.rb +233 -0
  30. data/lib/Miyako/API/struct_segment.rb +641 -0
  31. data/lib/Miyako/API/struct_size.rb +158 -0
  32. data/lib/Miyako/API/struct_square.rb +253 -0
  33. data/lib/Miyako/API/textbox.rb +49 -35
  34. data/lib/Miyako/API/viewport.rb +5 -5
  35. data/lib/Miyako/API/wait_counter.rb +350 -0
  36. data/lib/Miyako/API/yuki.rb +95 -60
  37. data/lib/Miyako/EXT/raster_scroll.rb +30 -8
  38. data/lib/Miyako/EXT/slides.rb +6 -6
  39. data/lib/Miyako/miyako.rb +25 -11
  40. data/lib/miyako.rb +28 -0
  41. data/lib/miyako_require_only.rb +35 -0
  42. data/miyako_basicdata.c +201 -17
  43. data/miyako_collision.c +315 -6
  44. data/miyako_diagram.c +331 -0
  45. data/miyako_drawing.c +26 -7
  46. data/miyako_font.c +259 -129
  47. data/miyako_input_audio.c +24 -14
  48. data/miyako_layout.c +106 -8
  49. data/miyako_no_katana.c +398 -171
  50. data/miyako_sprite2.c +275 -38
  51. data/miyako_transform.c +113 -107
  52. data/miyako_utility.c +34 -48
  53. data/miyako_yuki.c +241 -0
  54. data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
  55. data/sample/Room3/blue.rb +19 -19
  56. data/sample/Room3/green.rb +9 -9
  57. data/sample/Room3/main.rb +12 -12
  58. data/sample/Room3/red.rb +12 -12
  59. data/sample/Room3/title.rb +15 -10
  60. data/sample/collision_test2.rb +2 -1
  61. data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
  62. data/sample/map_test/main_scene.rb +12 -10
  63. data/sample/map_test/map_manager.rb +14 -13
  64. data/sample/rasterscroll.rb +5 -5
  65. data/sample/takahashi.rb +3 -3
  66. data/sample/textbox_sample.rb +7 -6
  67. data/sample/transform.rb +2 -1
  68. data/uninstall_miyako.rb +4 -1
  69. data/win/miyako_no_katana.so +0 -0
  70. metadata +15 -4
  71. data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
  72. data/sample/cairo_sample.rb +0 -25
@@ -51,7 +51,7 @@ module Miyako
51
51
  @map = nil
52
52
  @id2event = Hash.new
53
53
  end
54
-
54
+
55
55
  def initialize_copy(obj) #:nodoc:
56
56
  @map = @map.dup if @map
57
57
  @id2event = @id2event.dup
@@ -62,8 +62,7 @@ module Miyako
62
62
  end
63
63
 
64
64
  #===イベントクラスをマップに追加登録する
65
- #_id_:: マップ(イベントレイヤ)上の番号。
66
- #イベントレイヤ上に存在しない番号を渡してもエラーや警告は発しない
65
+ #_id_:: イベント番号(0以上の整数)
67
66
  #_event_:: イベントクラス。クラスのインスタンスではないことに注意!
68
67
  #返却値:: 自分自身を返す
69
68
  def add(id, event)
@@ -71,12 +70,30 @@ module Miyako
71
70
  return self
72
71
  end
73
72
 
73
+ #===イベント番号に関連づけれられているイベントクラスを返す
74
+ #引数で渡した番号に対応するイベントクラス(クラスそのもの)を返す
75
+ #引数idが未登録のイベント番号だったときはnilが返る
76
+ #_id_:: イベント番号
77
+ #返却値:: イベントクラス(classクラスインスタンス)もしくはnil
78
+ def [](id)
79
+ return @id2event[id]
80
+ end
81
+
82
+ #===イベントクラスに関連づけれられているイベント番号を返す
83
+ #引数で渡したイベントクラスに対応するイベント番号を返す
84
+ #引数eventが未登録のイベント番号だったときはnilが返る
85
+ #_event_:: イベントクラス
86
+ #返却値:: イベント番号(0以上の整数)もしくはnil
87
+ def to_id(event)
88
+ return @id2event.key(event)
89
+ end
90
+
74
91
  #===イベントが登録されているかを確認する
75
92
  #引数で渡した番号に対応するイベントクラスが登録されているかどうかを確認する
76
- #_id_:: イベントクラスに対応した番号
77
- #返却値:: イベントクラスが登録されている時はtrueを返す
93
+ #idに関連づけられたイベントクラスが登録されている時はtrueを返す
94
+ #_id_:: イベント番号
95
+ #返却値:: true/false
78
96
  def include?(id)
79
- raise MiyakoError, "This MapEventManager instance is not set Map/FixedMap instance!" unless @map
80
97
  return @id2event.has_key?(id)
81
98
  end
82
99
 
@@ -112,7 +129,7 @@ module Miyako
112
129
  module MapEvent
113
130
  include SpriteBase
114
131
  include Animation
115
-
132
+
116
133
  #===イベントのインスタンスを作成する
117
134
  #引数として渡せるX,Y座標の値は、表示上ではなく理論上の座標位置
118
135
  #_map_obj_:: 関連づけられたMap/FixedMapクラスのインスタンス
@@ -130,45 +147,95 @@ module Miyako
130
147
  #_y_:: マップ上のY座標の値
131
148
  def init(map_obj, x, y)
132
149
  end
133
-
150
+
134
151
  #===インスタンス内の表示やデータを更新するテンプレートメソッド
135
- #マップ画像が更新された時に呼び出される
152
+ #マップ画像が更新された時に呼び出す
136
153
  #_map_obj_:: インスタンスが組み込まれているMap/FixedMapクラスのインスタンス
137
154
  #_events_:: マップに登録されているイベントインスタンスの配列
138
155
  #_params_:: 開発者が明示的に用意した引数。内容はハッシュ
139
156
  def update(map_obj, events, params)
140
157
  end
141
158
 
159
+ #===インスタンス内の表示やデータを更新するテンプレートメソッド
160
+ #独自に更新を行いたいときに呼び出される
161
+ #_params_:: 開発者が明示的に用意した引数。可変引数
162
+ def update2(*params)
163
+ end
164
+
142
165
  #===イベントを指定の分量で移動させる(テンプレートメソッド)
143
166
  #_dx_:: 移動量(x座標)。単位はピクセル
144
167
  #_dy_:: 移動量(y座標)。単位はピクセル
168
+ #_params_:: move呼び出し時に渡された引数。可変個数
145
169
  #返却値:: 自分自身を返す
146
- def move!(dx,dy)
170
+ def move!(dx,dy,*params)
147
171
  return self
148
172
  end
149
173
 
150
174
  #===イベントを指定の位置へ移動させる(テンプレートメソッド)
151
175
  #_x_:: 移動先の位置(x座標)。単位はピクセル
152
176
  #_y_:: 移動先の位置(y座標)。単位はピクセル
177
+ #_params_:: move呼び出し時に渡された引数。可変個数
153
178
  #返却値:: 自分自身を返す
154
- def move_to!(x,y)
179
+ def move_to!(x,y,*params)
180
+ return self
181
+ end
182
+
183
+ #===イベントを指定の分量で移動させる(テンプレートメソッド)
184
+ #スプライトのみを移動させるときにオーバーライドする
185
+ #_dx_:: 移動量(x座標)。単位はピクセル
186
+ #_dy_:: 移動量(y座標)。単位はピクセル
187
+ #_params_:: move呼び出し時に渡された引数。可変個数
188
+ #返却値:: 自分自身を返す
189
+ def sprite_move!(dx,dy,*params)
190
+ return self
191
+ end
192
+
193
+ #===イベントを指定の位置へ移動させる(テンプレートメソッド)
194
+ #スプライトのみを移動させるときにオーバーライドする
195
+ #_x_:: 移動先の位置(x座標)。単位はピクセル
196
+ #_y_:: 移動先の位置(y座標)。単位はピクセル
197
+ #_params_:: move呼び出し時に渡された引数。可変個数
198
+ #返却値:: 自分自身を返す
199
+ def sprite_move_to!(x,y,*params)
200
+ return self
201
+ end
202
+
203
+ #===イベントを指定の分量で移動させる(テンプレートメソッド)
204
+ #論理的な位置のみを移動させるときにオーバーライドする
205
+ #_dx_:: 移動量(x座標)。単位はピクセル
206
+ #_dy_:: 移動量(y座標)。単位はピクセル
207
+ #_params_:: move呼び出し時に渡された引数。可変個数
208
+ #返却値:: 自分自身を返す
209
+ def pos_move!(dx,dy,*params)
210
+ return self
211
+ end
212
+
213
+ #===イベントを指定の位置へ移動させる(テンプレートメソッド)
214
+ #論理的な位置のみを移動させるときにオーバーライドする
215
+ #_x_:: 移動先の位置(x座標)。単位はピクセル
216
+ #_y_:: 移動先の位置(y座標)。単位はピクセル
217
+ #_params_:: move呼び出し時に渡された引数。可変個数
218
+ #返却値:: 自分自身を返す
219
+ def pos_move_to!(x,y,*params)
155
220
  return self
156
221
  end
157
222
 
158
223
  #===イベントを指定の分量で移動させたときの値を求める(テンプレートメソッド)
159
224
  #_dx_:: 移動量(x座標)。単位はピクセル
160
225
  #_dy_:: 移動量(y座標)。単位はピクセル
226
+ #_params_:: move呼び出し時に渡された引数。可変個数
161
227
  #返却値:: 移動した位置のインスタンスを返す
162
- def move(dx,dy)
163
- return Position.new(0,0)
228
+ def move(dx,dy,*params)
229
+ return Point.new(0,0)
164
230
  end
165
231
 
166
232
  #===イベントを指定の位置へ移動させたときの値を求める(テンプレートメソッド)
167
233
  #_x_:: 移動先の位置(x座標)。単位はピクセル
168
234
  #_y_:: 移動先の位置(y座標)。単位はピクセル
235
+ #_params_:: move呼び出し時に渡された引数。可変個数
169
236
  #返却値:: 移動した位置のインスタンスを返す
170
- def move_to(x,y)
171
- return Position.new(0,0)
237
+ def move_to(x,y,*params)
238
+ return Point.new(0,0)
172
239
  end
173
240
 
174
241
  #===イベント発生可否問い合わせ(テンプレートメソッド)
@@ -178,7 +245,7 @@ module Miyako
178
245
  def met?(*params)
179
246
  return false
180
247
  end
181
-
248
+
182
249
  #===画面に画像を描画する(テンプレートメソッド)
183
250
  #イベントで所持している画像を描画するメソッドを実装する
184
251
  #(イベント内部で用意している画像の描画用テンプレートメソッド)
@@ -192,7 +259,7 @@ module Miyako
192
259
  def start(*params)
193
260
  return self
194
261
  end
195
-
262
+
196
263
  #===イベントを停止・終了させる(テンプレートメソッド)
197
264
  #ここに、イベント停止・終了イベントを実装する。更新はupdateメソッドに実装する
198
265
  #_param_:: イベント発生に必要なパラメータ群。デフォルトはnil
@@ -200,7 +267,7 @@ module Miyako
200
267
  def stop(*params)
201
268
  return self
202
269
  end
203
-
270
+
204
271
  #===イベント発生中問い合わせ(テンプレートメソッド)
205
272
  #ここに、イベント発生中の問い合わせ処理を実装する。
206
273
  #_param_:: あとで書く
@@ -208,7 +275,7 @@ module Miyako
208
275
  def executing?
209
276
  return false
210
277
  end
211
-
278
+
212
279
  #===イベント終了後の後処理(テンプレートメソッド)
213
280
  #ここに、イベント終了後の後処理を実装する。
214
281
  def final
@@ -0,0 +1,268 @@
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
+
25
+ module Miyako
26
+ #==マップチップ構造体に配列化メソッド(to_a)を定義するための構造体クラス
27
+ #インデックス参照メソッドを追加
28
+ class MapChipStruct < Struct
29
+ #===インスタンスを配列化する
30
+ #Map/FixedMap.newメソッド内部で、MapChip構造体と、その配列とのダックタイピングのために用意
31
+ #返却値:: 自分自身を[]囲んだオブジェクトを返す
32
+ def to_a
33
+ return [self]
34
+ end
35
+ end
36
+
37
+ #=マップチップ定義構造体
38
+ MapChip = MapChipStruct.new(:chip_image, :chips, :size, :chip_size, :access_types, :collision_table, :access_table)
39
+
40
+ #=マップチップ作成ファクトリクラス
41
+ class MapChipFactory
42
+ #===CSVファイルからMapChip構造体を生成する
43
+ #_csv_filename_:: マップチップファイル名(CSVファイル)
44
+ #_use_alpha_:: 画像にαチャネルを使うかどうかのフラグ。trueのときは画像のαチャネルを使用、falseのときはカラーキーを使用。デフォルトはtrue
45
+ #返却値:: MapChip構造体
46
+ def MapChipFactory.load(csv_filename, use_alpha = true)
47
+ raise MiyakoIOError.no_file(csv_filename) unless File.exist?(csv_filename)
48
+ lines = CSV.read(csv_filename)
49
+ raise MiyakoFileFormatError, "This file is not Miyako Map Chip file! : #{csv_filename}" unless lines.shift[0] == "Miyako Mapchip"
50
+ spr = use_alpha ? Sprite.new({:filename => lines.shift[0], :type => :alpha_channel}) : Sprite.new({:file_name => lines.shift[0], :type => :color_key})
51
+ tmp = lines.shift
52
+ chip_size = Size.new(tmp[0].to_i, tmp[1].to_i)
53
+ size = Size.new(spr.w / chip_size.w, spr.h / chip_size.h)
54
+ chips = size.w * size.h
55
+ access_types = lines.shift[0].to_i
56
+ collision_table = Array.new(access_types){|at|
57
+ Array.new(chips){|n| Collision.new(lines.shift.map{|s| s.to_i}) }
58
+ }
59
+ access_table = Array.new(access_types){|at|
60
+ Array.new(chips){|n|
61
+ lines.shift.map{|s|
62
+ v = eval(s)
63
+ next v if (v == true || v == false)
64
+ v = v.to_i
65
+ next false if v == 0
66
+ true
67
+ }
68
+ }
69
+ }
70
+ return MapChip.new(spr, chips, size, chip_size, access_types, collision_table, access_table)
71
+ end
72
+
73
+ #===スプライトからMapChip構造体を生成する
74
+ #CSVファイルからではなく、独自に用意したデータからMapChip構造体を生成する
75
+ #このとき、マップチップの大きさは、引数として渡すスプライトのow,ohから算出する
76
+ #collision_tableは、すべてのチップで[0,0,ow,oh]として生成する
77
+ #access_tableは、すべての方向でtrueとして設定する
78
+ #_sprite_:: マップチップが描かれているスプライト
79
+ #_access_types_:: アクセス形式の数。0以下の時はMiyakoValueErrorが発生する。省略時は1
80
+ #返却値:: MapChip構造体
81
+ def MapChipFactory.create(sprite, access_types = 1)
82
+ raise MiyakoValueErro, "illegal access types! needs >1 : #{access_types}" if access_types < 1
83
+ chip_size = Size.new(sprite.ow, sprite.oh)
84
+ size = Size.new(sprite.w / chip_size.w, sprite.h / chip_size.h)
85
+ chips = size.w * size.h
86
+ ctable = Array.new(access_types){|at| Array.new(chips){|n| Collision.new([0,0,chip_size.w,chip_size.h]) } }
87
+ atable = Array.new(access_types){|at| Array.new(chips){|n| [true] * 8 } }
88
+ return MapChip.new(sprite, chips, size, chip_size, access_types, ctable, atable)
89
+ end
90
+
91
+ #===スプライトからMapChip構造体を生成する
92
+ #CSVファイルからではなく、独自に用意したデータからMapChip構造体を生成する
93
+ #このとき、マップチップの大きさは、引数sizeを使用する
94
+ #collision_tableは、すべてのチップで[0,0,ow,oh]として生成する
95
+ #access_tableは、すべての方向でtrueとして設定する
96
+ #_sprite_:: マップチップが描かれているスプライト
97
+ #_size_:: マップチップの大きさ(Size構造体)
98
+ #_access_types_:: アクセス形式の数。0以下の時はMiyakoValueErrorが発生する。省略時は1
99
+ #返却値:: MapChip構造体
100
+ def MapChipFactory.create_with_size(sprite, size, access_types = 1)
101
+ raise MiyakoValueErro, "illegal access types! needs >1 : #{access_types}" if access_types < 1
102
+ chip_size = Size.new(size[0], size[1])
103
+ size = Size.new(sprite.w / chip_size.w, sprite.h / chip_size.h)
104
+ chips = size.w * size.h
105
+ ctable = Array.new(access_types){|at| Array.new(chips){|n| Collision.new([0,0,chip_size.w,chip_size.h]) } }
106
+ atable = Array.new(access_types){|at| Array.new(chips){|n| [true] * 8 } }
107
+ return MapChip.new(sprite, chips, size, chip_size, access_types, ctable, atable)
108
+ end
109
+
110
+ #===全方向移動可能なAccessTableを作成
111
+ #要素がすべてtrueの配列を生成する
112
+ #返却値:: 生成した配列
113
+ def MapChipFactory.all_access_table
114
+ [true] * 8
115
+ end
116
+
117
+ #===完全に移動不可なAccessTableを作成
118
+ #要素がすべてfalseの配列を生成する
119
+ #返却値:: 生成した配列
120
+ def MapChipFactory.not_access_table
121
+ [false] * 8
122
+ end
123
+ end
124
+
125
+ #==マップチップ構造体に配列化メソッド(to_a)を定義するための構造体クラス
126
+ #インデックス参照メソッドを追加
127
+ class MapStructStruct < Struct
128
+ #===インスタンスを配列化する
129
+ #Map/FixedMap.newメソッド内部で、MapChip構造体と、その配列とのダックタイピングのために用意
130
+ #返却値:: 自分自身を[]囲んだオブジェクトを返す
131
+ def to_a
132
+ return [self]
133
+ end
134
+ end
135
+
136
+ #=マップチップ定義構造体
137
+ MapStruct = MapStructStruct.new(:size, :layer_num, :layers, :elayer_num, :elayers)
138
+
139
+ #=マップ作成ファクトリクラス
140
+ class MapStructFactory
141
+ #===CSVファイルからMapStruct構造体を生成する
142
+ #_csv_filename_:: マップファイル名(CSVファイル)
143
+ #返却値:: 生成したMapStruct構造体
144
+ def MapStructFactory.load(csv_filename)
145
+ raise MiyakoIOError.no_file(csv_filename) unless File.exist?(csv_filename)
146
+ layer_data = CSV.readlines(csv_filename)
147
+ raise MiyakoFileFormatError, "This file is not Miyako Map Layer file! : #{csv_filename}" unless layer_data.shift[0] == "Miyako Maplayer"
148
+
149
+ tmp = layer_data.shift # 空行の空読み込み
150
+
151
+ size = Size.new(*(tmp[0..1].map{|v| v.to_i}))
152
+
153
+ layers = layer_data.shift[0].to_i
154
+
155
+ elayer = []
156
+ layer = []
157
+ layers.times{|n|
158
+ name = layer_data.shift[0]
159
+ values = []
160
+ size.h.times{|y|
161
+ values << layer_data.shift.map{|m| m.to_i}
162
+ }
163
+ if name == "<event>"
164
+ elayer << values
165
+ else
166
+ layer << values
167
+ end
168
+ }
169
+
170
+ return MapStruct.new(size, layer.length, layer, elayer.length, elayer)
171
+ end
172
+
173
+ #===MapStruct構造体を生成する
174
+ #マップの大きさ・マップレイヤーを構成する配列・イベントレイヤーを構成する配列から
175
+ #MapChip構造体を生成する
176
+ #それぞれ構成を確認し、合致しないときはMiyakoErrorを返す
177
+ #
178
+ #(例)access_type数2、レイヤー階層1層、縦5、横6のとき
179
+ #[[[-1,-1,-1,-1,-1,-1],
180
+ # [-1, 1, 1, 1, 1,-1],
181
+ # [-1, 1, 0, 0, 1,-1],
182
+ # [-1, 1, 1, 1, 1,-1],
183
+ # [-1,-1,-1,-1,-1,-1]]
184
+ #
185
+ # [[-1,-1,-1,-1,-1,-1],
186
+ # [-1,-1, 2, 2,-1,-1],
187
+ # [-1, 2, 1, 1, 2,-1],
188
+ # [-1,-1, 2, 2,-1,-1],
189
+ # [-1,-1,-1,-1,-1,-1]]]
190
+ #
191
+ #_size_:: マップの大きさ。マップチップ単位・Size構造体インスタンスを渡す
192
+ #_layers_:: マップチップIDの並びを示す配列
193
+ #_elayers_:: イベントIDの並びを示す配列。使用しないときは省略(nilを渡す)
194
+ #返却値:: 生成したMapStruct構造体
195
+ def MapStructFactory.create(size, layers, elayers=nil)
196
+ raise MiyakoError, "layer access types and event layer access types is not equal." if elayers && layers.length != elayers.length
197
+ layers.each{|layer|
198
+ raise MiyakoError, "layer height and size.h is not equal." if layer.length != size[1]
199
+ layer.each{|line| raise MiykaoError, "layer width and size.w is not equal." if line.length != size[0] }
200
+ }
201
+ if elayers
202
+ elayers.each{|layer|
203
+ raise MiyakoError, "event layer height and size.h is not equal." if layer.length != size[1]
204
+ layer.each{|line| raise MiykaoError, "event layer width and size.w is not equal." if line.length != size[0] }
205
+ }
206
+ end
207
+ return MapStruct.new(Size.new(*size), layers.length, layers, elayers ? elayers.length : 0, elayers)
208
+ end
209
+
210
+ #===すべて未定義のマップレイヤー配列を作成する
211
+ #すべての要素の値が-1(未定義)のレイヤー配列を生成する。
212
+ #
213
+ #(例)縦5、横6(MapStructFactory.undefined_layer([6,5])のとき
214
+ #[[-1,-1,-1,-1,-1,-1],
215
+ # [-1,-1,-1,-1,-1,-1],
216
+ # [-1,-1,-1,-1,-1,-1],
217
+ # [-1,-1,-1,-1,-1,-1],
218
+ # [-1,-1,-1,-1,-1,-1]]
219
+ #
220
+ #_size_:: マップの大きさ。マップチップ単位・Size構造体インスタンスを渡す
221
+ #返却値:: 生成したレイヤー配列
222
+ def MapStructFactory.undefined_layer(size)
223
+ return Array.new(size[1]){ Array.new(size[0]){ -1 }}
224
+ end
225
+ end
226
+
227
+ #==アクセス方向定義クラス
228
+ #マップチップのアクセステーブルを参照する際に、状態(入る(:in)・出る(:out))と
229
+ #方向(:left, :right, :up, :down)から、アクセステーブルの指標を取得する必要がある。
230
+ #このクラスでは、その指標を取得するメソッドを用意している
231
+ class MapDir
232
+ @@accesses = {
233
+ in: { right: 2, left: 4, up: 6, down: 0},
234
+ out: { right: 3, left: 5, up: 1, down: 7}
235
+ }
236
+ @@accesses2 = {
237
+ in: [[-1,0,6],[2,-1,-1],[4,-1,-1]],
238
+ out: [[-1,7,1],[3,-1,-1],[5,-1,-1]]
239
+ }
240
+
241
+ #===状態と方向からアクセステーブルの指標を取得する
242
+ #アクセステーブルには、2種類の状態(入る=:in, 出る=:out)と、
243
+ #4種類の方向(左=:left, 右=:right, 上=:up, 下=:down)から構成される
244
+ #配列となっている。本メソッドで、状態・方向に対応するシンボルから配列の要素指標を取得する。
245
+ #指定外のシンボルを渡すと例外が発生する
246
+ #_state_:: 状態を示すシンボル(:in, :out)
247
+ #_direction_:: 方向を示すシンボル(:left, :right, :up, :down)
248
+ #返却値:: アクセステーブルの指標番号(整数)
249
+ def MapDir.index(state, direction)
250
+ raise MiyakoValueError, "can't find AcceessIndex state symbol! #{state}" unless @@accesses.has_key?(state)
251
+ raise MiyakoValueError, "can't find AcceessIndex direction symbol! #{direction}" unless @@accesses[state].has_key?(direction)
252
+ return @@accesses[state][direction]
253
+ end
254
+
255
+ #===状態と移動量からアクセステーブルの指標を取得する
256
+ #アクセステーブルには、2種類の状態(入る=:in, 出る=:out)と、移動量(dx,dy)から構成される
257
+ #配列となっている。本メソッドで、状態に対応するシンボル、整数から配列の要素指標を取得する。
258
+ #指定外のシンボルを渡すと例外が発生する
259
+ #_state_:: 状態を示すシンボル(:in, :out)
260
+ #_dx_:: x方向移動量
261
+ #_dy_:: y方向移動量
262
+ #返却値:: アクセステーブルの指標番号(整数)。何も移動しない場合は-1が返る
263
+ def MapDir.index2(state, dx, dy)
264
+ raise MiyakoValueError, "can't find AcceessIndex state symbol! #{state}" unless @@accesses.has_key?(state)
265
+ return @@accesses2[state][dx < -1 ? -1 : dx > 1 ? 1 : 0][dy < -1 ? -1 : dy > 1 ? 1 : 0]
266
+ end
267
+ end
268
+ end