cyross-ruby-miyako 2.0.0 → 2.0.5.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.
- data/README +106 -154
- data/defines.h +144 -0
- data/{miyako_no_katana/extconf.rb → extconf.rb} +10 -0
- data/extern.h +29 -0
- data/install_miyako.rb +26 -14
- data/lib/Miyako/API/audio.rb +2 -2
- data/lib/Miyako/API/basic_data.rb +183 -41
- data/lib/Miyako/API/bitmap.rb +474 -2
- data/lib/Miyako/API/choices.rb +215 -48
- data/lib/Miyako/API/collision.rb +267 -251
- data/lib/Miyako/API/diagram.rb +58 -70
- data/lib/Miyako/API/drawing.rb +93 -52
- data/lib/Miyako/API/fixedmap.rb +233 -120
- data/lib/Miyako/API/font.rb +59 -40
- data/lib/Miyako/API/input.rb +34 -27
- data/lib/Miyako/API/layout.rb +154 -172
- data/lib/Miyako/API/map.rb +285 -159
- data/lib/Miyako/API/map_event.rb +4 -4
- data/lib/Miyako/API/modules.rb +1 -1
- data/lib/Miyako/API/movie.rb +8 -5
- data/lib/Miyako/API/parts.rb +44 -9
- data/lib/Miyako/API/plane.rb +37 -2
- data/lib/Miyako/API/screen.rb +90 -22
- data/lib/Miyako/API/shape.rb +118 -37
- data/lib/Miyako/API/sprite.rb +475 -61
- data/lib/Miyako/API/sprite_animation.rb +83 -63
- data/lib/Miyako/API/spriteunit.rb +47 -13
- data/lib/Miyako/API/story.rb +123 -47
- data/lib/Miyako/API/textbox.rb +361 -132
- data/lib/Miyako/API/utility.rb +388 -0
- data/lib/Miyako/API/viewport.rb +54 -349
- data/lib/Miyako/API/yuki.rb +570 -353
- data/lib/Miyako/EXT/miyako_cairo.rb +5 -3
- data/lib/Miyako/EXT/slides.rb +22 -1
- data/lib/Miyako/miyako.rb +12 -13
- data/logo/EGSR_logo.png +0 -0
- data/logo/EGSR_logo_bg.png +0 -0
- data/logo/EGSR_logo_fg.png +0 -0
- data/logo/EGSR_title_banner.png +0 -0
- data/logo/EGSR_title_logo.png +0 -0
- data/logo/miyako.png +0 -0
- data/logo/miyako_banner.png +0 -0
- data/logo/space.png +0 -0
- data/miyako_basicdata.c +590 -0
- data/miyako_bitmap.c +1225 -0
- data/miyako_collision.c +403 -0
- data/miyako_drawing.c +187 -0
- data/miyako_font.c +334 -0
- data/miyako_hsv.c +830 -0
- data/miyako_layout.c +191 -0
- data/miyako_no_katana.c +1074 -0
- data/miyako_transform.c +438 -0
- data/miyako_utility.c +288 -0
- data/sample/Animation1/m1ku.rb +10 -31
- data/sample/Animation1/readme.txt +6 -6
- data/sample/Animation2/lex.rb +1 -0
- data/sample/Animation2/readme.txt +6 -6
- data/sample/Diagram_sample/diagram_sample_yuki2.rb +152 -48
- data/sample/Diagram_sample/readme.txt +9 -6
- data/sample/Room3/blue.rb +234 -187
- data/sample/Room3/ending.rb +68 -63
- data/sample/Room3/green.rb +159 -124
- data/sample/Room3/main.rb +50 -32
- data/sample/Room3/main_component.rb +3 -2
- data/sample/Room3/readme.txt +6 -6
- data/sample/Room3/red.rb +161 -134
- data/sample/Room3/room3.rb +1 -0
- data/sample/Room3/title.rb +75 -62
- data/sample/ball_action_sample.rb +204 -0
- data/sample/blit_rop.rb +70 -0
- data/sample/cairo_sample.rb +25 -0
- data/sample/circle_collision_test.rb +66 -0
- data/sample/collision_test.rb +33 -0
- data/sample/collision_test2.rb +108 -0
- data/sample/fixed_map_test/fixed_map_sample.rb +23 -32
- data/sample/fixed_map_test/readme.txt +38 -38
- data/sample/map_test/chara.rb +17 -9
- data/sample/map_test/main_parts.rb +30 -9
- data/sample/map_test/main_scene.rb +57 -41
- data/sample/map_test/map_manager.rb +13 -30
- data/sample/map_test/map_test.rb +2 -2
- data/sample/map_test/oasis.rb +17 -11
- data/sample/map_test/readme.txt +50 -48
- data/sample/map_test/route.rb +46 -33
- data/sample/map_test/town.rb +19 -13
- data/sample/polygon_test.rb +35 -0
- data/sample/rasterscroll.rb +25 -0
- data/sample/takahashi.rb +42 -0
- data/sample/text.png +0 -0
- data/sample/textbox_sample.rb +190 -0
- data/sample/transform.rb +54 -0
- data/sample/utility_test.rb +73 -0
- data/sample/utility_test2.rb +61 -0
- data/sample/utility_test3.rb +64 -0
- data/sample/utility_test4.rb +73 -0
- data/uninstall_miyako.rb +19 -0
- data/win/miyako_no_katana.so +0 -0
- metadata +165 -148
- data/miyako.png +0 -0
- data/miyako_banner.png +0 -0
- data/miyako_no_katana/miyako_no_katana.c +0 -3301
- data/sample/fixed_map_test/map_sample.rb +0 -121
data/lib/Miyako/API/map.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
=begin
|
3
3
|
--
|
4
4
|
Miyako v2.0
|
5
|
-
Copyright (C) 2007-
|
5
|
+
Copyright (C) 2007-2009 Cyross Makoto
|
6
6
|
|
7
7
|
This library is free software; you can redistribute it and/or
|
8
8
|
modify it under the terms of the GNU Lesser General Public
|
@@ -24,10 +24,19 @@ require 'csv'
|
|
24
24
|
require 'forwardable'
|
25
25
|
|
26
26
|
module Miyako
|
27
|
+
#==マップチップ構造体に配列化メソッド(to_a)を定義するための構造体クラス
|
28
|
+
#インデックス参照メソッドを追加
|
29
|
+
class MapChipStruct < Struct
|
30
|
+
#===インスタンスを配列化する
|
31
|
+
#Map/FixedMap.newメソッド内部で、MapChip構造体と、その配列とのダックタイピングのために用意
|
32
|
+
#返却値:: 自分自身を[]囲んだオブジェクトを返す
|
33
|
+
def to_a
|
34
|
+
return [self]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
27
38
|
#=マップチップ定義構造体
|
28
|
-
MapChip =
|
29
|
-
#=Map用コリジョン構造体
|
30
|
-
MapMoveAmount = Struct.new(:collisions, :amount)
|
39
|
+
MapChip = MapChipStruct.new(:chip_image, :chips, :size, :chip_size, :access_types, :collision_table, :access_table)
|
31
40
|
|
32
41
|
#=マップチップ作成ファクトリクラス
|
33
42
|
class MapChipFactory
|
@@ -44,26 +53,78 @@ module Miyako
|
|
44
53
|
chips = size.w * size.h
|
45
54
|
access_types = lines.shift[0].to_i
|
46
55
|
collision_table = Array.new(access_types){|at|
|
47
|
-
Array.new(chips){|n| Collision.new(lines.shift.map{|s| s.to_i}
|
56
|
+
Array.new(chips){|n| Collision.new(lines.shift.map{|s| s.to_i}) }
|
48
57
|
}
|
49
58
|
access_table = Array.new(access_types){|at|
|
50
|
-
Array.new(chips){|n|
|
59
|
+
Array.new(chips){|n|
|
60
|
+
lines.shift.map{|s|
|
61
|
+
v = eval(s)
|
62
|
+
next v if (v == true || v == false)
|
63
|
+
v = v.to_i
|
64
|
+
next false if v == 0
|
65
|
+
true
|
66
|
+
}
|
67
|
+
}
|
51
68
|
}
|
52
69
|
return MapChip.new(spr, chips, size, chip_size, access_types, collision_table, access_table)
|
53
70
|
end
|
54
71
|
end
|
72
|
+
|
73
|
+
#==アクセス方向定義クラス
|
74
|
+
#マップチップのアクセステーブルを参照する際に、状態(入る(:in)・出る(:out))と
|
75
|
+
#方向(:left, :right, :up, :down)から、アクセステーブルの指標を取得する必要がある。
|
76
|
+
#このクラスでは、その指標を取得するメソッドを用意している
|
77
|
+
class AccessIndex
|
78
|
+
@@accesses = {
|
79
|
+
in: { right: 2, left: 4, up: 6, down: 0},
|
80
|
+
out: { right: 3, left: 5, up: 1, down: 7}
|
81
|
+
}
|
82
|
+
@@accesses2 = {
|
83
|
+
in: [[-1,0,6],[2,-1,-1],[4,-1,-1]],
|
84
|
+
out: [[-1,7,1],[3,-1,-1],[5,-1,-1]]
|
85
|
+
}
|
86
|
+
|
87
|
+
#===状態と方向からアクセステーブルの指標を取得する
|
88
|
+
#アクセステーブルには、2種類の状態(入る=:in, 出る=:out)と、
|
89
|
+
#4種類の方向(左=:left, 右=:right, 上=:up, 下=:down)から構成される
|
90
|
+
#配列となっている。本メソッドで、状態・方向に対応するシンボルから配列の要素指標を取得する。
|
91
|
+
#指定外のシンボルを渡すと例外が発生する
|
92
|
+
#_state_:: 状態を示すシンボル(:in, :out)
|
93
|
+
#_direction_:: 方向を示すシンボル(:left, :right, :up, :down)
|
94
|
+
#返却値:: アクセステーブルの指標番号(整数)
|
95
|
+
def AccessIndex.index(state, direction)
|
96
|
+
raise MiyakoError, "can't find AcceessIndex state symbol! #{state}" unless @@accesses.has_key?(state)
|
97
|
+
raise MiyakoError, "can't find AcceessIndex direction symbol! #{direction}" unless @@accesses[state].has_key?(direction)
|
98
|
+
return @@accesses[state][direction]
|
99
|
+
end
|
100
|
+
|
101
|
+
#===状態と移動量からアクセステーブルの指標を取得する
|
102
|
+
#アクセステーブルには、2種類の状態(入る=:in, 出る=:out)と、移動量(dx,dy)から構成される
|
103
|
+
#配列となっている。本メソッドで、状態に対応するシンボル、整数から配列の要素指標を取得する。
|
104
|
+
#指定外のシンボルを渡すと例外が発生する
|
105
|
+
#_state_:: 状態を示すシンボル(:in, :out)
|
106
|
+
#_dx_:: x方向移動量
|
107
|
+
#_dy_:: y方向移動量
|
108
|
+
#返却値:: アクセステーブルの指標番号(整数)。何も移動しない場合は-1が返る
|
109
|
+
def AccessIndex.index2(state, dx, dy)
|
110
|
+
raise MiyakoError, "can't find AcceessIndex state symbol! #{state}" unless @@accesses.has_key?(state)
|
111
|
+
return @@accesses2[state][dx < -1 ? -1 : dx > 1 ? 1 : 0][dy < -1 ? -1 : dy > 1 ? 1 : 0]
|
112
|
+
end
|
113
|
+
end
|
55
114
|
|
56
115
|
#==マップ定義クラス
|
57
116
|
class Map
|
58
117
|
@@idx_ix = [-1, 2, 4]
|
59
118
|
@@idx_iy = [-1, 0, 6]
|
60
119
|
|
61
|
-
|
120
|
+
attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
|
121
|
+
attr_reader :map_layers, :mapchips, :pos, :size, :w, :h
|
62
122
|
|
63
123
|
class MapLayer #:nodoc: all
|
64
124
|
extend Forwardable
|
65
125
|
|
66
|
-
|
126
|
+
attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
|
127
|
+
attr_reader :mapchip, :mapchip_units, :pos, :size
|
67
128
|
|
68
129
|
def round(v, max) #:nodoc:
|
69
130
|
v = max + (v % max) if v < 0
|
@@ -79,7 +140,6 @@ module Miyako
|
|
79
140
|
def initialize(mapchip, mapdat, layer_size) #:nodoc:
|
80
141
|
@mapchip = mapchip
|
81
142
|
@pos = Point.new(0, 0)
|
82
|
-
@margin = Size.new(0, 0)
|
83
143
|
@size = layer_size.dup
|
84
144
|
@ow = @mapchip.chip_size.w
|
85
145
|
@oh = @mapchip.chip_size.h
|
@@ -107,6 +167,7 @@ module Miyako
|
|
107
167
|
:ow => @ow,
|
108
168
|
:oh => @oh)
|
109
169
|
}
|
170
|
+
@visible = true
|
110
171
|
resize
|
111
172
|
end
|
112
173
|
|
@@ -127,85 +188,194 @@ module Miyako
|
|
127
188
|
@modpy2[round(y, @size.h)])
|
128
189
|
end
|
129
190
|
|
130
|
-
|
131
|
-
|
191
|
+
#===実座標を使用して、指定のレイヤー・位置のマップチップ番号を取得
|
192
|
+
#イベントレイヤーでの番号はイベント番号と一致する
|
193
|
+
#_x_:: マップチップ単位での位置(ピクセル単位)
|
194
|
+
#_y_:: マップチップ単位での位置(ピクセル単位)
|
195
|
+
#返却値:: マップチップ番号(マップチップが設定されている時は0以上の整数、設定されていない場合は-1が返る)
|
196
|
+
def get_code(x, y)
|
197
|
+
pos = convert_position(x / @mapchip.chip_size[0], y / @mapchip.chip_size[1])
|
132
198
|
return @mapdat[pos.y][pos.x]
|
133
199
|
end
|
134
200
|
|
201
|
+
#===指定の矩形のキャラクタに掛かるマップチップの左上位置の組み合わせを返す
|
202
|
+
#但し、引数には、Rect(x,y,w,h)形式のインスタンスを渡す
|
203
|
+
#_rect_:: キャラクタの矩形
|
204
|
+
#返却値:: マップチップ左上位置の配列(キャラクタに掛かる位置の組み合わせ)
|
205
|
+
def product_position(rect)
|
206
|
+
return Utility.product_position(rect, @mapchip.chip_size)
|
207
|
+
end
|
208
|
+
|
209
|
+
#===指定の矩形のキャラクタに掛かるマップチップの左上位置の組み合わせを返す
|
210
|
+
#但し、引数には、Square([x1,y1,x2,y2])形式のインスタンスを渡す
|
211
|
+
#_square_:: キャラクタの矩形
|
212
|
+
#返却値:: マップチップ左上位置の配列(キャラクタに掛かる位置の組み合わせ)
|
213
|
+
def product_position_by_square(square)
|
214
|
+
return Utility.product_position_by_square(square, @mapchip.chip_size)
|
215
|
+
end
|
216
|
+
|
217
|
+
#===キャラクタとマップチップが重なっているかどうか問い合わせる
|
218
|
+
#指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと重なっているかどうか問い合わせる
|
219
|
+
#引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
|
220
|
+
#指定の位置のマップチップ番号が-1(未定義)のときはnilを返す
|
221
|
+
#_type_:: 移動形式(0以上の整数)
|
222
|
+
#_pos_:: 調査対象のマップチップの位置
|
223
|
+
#_collision_:: キャラクタのコリジョン
|
224
|
+
#_rect_:: キャラクタの矩形
|
225
|
+
#返却値:: コリジョンが重なっていれば、そのときのマップチップ番号を返す。重なっていなければnilを返す
|
226
|
+
def collision?(type, pos, collision, rect)
|
227
|
+
code = get_code(*pos.to_a)
|
228
|
+
return nil if code == -1
|
229
|
+
return @mapchip.collision_table[type][code].collision?(pos, collision, rect) ? code : nil
|
230
|
+
end
|
231
|
+
|
232
|
+
#===キャラクタとマップチップが隣り合っているかどうか問い合わせる
|
233
|
+
#指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと隣り合っているかどうか問い合わせる
|
234
|
+
#引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
|
235
|
+
#指定の位置のマップチップ番号が-1(未定義)のときはnilを返す
|
236
|
+
#_type_:: 移動形式(0以上の整数)
|
237
|
+
#_pos_:: 調査対象のマップチップの位置
|
238
|
+
#_collision_:: キャラクタのコリジョン
|
239
|
+
#_rect_:: キャラクタの矩形
|
240
|
+
#返却値:: コリジョンが隣り合っていれば、そのときのマップチップ番号を返す。隣り合っていなければnilを返す
|
241
|
+
def meet?(type, pos, collision, rect)
|
242
|
+
code = get_code(*pos.to_a)
|
243
|
+
return nil if code == -1
|
244
|
+
return @mapchip.collision_table[type][code].meet?(pos, collision, rect) ? code : nil
|
245
|
+
end
|
246
|
+
|
247
|
+
#===キャラクタとマップチップが覆い被さっているかどうか問い合わせる
|
248
|
+
#指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンを覆い被さっているかどうか問い合わせる
|
249
|
+
#引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
|
250
|
+
#指定の位置のマップチップ番号が-1(未定義)のときはnilを返す
|
251
|
+
#_type_:: 移動形式(0以上の整数)
|
252
|
+
#_pos_:: 調査対象のマップチップの位置
|
253
|
+
#_collision_:: キャラクタのコリジョン
|
254
|
+
#_rect_:: キャラクタの矩形
|
255
|
+
#返却値:: どちらかのコリジョンが覆い被さっていれば、そのときのマップチップ番号を返す。
|
256
|
+
#被さっていなければnilを返す
|
257
|
+
def cover?(type, pos, collision, rect)
|
258
|
+
code = get_code(*pos.to_a)
|
259
|
+
return nil if code == -1
|
260
|
+
return @mapchip.collision_table[type][code].cover?(pos, collision, rect) ? code : nil
|
261
|
+
end
|
262
|
+
|
263
|
+
#===キャラクタとマップチップが重なっているかどうか問い合わせる
|
264
|
+
#指定の位置と方向で、指定の位置のマップチップ上で移動できるかどうか問い合わせる
|
265
|
+
#指定の位置のマップチップ番号が-1(未定義)のとき、移動していない(dx==0 and dy==0)ときはtrueを返す
|
266
|
+
#_type_:: 移動形式(0以上の整数)
|
267
|
+
#_inout_:: 入退形式(:in もしくは :out)
|
268
|
+
#_pos_:: 調査対象のマップチップの位置
|
269
|
+
#_dx_:: 移動量(x座標)
|
270
|
+
#_dy_:: 移動量(y座標)
|
271
|
+
#返却値:: 移動可能ならばtrueを返す
|
272
|
+
def can_access?(type, inout, pos, dx, dy)
|
273
|
+
code = get_code(pos[0]+dx, pos[1]+dy)
|
274
|
+
return true if code == -1
|
275
|
+
index = AccessIndex.index2(inout, dx, dy)
|
276
|
+
return true if index == -1
|
277
|
+
return @mapchip.access_table[type][code][index]
|
278
|
+
end
|
279
|
+
|
135
280
|
def dispose #:nodoc:
|
136
281
|
@mapdat = nil
|
137
282
|
@baseimg = nil
|
138
283
|
end
|
284
|
+
|
285
|
+
#===マップレイヤーを画面に描画する
|
286
|
+
#転送する画像は、マップ上のから(-margin.x, -margin.y)(単位:ピクセル)の位置に対応するチップを左上にして描画する
|
287
|
+
#ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
|
288
|
+
#(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
|
289
|
+
#ブロックの引数は、|画面のSpriteUnit|となる。
|
290
|
+
#visibleメソッドの値がfalseのときは描画されない。
|
291
|
+
#返却値:: 自分自身を返す
|
292
|
+
def render
|
293
|
+
end
|
294
|
+
|
295
|
+
#===マップレイヤーを画像に転送する
|
296
|
+
#転送する画像は、マップ上のから(-margin.x, -margin.y)(単位:ピクセル)の位置に対応するチップを左上にして描画する
|
297
|
+
#ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
|
298
|
+
#(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
|
299
|
+
#ブロックの引数は、|転送先のSpriteUnit|となる。
|
300
|
+
#visibleメソッドの値がfalseのときは描画されない。
|
301
|
+
#_dst_:: 転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)
|
302
|
+
#返却値:: 自分自身を返す
|
303
|
+
def render_to(dst)
|
304
|
+
end
|
139
305
|
end
|
140
306
|
|
141
307
|
#===インスタンスを生成する
|
142
|
-
|
308
|
+
#レイヤーごとにMapChip構造体を用意する。
|
309
|
+
#但し、すべてのレイヤーに同一のMapChip構造体を使うときは、単体で渡すことも可能
|
310
|
+
#第1引数にto_aメソッドが実装されていれば、配列化した要素をMapChip構造体として各レイヤに渡す
|
311
|
+
#また、各レイヤにMapChip構造体を渡すとき、レイヤ数より要素数が少ないときは、先頭に戻って繰り返し渡す仕様になっている
|
312
|
+
#各MapChip構造体のマップチップの大きさを同じにしておく必要がある
|
313
|
+
#_mapchips_:: マップチップ構造体群(MapChip構造体単体もしくは配列)
|
143
314
|
#_layer_csv_:: レイヤーファイル(CSVファイル)
|
144
315
|
#_event_manager_:: MapEventManagerクラスのインスタンス
|
145
316
|
#返却値:: 生成したインスタンス
|
146
|
-
def initialize(
|
317
|
+
def initialize(mapchips, layer_csv, event_manager)
|
318
|
+
@event_layers = []
|
147
319
|
@em = event_manager.dup
|
148
320
|
@em.set(self)
|
149
|
-
@
|
150
|
-
@visible =
|
321
|
+
@mapchips = mapchips.to_a
|
322
|
+
@visible = true
|
151
323
|
@pos = Point.new(0, 0)
|
152
|
-
@margin = Size.new(0, 0)
|
153
|
-
@coll = Collision.new(Rect.new(0, 0, 0, 0), Point.new(0, 0))
|
154
324
|
layer_data = CSV.readlines(layer_csv)
|
155
325
|
raise MiyakoError, "This file is not Miyako Map Layer file! : #{layer_csv}" unless layer_data.shift[0] == "Miyako Maplayer"
|
156
326
|
|
157
327
|
tmp = layer_data.shift # 空行の空読み込み
|
158
328
|
|
159
|
-
|
160
|
-
@w =
|
161
|
-
@h =
|
329
|
+
@size = Size.new(*(tmp[0..1].map{|v| v.to_i}))
|
330
|
+
@w = @size.w
|
331
|
+
@h = @size.h
|
162
332
|
|
163
333
|
layers = layer_data.shift[0].to_i
|
164
334
|
|
165
|
-
|
335
|
+
evlist = []
|
336
|
+
brlist = []
|
166
337
|
layers.times{|n|
|
167
338
|
name = layer_data.shift[0]
|
168
|
-
if name == "<event>"
|
169
|
-
name = :event
|
170
|
-
else
|
171
|
-
name = /\<(\d+)\>/.match(name).to_a[1].to_i
|
172
|
-
end
|
173
339
|
values = []
|
174
|
-
|
340
|
+
@size.h.times{|y|
|
175
341
|
values << layer_data.shift.map{|m| m.to_i}
|
176
342
|
}
|
177
|
-
|
343
|
+
if name == "<event>"
|
344
|
+
evlist << values
|
345
|
+
else
|
346
|
+
brlist << values
|
347
|
+
end
|
178
348
|
}
|
179
349
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
if brlist.has_key?(:event)
|
184
|
-
@event_layer = Array.new
|
185
|
-
brlist[:event].each_with_index{|ly, y|
|
350
|
+
evlist.each{|events|
|
351
|
+
event_layer = Array.new
|
352
|
+
events.each_with_index{|ly, y|
|
186
353
|
ly.each_with_index{|code, x|
|
187
354
|
next unless @em.include?(code)
|
188
|
-
|
355
|
+
event_layer.push(@em.create(code, x * @mapchips.first.chip_size.w, y * @mapchips.first.chip_size.h))
|
189
356
|
}
|
190
357
|
}
|
191
|
-
|
192
|
-
|
358
|
+
@event_layers << event_layer
|
359
|
+
}
|
193
360
|
|
361
|
+
mc = @mapchips.cycle
|
362
|
+
@mapchips = mc.take(layers)
|
194
363
|
@map_layers = []
|
195
|
-
|
196
|
-
br =
|
197
|
-
@map_layers.push(MapLayer.new(
|
364
|
+
brlist.each{|br|
|
365
|
+
br = br.map{|b| b.map{|bb| bb >= @mapchips.first.chips ? -1 : bb } }
|
366
|
+
@map_layers.push(MapLayer.new(mc.next, br, @size))
|
198
367
|
}
|
199
368
|
end
|
200
369
|
|
201
370
|
#===マップにイベントを追加する
|
371
|
+
#_idx_:: 追加するイベントレイヤの指標
|
202
372
|
#_code_:: イベント番号(Map.newメソッドで渡したイベント番号に対応)
|
203
373
|
#_x_:: マップ上の位置(x方向)
|
204
374
|
#_y_:: マップ常温位置(y方向)
|
205
375
|
#返却値:: 自分自身を返す
|
206
|
-
def add_event(code, x, y)
|
376
|
+
def add_event(idx, code, x, y)
|
207
377
|
return self unless @em.include?(code)
|
208
|
-
@
|
378
|
+
@event_layers[idx].push(@em.create(code, x, y))
|
209
379
|
return self
|
210
380
|
end
|
211
381
|
|
@@ -243,12 +413,25 @@ module Miyako
|
|
243
413
|
return self.rect
|
244
414
|
end
|
245
415
|
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
416
|
+
#===スプライトに変換した画像を表示する
|
417
|
+
#すべてのパーツを貼り付けた、1枚のスプライトを返す
|
418
|
+
#引数1個のブロックを渡せば、スプライトに補正をかけることが出来る
|
419
|
+
#返却値:: 描画したスプライト
|
420
|
+
def to_sprite
|
421
|
+
rect = self.broad_rect
|
422
|
+
sprite = Sprite.new(:size=>rect.to_a[2,2], :type=>:ac)
|
423
|
+
Drawing.fill(sprite, [0,0,0])
|
424
|
+
Bitmap.ck_to_ac!(sprite, [0,0,0])
|
425
|
+
self.render_to(sprite){|sunit, dunit| sunit.x -= rect.x; sunit.y -= rect.y }
|
426
|
+
yield sprite if block_given?
|
427
|
+
return sprite
|
428
|
+
end
|
429
|
+
|
430
|
+
#===SpriteUnit構造体を生成する
|
431
|
+
#いったんSpriteインスタンスを作成し、それをもとにSpriteUnit構造体を生成する。
|
432
|
+
#返却値:: 生成したSpriteUnit構造体
|
433
|
+
def to_unit
|
434
|
+
return self.to_sprite.to_unit
|
252
435
|
end
|
253
436
|
|
254
437
|
#===設定したマージンを各レイヤーに同期させる
|
@@ -258,146 +441,89 @@ module Miyako
|
|
258
441
|
return @map_layers[idx]
|
259
442
|
end
|
260
443
|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
#
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
yield code if block_given?
|
269
|
-
return code
|
270
|
-
end
|
271
|
-
|
272
|
-
#===あとで書く
|
273
|
-
#_idx_:: あとで書く
|
274
|
-
#_x_:: あとで書く
|
275
|
-
#_y_:: あとで書く
|
276
|
-
#返却値:: あとで書く
|
444
|
+
#===実座標を使用して、指定のレイヤー・位置のマップチップ番号を取得
|
445
|
+
#イベントレイヤーでの番号はイベント番号と一致する
|
446
|
+
#ブロックを渡すと、求めたマップチップ番号をブロック引数として受け取る評価を行える
|
447
|
+
#_idx_:: マップレイヤー配列のインデックス
|
448
|
+
#_x_:: マップチップ単位での位置(ピクセル単位)
|
449
|
+
#_y_:: マップチップ単位での位置(ピクセル単位)
|
450
|
+
#返却値:: マップチップ番号(マップチップが設定されている時は0以上の整数、設定されていない場合は-1が返る)
|
277
451
|
def get_code(idx, x = 0, y = 0)
|
278
452
|
code = @map_layers[idx].get_code(x, y)
|
279
453
|
yield code if block_given?
|
280
454
|
return code
|
281
455
|
end
|
282
456
|
|
283
|
-
|
284
|
-
#_idx_::
|
285
|
-
#_code_::
|
286
|
-
#_base_::
|
287
|
-
#返却値::
|
457
|
+
#===対象のマップチップ番号の画像を置き換える
|
458
|
+
#_idx_:: 置き換えるマップチップレイヤー番号
|
459
|
+
#_code_:: 置き換えるマップチップ番号
|
460
|
+
#_base_:: 置き換え対象の画像・アニメーション
|
461
|
+
#返却値:: 自分自身を返す
|
288
462
|
def set_mapchip_base(idx, code, base)
|
289
463
|
@map_layers[idx].mapchip_units[code] = base
|
290
464
|
return self
|
291
465
|
end
|
292
|
-
|
293
|
-
#===あとで書く
|
294
|
-
#_type_:: あとで書く
|
295
|
-
#_size_:: あとで書く
|
296
|
-
#_collision_:: あとで書く
|
297
|
-
#返却値:: あとで書く
|
298
|
-
def get_amount(type, size, collision)
|
299
|
-
mma = MapMoveAmount.new([], collision.direction.dup)
|
300
|
-
return mma if(mma.amount[0] == 0 && mma.amount[1] == 0)
|
301
|
-
collision.pos = Point.new(*@pos.to_a[0..1])
|
302
|
-
dx, dy = collision.direction[0]*collision.amount[0], collision.direction[1]*collision.amount[1]
|
303
|
-
px1, px2 = (@pos[0]+dx) / @mapchip.chip_size[0], (@pos[0]+size[0]-1+dx) / @mapchip.chip_size[0]
|
304
|
-
py1, py2 = (@pos[1]+dy) / @mapchip.chip_size[1], (@pos[1]+size[1]-1+dy) / @mapchip.chip_size[1]
|
305
|
-
(py1..py2).each{|py|
|
306
|
-
rpy = py * @mapchip.chip_size[1]
|
307
|
-
(px1..px2).each{|px|
|
308
|
-
rpx = px * @mapchip.chip_size[0]
|
309
|
-
@map_layers.each_with_index{|ml, idx|
|
310
|
-
code = ml.get_code(px, py)
|
311
|
-
next if code == -1 # not use chip
|
312
|
-
@coll = @mapchip.collision_table[type][code].dup
|
313
|
-
@coll.pos = Point.new(rpx, rpy)
|
314
|
-
atable = @mapchip.access_table[type][code]
|
315
|
-
if @coll.into?(collision)
|
316
|
-
mma.amount[0] = mma.amount[0] & atable[@@idx_ix[collision.direction[0]]]
|
317
|
-
mma.amount[1] = mma.amount[1] & atable[@@idx_iy[collision.direction[1]]]
|
318
|
-
mma.collisions << [idx, code, :into]
|
319
|
-
end
|
320
|
-
}
|
321
|
-
}
|
322
|
-
}
|
323
|
-
mma.amount[0] *= collision.amount[0]
|
324
|
-
mma.amount[1] *= collision.amount[1]
|
325
|
-
yield mma if block_given?
|
326
|
-
return mma
|
327
|
-
end
|
328
|
-
|
329
|
-
#===あとで書く
|
330
|
-
#_type_:: あとで書く
|
331
|
-
#_rect_:: あとで書く
|
332
|
-
#_collision_:: あとで書く
|
333
|
-
#返却値:: あとで書く
|
334
|
-
def get_amount_by_rect(type, rect, collision)
|
335
|
-
mma = MapMoveAmount.new([], collision.direction.dup)
|
336
|
-
return mma if(mma.amount[0] == 0 && mma.amount[1] == 0)
|
337
|
-
dx, dy = collision.direction[0]*collision.amount[0], collision.direction[1]*collision.amount[1]
|
338
|
-
x, y = rect.to_a[0..1]
|
339
|
-
collision.pos = Point.new(x, y)
|
340
|
-
px1, px2 = (x+dx) / @mapchip.chip_size[0], (x+rect[2]-1+dx) / @mapchip.chip_size[0]
|
341
|
-
py1, py2 = (y+dy) / @mapchip.chip_size[1], (y+rect[3]-1+dy) / @mapchip.chip_size[1]
|
342
|
-
(py1..py2).each{|py|
|
343
|
-
rpy = py * @mapchip.chip_size[1]
|
344
|
-
(px1..px2).each{|px|
|
345
|
-
rpx = px * @mapchip.chip_size[0]
|
346
|
-
@map_layers.each_with_index{|ml, idx|
|
347
|
-
code = ml.get_code(px, py)
|
348
|
-
next if code == -1 # not use chip
|
349
|
-
@coll = @mapchip.collision_table[type][code].dup
|
350
|
-
@coll.pos = Point.new(rpx, rpy)
|
351
|
-
atable = @mapchip.access_table[type][code]
|
352
|
-
if @coll.into?(collision)
|
353
|
-
mma.amount[0] = mma.amount[0] & atable[@@idx_ix[collision.direction[0]]]
|
354
|
-
mma.amount[1] = mma.amount[1] & atable[@@idx_iy[collision.direction[1]]]
|
355
|
-
mma.collisions << [idx, code, :into]
|
356
|
-
end
|
357
|
-
}
|
358
|
-
}
|
359
|
-
}
|
360
|
-
mma.amount[0] *= collision.amount[0]
|
361
|
-
mma.amount[1] *= collision.amount[1]
|
362
|
-
yield mma if block_given?
|
363
|
-
return mma
|
364
|
-
end
|
365
466
|
|
366
|
-
|
367
|
-
|
467
|
+
#===マップチップ1枚の大きさを取得する
|
468
|
+
#マップチップの大きさが32×32ピクセルの場合は、[32,32]のSize構造体が返る
|
469
|
+
#返却値:: マップチップのサイズ(Size構造体)
|
368
470
|
def chip_size
|
369
|
-
return @
|
471
|
+
return @mapchips.first.chip_size
|
370
472
|
end
|
371
473
|
|
372
|
-
|
373
|
-
|
474
|
+
#===すべてのマップイベントを終了させる
|
475
|
+
#マップに登録しているイベントすべてのfinalメソッドを呼び出す
|
374
476
|
def final
|
375
|
-
@
|
477
|
+
@event_layers.each{|ee| ee.each{|e| e.final }}
|
376
478
|
end
|
377
479
|
|
378
|
-
|
379
|
-
#返却値:: あとで書く
|
480
|
+
#===マップ情報を解放する
|
380
481
|
def dispose
|
381
482
|
@map_layers.each{|l|
|
382
483
|
l.dispose
|
383
484
|
l = nil
|
384
485
|
}
|
385
486
|
@map_layers = Array.new
|
386
|
-
if @event_layer
|
387
|
-
@event_layer.each{|e| e.dispose }
|
388
|
-
@event_layer = nil
|
389
|
-
end
|
390
|
-
end
|
391
487
|
|
392
|
-
|
393
|
-
|
394
|
-
|
488
|
+
@event_layers.each{|ee|
|
489
|
+
ee.each{|e| e.dispose }
|
490
|
+
ee.clear
|
491
|
+
}
|
492
|
+
@event_layers.clear
|
493
|
+
|
494
|
+
@mapchips.clear
|
495
|
+
@mapchips = nil
|
395
496
|
end
|
396
497
|
|
397
498
|
#===マップに登録しているイベントインスタンス(マップイベント)を取得する
|
398
499
|
#返却値:: マップイベントの配列
|
399
500
|
def events
|
400
|
-
return @
|
501
|
+
return @event_layers
|
502
|
+
end
|
503
|
+
|
504
|
+
#===マップを画面に描画する
|
505
|
+
#転送する画像は、マップ上のから(-margin.x, -margin.y)(単位:ピクセル)の位置に対応するチップを左上にして描画する
|
506
|
+
#各レイヤ-を、レイヤーインデックス番号の若い順に描画する
|
507
|
+
#但し、マップイベントは描画しない
|
508
|
+
#ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
|
509
|
+
#(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
|
510
|
+
#ブロックの引数は、|画面のSpriteUnit|となる。
|
511
|
+
#visibleメソッドの値がfalseのときは描画されない。
|
512
|
+
#返却値:: 自分自身を返す
|
513
|
+
def render
|
514
|
+
end
|
515
|
+
|
516
|
+
#===マップを画像に描画する
|
517
|
+
#転送する画像は、マップ上のから(-margin.x, -margin.y)(単位:ピクセル)の位置に対応するチップを左上にして描画する
|
518
|
+
#各レイヤ-を、レイヤーインデックス番号の若い順に描画する
|
519
|
+
#但し、マップイベントは描画しない
|
520
|
+
#ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
|
521
|
+
#(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
|
522
|
+
#ブロックの引数は、|転送先のSpriteUnit|となる。
|
523
|
+
#visibleメソッドの値がfalseのときは描画されない。
|
524
|
+
#_dst_:: 転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)
|
525
|
+
#返却値:: 自分自身を返す
|
526
|
+
def render_to(dst)
|
401
527
|
end
|
402
528
|
end
|
403
529
|
end
|