cyross-ruby-miyako-mswin32 2.0.5
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 +929 -0
- data/img/cursor.png +0 -0
- data/img/cursors.png +0 -0
- data/img/dice.png +0 -0
- data/img/wait_cursor.png +0 -0
- data/img/win_base.png +0 -0
- data/img/window.png +0 -0
- data/install_miyako.rb +61 -0
- data/lib/Miyako/API/audio.rb +198 -0
- data/lib/Miyako/API/basic_data.rb +573 -0
- data/lib/Miyako/API/bitmap.rb +507 -0
- data/lib/Miyako/API/choices.rb +475 -0
- data/lib/Miyako/API/collision.rb +460 -0
- data/lib/Miyako/API/diagram.rb +561 -0
- data/lib/Miyako/API/drawing.rb +151 -0
- data/lib/Miyako/API/fixedmap.rb +428 -0
- data/lib/Miyako/API/font.rb +403 -0
- data/lib/Miyako/API/input.rb +447 -0
- data/lib/Miyako/API/layout.rb +433 -0
- data/lib/Miyako/API/map.rb +529 -0
- data/lib/Miyako/API/map_event.rb +198 -0
- data/lib/Miyako/API/modules.rb +109 -0
- data/lib/Miyako/API/movie.rb +154 -0
- data/lib/Miyako/API/parts.rb +189 -0
- data/lib/Miyako/API/plane.rb +166 -0
- data/lib/Miyako/API/screen.rb +325 -0
- data/lib/Miyako/API/shape.rb +443 -0
- data/lib/Miyako/API/sprite.rb +752 -0
- data/lib/Miyako/API/sprite_animation.rb +481 -0
- data/lib/Miyako/API/spriteunit.rb +147 -0
- data/lib/Miyako/API/story.rb +300 -0
- data/lib/Miyako/API/textbox.rb +725 -0
- data/lib/Miyako/API/utility.rb +388 -0
- data/lib/Miyako/API/viewport.rb +140 -0
- data/lib/Miyako/API/yuki.rb +996 -0
- data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
- data/lib/Miyako/EXT/raster_scroll.rb +138 -0
- data/lib/Miyako/EXT/slides.rb +157 -0
- data/lib/Miyako/miyako.rb +171 -0
- data/lib/Miyako/miyako_no_katana.so +0 -0
- 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/sample/Animation1/m1ku.rb +68 -0
- data/sample/Animation1/m1ku_arm_0.png +0 -0
- data/sample/Animation1/m1ku_arm_1.png +0 -0
- data/sample/Animation1/m1ku_arm_2.png +0 -0
- data/sample/Animation1/m1ku_arm_3.png +0 -0
- data/sample/Animation1/m1ku_back.jpg +0 -0
- data/sample/Animation1/m1ku_body.png +0 -0
- data/sample/Animation1/m1ku_eye_0.png +0 -0
- data/sample/Animation1/m1ku_eye_1.png +0 -0
- data/sample/Animation1/m1ku_eye_2.png +0 -0
- data/sample/Animation1/m1ku_eye_3.png +0 -0
- data/sample/Animation1/m1ku_hair_front.png +0 -0
- data/sample/Animation1/m1ku_hair_rear.png +0 -0
- data/sample/Animation1/readme.txt +72 -0
- data/sample/Animation2/lex.rb +96 -0
- data/sample/Animation2/lex_back.png +0 -0
- data/sample/Animation2/lex_body.png +0 -0
- data/sample/Animation2/lex_roadroller.png +0 -0
- data/sample/Animation2/lex_wheel_0.png +0 -0
- data/sample/Animation2/lex_wheel_1.png +0 -0
- data/sample/Animation2/lex_wheel_2.png +0 -0
- data/sample/Animation2/readme.txt +72 -0
- data/sample/Animation2/song_title.png +0 -0
- data/sample/Diagram_sample/back.png +0 -0
- data/sample/Diagram_sample/chr01.png +0 -0
- data/sample/Diagram_sample/chr02.png +0 -0
- data/sample/Diagram_sample/cursor.png +0 -0
- data/sample/Diagram_sample/diagram_sample_yuki2.rb +387 -0
- data/sample/Diagram_sample/readme.txt +90 -0
- data/sample/Diagram_sample/wait_cursor.png +0 -0
- data/sample/Room3/blue.rb +297 -0
- data/sample/Room3/ending.rb +180 -0
- data/sample/Room3/green.rb +220 -0
- data/sample/Room3/image/akamatsu.png +0 -0
- data/sample/Room3/image/aoyama.png +0 -0
- data/sample/Room3/image/congra.png +0 -0
- data/sample/Room3/image/congratulation.png +0 -0
- data/sample/Room3/image/congratulation_bg.png +0 -0
- data/sample/Room3/image/cursor.png +0 -0
- data/sample/Room3/image/midori.png +0 -0
- data/sample/Room3/image/mittsu_no_oheya.png +0 -0
- data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
- data/sample/Room3/image/room_blue.png +0 -0
- data/sample/Room3/image/room_green.png +0 -0
- data/sample/Room3/image/room_red.png +0 -0
- data/sample/Room3/image/start.png +0 -0
- data/sample/Room3/image/three_doors.png +0 -0
- data/sample/Room3/image/wait_cursor.png +0 -0
- data/sample/Room3/main.rb +120 -0
- data/sample/Room3/main_component.rb +59 -0
- data/sample/Room3/readme.txt +76 -0
- data/sample/Room3/red.rb +227 -0
- data/sample/Room3/room3.rb +27 -0
- data/sample/Room3/title.rb +184 -0
- 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 +62 -0
- data/sample/collision_test.rb +33 -0
- data/sample/collision_test2.rb +104 -0
- data/sample/fixed_map_test/cursor.png +0 -0
- data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
- data/sample/fixed_map_test/map.csv +19 -0
- data/sample/fixed_map_test/map_01.png +0 -0
- data/sample/fixed_map_test/mapchip.csv +23 -0
- data/sample/fixed_map_test/monster.png +0 -0
- data/sample/fixed_map_test/readme.txt +72 -0
- data/sample/map_test/chara.rb +58 -0
- data/sample/map_test/chr1.png +0 -0
- data/sample/map_test/cursor.png +0 -0
- data/sample/map_test/main_parts.rb +69 -0
- data/sample/map_test/main_scene.rb +153 -0
- data/sample/map_test/map.png +0 -0
- data/sample/map_test/map2.png +0 -0
- data/sample/map_test/map_layer.csv +127 -0
- data/sample/map_test/map_manager.rb +75 -0
- data/sample/map_test/map_test.rb +23 -0
- data/sample/map_test/mapchip.csv +21 -0
- data/sample/map_test/oasis.rb +71 -0
- data/sample/map_test/readme.txt +89 -0
- data/sample/map_test/route.rb +157 -0
- data/sample/map_test/sea.png +0 -0
- data/sample/map_test/town.rb +74 -0
- data/sample/map_test/wait_cursor.png +0 -0
- data/sample/map_test/window.png +0 -0
- 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
- metadata +196 -0
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
=begin
|
|
3
|
+
--
|
|
4
|
+
Miyako v2.0
|
|
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
|
+
#moveやleftメソッドを呼び出した時に評価したいブロックを渡すことで、付随処理を自律して行うことが出来る。
|
|
84
|
+
#引数は、|self, x, y, dx, dy|の5つ。
|
|
85
|
+
#各引数は、「レシーバ, 移動後x座標位置, 移動後y座標位置, x座標移動量, y座標移動量」の機能がある。
|
|
86
|
+
#評価が行われるのは、left,outside_left,center,right,outside_right,top,outside_top,middle,bottom,outside_bottom
|
|
87
|
+
#move,move_toの各メソッド。
|
|
88
|
+
#返却値:: ブロック管理配列
|
|
89
|
+
def on_move
|
|
90
|
+
return @layout.on_move
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
#===mixinしたインスタンスの位置を左端(x軸)に移動させる
|
|
94
|
+
#設置するとき、基準となる空間の内側に設置される
|
|
95
|
+
#ブロックでは、数値を返却することで、左端からのマージンを設定できる(正の方向へ移動)
|
|
96
|
+
#ブロック引数は、自分自身の幅
|
|
97
|
+
#返却値:: 自分自身
|
|
98
|
+
def left(&margin)
|
|
99
|
+
base = @layout.base.rect
|
|
100
|
+
t = @layout.pos[0]
|
|
101
|
+
@layout.pos[0] = base[0] + (margin ? margin[base[2]].to_i : 0)
|
|
102
|
+
@layout.snap.children.each{|c| c.left(&margin) }
|
|
103
|
+
update_layout(@layout.pos[0]-t, 0)
|
|
104
|
+
@layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
|
|
105
|
+
return self
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#===mixinしたインスタンスの位置を左端(x軸)に移動させる
|
|
109
|
+
#設置するとき、基準となる空間の外側に設置される
|
|
110
|
+
#ブロックでは、数値を返却することで、左端からのマージンを設定できる(負の方向へ移動)
|
|
111
|
+
#ブロック引数は、自分自身の幅
|
|
112
|
+
#返却値:: 自分自身
|
|
113
|
+
def outside_left(&margin)
|
|
114
|
+
base = @layout.base.rect
|
|
115
|
+
t = @layout.pos[0]
|
|
116
|
+
@layout.pos[0] = base[0] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
|
|
117
|
+
update_layout(@layout.pos[0]-t, 0)
|
|
118
|
+
@layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
|
|
119
|
+
return self
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
#===mixinしたインスタンスの位置を中間(x軸)に移動させる
|
|
123
|
+
#返却値:: 自分自身
|
|
124
|
+
def center
|
|
125
|
+
base = @layout.base.rect
|
|
126
|
+
t = @layout.pos[0]
|
|
127
|
+
@layout.pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
|
|
128
|
+
update_layout(@layout.pos[0]-t, 0)
|
|
129
|
+
@layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
|
|
130
|
+
return self
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
#===mixinしたインスタンスの位置を右端(x軸)に移動させる
|
|
134
|
+
#設置するとき、基準となる空間の内側に設置される
|
|
135
|
+
#ブロックでは、数値を返却することで、右端からのマージンを設定できる(負の方向へ移動)
|
|
136
|
+
#ブロック引数は、自分自身の幅
|
|
137
|
+
#返却値:: 自分自身
|
|
138
|
+
def right(&margin)
|
|
139
|
+
base = @layout.base.rect
|
|
140
|
+
t = @layout.pos[0]
|
|
141
|
+
@layout.pos[0] = base[0] + base[2] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
|
|
142
|
+
update_layout(@layout.pos[0]-t, 0)
|
|
143
|
+
@layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
|
|
144
|
+
return self
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
#===mixinしたインスタンスの位置を右端(x軸)に移動させる
|
|
148
|
+
#設置するとき、基準となる空間の外側に設置される
|
|
149
|
+
#ブロックでは、数値を返却することで、右端からのマージンを設定できる(正の方向へ移動)
|
|
150
|
+
#ブロック引数は、自分自身の幅
|
|
151
|
+
#返却値:: 自分自身
|
|
152
|
+
def outside_right(&margin)
|
|
153
|
+
base = @layout.base.rect
|
|
154
|
+
t = @layout.pos[0]
|
|
155
|
+
@layout.pos[0] = base[0] + base[2] + (margin ? margin[base[2]].to_i : 0)
|
|
156
|
+
update_layout(@layout.pos[0]-t, 0)
|
|
157
|
+
@layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
|
|
158
|
+
return self
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
#===mixinしたインスタンスの位置を上端(y軸)に移動させる
|
|
162
|
+
#設置するとき、基準となる空間の内側に設置される
|
|
163
|
+
#ブロックでは、数値を返却することで、上端からのマージンを設定できる(正の方向へ移動)
|
|
164
|
+
#ブロック引数は、自分自身の幅
|
|
165
|
+
#返却値:: 自分自身
|
|
166
|
+
def top(&margin)
|
|
167
|
+
base = @layout.base.rect
|
|
168
|
+
t = @layout.pos[1]
|
|
169
|
+
@layout.pos[1] = base[1] + (margin ? margin[base[3]].to_i : 0)
|
|
170
|
+
update_layout(0, @layout.pos[1]-t)
|
|
171
|
+
@layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
|
|
172
|
+
return self
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
#===mixinしたインスタンスの位置を上端(y軸)に移動させる
|
|
176
|
+
#設置するとき、基準となる空間の内側に設置される
|
|
177
|
+
#ブロックでは、数値を返却することで、上端からのマージンを設定できる(負の方向へ移動)
|
|
178
|
+
#ブロック引数は、自分自身の幅
|
|
179
|
+
#返却値:: 自分自身
|
|
180
|
+
def outside_top(&margin)
|
|
181
|
+
base = @layout.base.rect
|
|
182
|
+
t = @layout.pos[1]
|
|
183
|
+
@layout.pos[1] = base[1] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
|
|
184
|
+
update_layout(0, @layout.pos[1]-t)
|
|
185
|
+
@layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
|
|
186
|
+
return self
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
#===mixinしたインスタンスの位置を中間(y軸)に移動させる
|
|
190
|
+
#返却値:: 自分自身
|
|
191
|
+
def middle
|
|
192
|
+
base = @layout.base.rect
|
|
193
|
+
t = @layout.pos[1]
|
|
194
|
+
@layout.pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
|
|
195
|
+
update_layout(0, @layout.pos[1]-t)
|
|
196
|
+
@layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
|
|
197
|
+
return self
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
#===mixinしたインスタンスの位置を下端(y軸)に移動させる
|
|
201
|
+
#設置するとき、基準となる空間の内側に設置される
|
|
202
|
+
#ブロックでは、数値を返却することで、下端からのマージンを設定できる(負の方向へ移動)
|
|
203
|
+
#ブロック引数は、自分自身の幅
|
|
204
|
+
#返却値:: 自分自身
|
|
205
|
+
def bottom(&margin)
|
|
206
|
+
base = @layout.base.rect
|
|
207
|
+
t = @layout.pos[1]
|
|
208
|
+
@layout.pos[1] = base[1] + base[3] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
|
|
209
|
+
update_layout(0, @layout.pos[1]-t)
|
|
210
|
+
@layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
|
|
211
|
+
return self
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
#===mixinしたインスタンスの位置を下端(y軸)に移動させる
|
|
215
|
+
#設置するとき、基準となる空間の外側に設置される
|
|
216
|
+
#ブロックでは、数値を返却することで、下端からのマージンを設定できる(正の方向へ移動)
|
|
217
|
+
#ブロック引数は、自分自身の幅
|
|
218
|
+
#返却値:: 自分自身
|
|
219
|
+
def outside_bottom(&margin)
|
|
220
|
+
base = @layout.base.rect
|
|
221
|
+
t = @layout.pos[1]
|
|
222
|
+
@layout.pos[1] = base[1] + base[3] + (margin ? margin[base[3]].to_i : 0)
|
|
223
|
+
update_layout(0, @layout.pos[1]-t)
|
|
224
|
+
@layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
|
|
225
|
+
return self
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
#===レイアウトに関するインスタンスを解放する
|
|
229
|
+
#インスタンス変数 @layout 内のインスタンスを解放する
|
|
230
|
+
def layout_dispose
|
|
231
|
+
@layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
|
|
232
|
+
@layout.snap.children.each{|sc| sc.reset_snap }
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
#=== mixin されたインスタンスの x 座標の値を取得する
|
|
236
|
+
#返却値:: x 座標の値(@layout[:pos][0]の値)
|
|
237
|
+
def x
|
|
238
|
+
return @layout.pos[0]
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
#=== mixin されたインスタンスの y 座標の値を取得する
|
|
242
|
+
#返却値:: y 座標の値(@layout[:pos][1]の値)
|
|
243
|
+
def y
|
|
244
|
+
return @layout.pos[1]
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
#=== mixin されたインスタンスの幅を取得する
|
|
248
|
+
#返却値:: インスタンスの幅(@layout[:size][0]の値)
|
|
249
|
+
def w
|
|
250
|
+
return @layout.size[0]
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
#=== mixin されたインスタンスの高さを取得する
|
|
254
|
+
#返却値:: インスタンスの高さ(@layout[:size][1]の値)
|
|
255
|
+
def h
|
|
256
|
+
return @layout.size[1]
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
#=== mixin されたインスタンスの位置情報(x,yの値)を取得する
|
|
260
|
+
#返却値:: インスタンスの位置情報(@layout[:pos]の値)
|
|
261
|
+
def pos
|
|
262
|
+
return @layout.pos
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
#=== mixin されたインスタンスのサイズ情報(w,hの値)を取得する
|
|
266
|
+
#返却値:: インスタンスのサイズ情報(@layout[:size]の値)
|
|
267
|
+
def size
|
|
268
|
+
return @layout.size
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
#=== mixin されたインスタンスの表示上の幅を取得する
|
|
272
|
+
#返却値:: インスタンスの幅(@layout[:size][0]の値)
|
|
273
|
+
def ow
|
|
274
|
+
return @layout.size[0]
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
#=== mixin されたインスタンスの表示上の高さを取得する
|
|
278
|
+
#返却値:: インスタンスの高さ(@layout[:size][0]の値)
|
|
279
|
+
def oh
|
|
280
|
+
return @layout.size[1]
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
#===インスタンスのサイズをレイアウト情報に反映させる
|
|
284
|
+
#このメソッドが呼び出されると、スナップ先のインスタンスの位置情報がリセットされることに注意
|
|
285
|
+
#_w_:: インスタンスの幅(たとえば、Sprite#ow の値)
|
|
286
|
+
#_h_:: インスタンスの幅(たとえば、Sprite#oh の値)
|
|
287
|
+
#返却値:: 自分自身を返す
|
|
288
|
+
def set_layout_size(w, h)
|
|
289
|
+
@layout.size[0] = w
|
|
290
|
+
@layout.size[1] = h
|
|
291
|
+
return self
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
#===レイアウト情報の値を更新する
|
|
295
|
+
#_dx_:: 位置の変化量(x方向)
|
|
296
|
+
#_dx_:: 位置の変化量(y方向)
|
|
297
|
+
def update_layout(dx, dy)
|
|
298
|
+
update_layout_position
|
|
299
|
+
@layout.snap.children.each{|sc| sc.update_layout(dx, dy) }
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
#===インスタンスの位置・大きさを求める
|
|
303
|
+
#インスタンスの位置・大きさをRect構造体で求める
|
|
304
|
+
#返却値:: Rect構造体
|
|
305
|
+
def rect
|
|
306
|
+
return Rect.new(@layout.pos[0], @layout.pos[1], @layout.size[0], @layout.size[1])
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
#===インスタンスのレイアウトを指定の別のインスタンスに依存(スナップ)させる
|
|
310
|
+
#引数 spr で指定したインスタンスのレイアウト情報は、レシーバのレイアウト情報に依存した位置情報を算出される
|
|
311
|
+
#デフォルトでは、画面にスナップされている状態になっている
|
|
312
|
+
#_spr_:: 位置情報を依存させるインスタンス。デフォルトは nil (画面が対象になる)
|
|
313
|
+
#返却値:: 自分自身を返す
|
|
314
|
+
def snap(spr = nil)
|
|
315
|
+
if spr
|
|
316
|
+
@layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
|
|
317
|
+
@layout.snap.sprite = spr
|
|
318
|
+
spr.add_snap_child(self)
|
|
319
|
+
end
|
|
320
|
+
@layout.base = @layout.snap.sprite || Screen
|
|
321
|
+
return self
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
#===すべてのインスタンスとの依存関係を解消する
|
|
325
|
+
#このメソッドが呼び出されると、スナップ先のインスタンスの位置情報がリセットされることに注意
|
|
326
|
+
#返却値:: 自分自身を返す
|
|
327
|
+
def reset_snap
|
|
328
|
+
@layout.snap.sprite =nil
|
|
329
|
+
@layout.base = Screen
|
|
330
|
+
@layout.snap.children = Array.new
|
|
331
|
+
return self
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def add_snap_child(spr) #:nodoc:
|
|
335
|
+
@layout.snap.children << spr unless @layout.snap.children.include?(spr)
|
|
336
|
+
return self
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def delete_snap_child(spr) #:nodoc:
|
|
340
|
+
spr.each{|s| @layout.snap.children.delete(s) }
|
|
341
|
+
return self
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def get_snap_children #:nodoc:
|
|
345
|
+
return @layout.snap.children
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
def set_snap_children(cs) #:nodoc:
|
|
349
|
+
@layout.snap.children.each{|c| c.set_snap_sprite(nil) }
|
|
350
|
+
@layout.snap.children = cs
|
|
351
|
+
@layout.snap.children.each{|c| c.set_snap_sprite(self) }
|
|
352
|
+
return self
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
def get_snap_sprite #:nodoc:
|
|
356
|
+
return @layout.snap.sprite
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def set_snap_sprite(ss) #:nodoc:
|
|
360
|
+
@layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
|
|
361
|
+
@layout.snap.sprite = ss
|
|
362
|
+
@layout.snap.sprite.add_snap_child(self) if @layout.snap.sprite
|
|
363
|
+
return self
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
#===インスタンスを画面(スナップ先インスタンス)の中心に移動する
|
|
367
|
+
#返却値:: 自分自身を返す
|
|
368
|
+
def centering
|
|
369
|
+
center
|
|
370
|
+
middle
|
|
371
|
+
return self
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
#===インスタンスを指定の移動量で移動させる
|
|
375
|
+
#ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
|
|
376
|
+
#_x_:: x 座標の移動量
|
|
377
|
+
#_y_:: y 座標の移動量
|
|
378
|
+
#返却値:: 自分自身を返す
|
|
379
|
+
def move(x, y)
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
#===インスタンスを指定の位置に移動させる
|
|
383
|
+
#ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
|
|
384
|
+
#_x_:: 移動後の x 座標の位置
|
|
385
|
+
#_y_:: 移動後の y 座標の位置
|
|
386
|
+
#返却値:: 自分自身を返す
|
|
387
|
+
def move_to(x, y, &block)
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
#===Segment構造体を生成する
|
|
391
|
+
# 生成される線分は、x方向が[pos.x,pos.x+ow-1]、y方向が[pos.y,pos.y+oh-1]となる
|
|
392
|
+
#返却値:: 生成したSegment構造体インスタンス
|
|
393
|
+
def segment
|
|
394
|
+
return Segment.new([@layout.pos[0],
|
|
395
|
+
@layout.pos[0]+@layout.size[0]-1],
|
|
396
|
+
[@layout.pos[1],
|
|
397
|
+
@layout.pos[1]+@layout.size[1]-1])
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
#==レイアウト空間クラス
|
|
402
|
+
#画像を持たず、レイアウト空間のみを持つインスタンス
|
|
403
|
+
#画像同士が離れているレイアウト構成を構築する際に用いる
|
|
404
|
+
class LayoutSpace
|
|
405
|
+
include SpriteBase
|
|
406
|
+
include Animation
|
|
407
|
+
include Layout
|
|
408
|
+
include SingleEnumerable
|
|
409
|
+
extend Forwardable
|
|
410
|
+
|
|
411
|
+
attr_accessor :dp, :visible
|
|
412
|
+
|
|
413
|
+
#===インスタンスを生成する
|
|
414
|
+
#_size_:: インスタンスの大きさ[w,h]で指定する
|
|
415
|
+
#返却値:: 生成されたインスタンスを返す
|
|
416
|
+
def initialize(size)
|
|
417
|
+
init_layout
|
|
418
|
+
set_layout_size(*(size.to_a))
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
#===現在の画面の最大の大きさを矩形で取得する
|
|
422
|
+
#但し、LayoutSpaceの場合は最大の大きさ=スプライトの大きさなので、rectと同じ値が得られる
|
|
423
|
+
#返却値:: 生成された矩形(Rect構造体のインスタンス)
|
|
424
|
+
def broad_rect
|
|
425
|
+
return self.rect
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
#===インスタンスを解放させる
|
|
429
|
+
def dispose
|
|
430
|
+
layout_dispose
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
end
|
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
=begin
|
|
3
|
+
--
|
|
4
|
+
Miyako v2.0
|
|
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
|
+
#==マップチップ構造体に配列化メソッド(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
|
+
|
|
38
|
+
#=マップチップ定義構造体
|
|
39
|
+
MapChip = MapChipStruct.new(:chip_image, :chips, :size, :chip_size, :access_types, :collision_table, :access_table)
|
|
40
|
+
|
|
41
|
+
#=マップチップ作成ファクトリクラス
|
|
42
|
+
class MapChipFactory
|
|
43
|
+
#===マップチップを作成するためのファクトリクラス
|
|
44
|
+
#_csv_filename_:: マップチップファイル名(CSVファイル)
|
|
45
|
+
#_use_alpha_:: 画像にαチャネルを使うかどうかのフラグ。trueのときは画像のαチャネルを使用、falseのときはカラーキーを使用。デフォルトはtrue
|
|
46
|
+
def MapChipFactory.load(csv_filename, use_alpha = true)
|
|
47
|
+
lines = CSV.read(csv_filename)
|
|
48
|
+
raise MiyakoError, "This file is not Miyako Map Chip file! : #{csv_filename}" unless lines.shift[0] == "Miyako Mapchip"
|
|
49
|
+
spr = use_alpha ? Sprite.new({:filename => lines.shift[0], :type => :alpha_channel}) : Sprite.new({:file_name => lines.shift[0], :type => :color_key})
|
|
50
|
+
tmp = lines.shift
|
|
51
|
+
chip_size = Size.new(tmp[0].to_i, tmp[1].to_i)
|
|
52
|
+
size = Size.new(spr.w / chip_size.w, spr.h / chip_size.h)
|
|
53
|
+
chips = size.w * size.h
|
|
54
|
+
access_types = lines.shift[0].to_i
|
|
55
|
+
collision_table = Array.new(access_types){|at|
|
|
56
|
+
Array.new(chips){|n| Collision.new(lines.shift.map{|s| s.to_i}) }
|
|
57
|
+
}
|
|
58
|
+
access_table = Array.new(access_types){|at|
|
|
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
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return MapChip.new(spr, chips, size, chip_size, access_types, collision_table, access_table)
|
|
70
|
+
end
|
|
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
|
|
114
|
+
|
|
115
|
+
#==マップ定義クラス
|
|
116
|
+
class Map
|
|
117
|
+
@@idx_ix = [-1, 2, 4]
|
|
118
|
+
@@idx_iy = [-1, 0, 6]
|
|
119
|
+
|
|
120
|
+
attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
|
|
121
|
+
attr_reader :map_layers, :mapchips, :pos, :size, :w, :h
|
|
122
|
+
|
|
123
|
+
class MapLayer #:nodoc: all
|
|
124
|
+
extend Forwardable
|
|
125
|
+
|
|
126
|
+
attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
|
|
127
|
+
attr_reader :mapchip, :mapchip_units, :pos, :size
|
|
128
|
+
|
|
129
|
+
def round(v, max) #:nodoc:
|
|
130
|
+
v = max + (v % max) if v < 0
|
|
131
|
+
v %= max if v >= max
|
|
132
|
+
return v
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def resize #:nodoc:
|
|
136
|
+
@cw = (Screen.w + @ow - 1)/ @ow + 1
|
|
137
|
+
@ch = (Screen.h + @oh - 1)/ @oh + 1
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def initialize(mapchip, mapdat, layer_size) #:nodoc:
|
|
141
|
+
@mapchip = mapchip
|
|
142
|
+
@pos = Point.new(0, 0)
|
|
143
|
+
@size = layer_size.dup
|
|
144
|
+
@ow = @mapchip.chip_size.w
|
|
145
|
+
@oh = @mapchip.chip_size.h
|
|
146
|
+
@real_size = Size.new(@size.w * @ow, @size.h * @oh)
|
|
147
|
+
@mapdat = mapdat
|
|
148
|
+
@baseimg = @mapchip.chip_image
|
|
149
|
+
@divpx = get_div_array(0, @real_size.w, @ow)
|
|
150
|
+
@divpy = get_div_array(0, @real_size.h, @oh)
|
|
151
|
+
@modpx = get_mod_array(0, @real_size.w, @ow)
|
|
152
|
+
@modpy = get_mod_array(0, @real_size.h, @oh)
|
|
153
|
+
@modpx2 = get_mod_array(0, @size.w * 2 + 1, @size.w)
|
|
154
|
+
@modpy2 = get_mod_array(0, @size.h * 2 + 1, @size.h)
|
|
155
|
+
@cdivsx = get_div_array(0, @mapchip.chips, @mapchip.size.w)
|
|
156
|
+
@cmodsx = get_mod_array(0, @mapchip.chips, @mapchip.size.w)
|
|
157
|
+
@cdivsy = get_div_array(0, @mapchip.chips, @mapchip.size.h)
|
|
158
|
+
@cmodsy = get_mod_array(0, @mapchip.chips, @mapchip.size.h)
|
|
159
|
+
@cdivsx = @cdivsx.map{|v| v * @ow }
|
|
160
|
+
@cdivsy = @cdivsy.map{|v| v * @oh }
|
|
161
|
+
@cmodsx = @cmodsx.map{|v| v * @ow }
|
|
162
|
+
@cmodsy = @cmodsy.map{|v| v * @oh }
|
|
163
|
+
@mapchip_units = Array.new(@mapchip.chips){|idx|
|
|
164
|
+
SpriteUnitFactory.create(:bitmap=>@baseimg.bitmap,
|
|
165
|
+
:ox => (idx % @mapchip.size.w) * @ow,
|
|
166
|
+
:oy => (idx / @mapchip.size.w) * @oh,
|
|
167
|
+
:ow => @ow,
|
|
168
|
+
:oh => @oh)
|
|
169
|
+
}
|
|
170
|
+
@visible = true
|
|
171
|
+
resize
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def get_div_array(s, t, v) #:nodoc:
|
|
175
|
+
a = Array.new
|
|
176
|
+
(s..t).each{|i| a.push(i / v)}
|
|
177
|
+
return a
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def get_mod_array(s, t, v) #:nodoc:
|
|
181
|
+
a = Array.new
|
|
182
|
+
(s..t).each{|i| a.push(i % v)}
|
|
183
|
+
return a
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def convert_position(x, y) #:nodoc:
|
|
187
|
+
return Point.new(@modpx2[round(x, @size.w)],
|
|
188
|
+
@modpy2[round(y, @size.h)])
|
|
189
|
+
end
|
|
190
|
+
|
|
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])
|
|
198
|
+
return @mapdat[pos.y][pos.x]
|
|
199
|
+
end
|
|
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
|
+
|
|
280
|
+
def dispose #:nodoc:
|
|
281
|
+
@mapdat = nil
|
|
282
|
+
@baseimg = nil
|
|
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
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
#===インスタンスを生成する
|
|
308
|
+
#レイヤーごとにMapChip構造体を用意する。
|
|
309
|
+
#但し、すべてのレイヤーに同一のMapChip構造体を使うときは、単体で渡すことも可能
|
|
310
|
+
#第1引数にto_aメソッドが実装されていれば、配列化した要素をMapChip構造体として各レイヤに渡す
|
|
311
|
+
#また、各レイヤにMapChip構造体を渡すとき、レイヤ数より要素数が少ないときは、先頭に戻って繰り返し渡す仕様になっている
|
|
312
|
+
#各MapChip構造体のマップチップの大きさを同じにしておく必要がある
|
|
313
|
+
#_mapchips_:: マップチップ構造体群(MapChip構造体単体もしくは配列)
|
|
314
|
+
#_layer_csv_:: レイヤーファイル(CSVファイル)
|
|
315
|
+
#_event_manager_:: MapEventManagerクラスのインスタンス
|
|
316
|
+
#返却値:: 生成したインスタンス
|
|
317
|
+
def initialize(mapchips, layer_csv, event_manager)
|
|
318
|
+
@event_layers = []
|
|
319
|
+
@em = event_manager.dup
|
|
320
|
+
@em.set(self)
|
|
321
|
+
@mapchips = mapchips.to_a
|
|
322
|
+
@visible = true
|
|
323
|
+
@pos = Point.new(0, 0)
|
|
324
|
+
layer_data = CSV.readlines(layer_csv)
|
|
325
|
+
raise MiyakoError, "This file is not Miyako Map Layer file! : #{layer_csv}" unless layer_data.shift[0] == "Miyako Maplayer"
|
|
326
|
+
|
|
327
|
+
tmp = layer_data.shift # 空行の空読み込み
|
|
328
|
+
|
|
329
|
+
@size = Size.new(*(tmp[0..1].map{|v| v.to_i}))
|
|
330
|
+
@w = @size.w
|
|
331
|
+
@h = @size.h
|
|
332
|
+
|
|
333
|
+
layers = layer_data.shift[0].to_i
|
|
334
|
+
|
|
335
|
+
evlist = []
|
|
336
|
+
brlist = []
|
|
337
|
+
layers.times{|n|
|
|
338
|
+
name = layer_data.shift[0]
|
|
339
|
+
values = []
|
|
340
|
+
@size.h.times{|y|
|
|
341
|
+
values << layer_data.shift.map{|m| m.to_i}
|
|
342
|
+
}
|
|
343
|
+
if name == "<event>"
|
|
344
|
+
evlist << values
|
|
345
|
+
else
|
|
346
|
+
brlist << values
|
|
347
|
+
end
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
evlist.each{|events|
|
|
351
|
+
event_layer = Array.new
|
|
352
|
+
events.each_with_index{|ly, y|
|
|
353
|
+
ly.each_with_index{|code, x|
|
|
354
|
+
next unless @em.include?(code)
|
|
355
|
+
event_layer.push(@em.create(code, x * @mapchips.first.chip_size.w, y * @mapchips.first.chip_size.h))
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
@event_layers << event_layer
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
mc = @mapchips.cycle
|
|
362
|
+
@mapchips = mc.take(layers)
|
|
363
|
+
@map_layers = []
|
|
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))
|
|
367
|
+
}
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
#===マップにイベントを追加する
|
|
371
|
+
#_idx_:: 追加するイベントレイヤの指標
|
|
372
|
+
#_code_:: イベント番号(Map.newメソッドで渡したイベント番号に対応)
|
|
373
|
+
#_x_:: マップ上の位置(x方向)
|
|
374
|
+
#_y_:: マップ常温位置(y方向)
|
|
375
|
+
#返却値:: 自分自身を返す
|
|
376
|
+
def add_event(idx, code, x, y)
|
|
377
|
+
return self unless @em.include?(code)
|
|
378
|
+
@event_layers[idx].push(@em.create(code, x, y))
|
|
379
|
+
return self
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
#===マップを移動(移動量指定)
|
|
383
|
+
#_dx_:: 移動量(x方向)
|
|
384
|
+
#_dy_:: 移動量(y方向)
|
|
385
|
+
#返却値:: 自分自身を返す
|
|
386
|
+
def move(dx,dy)
|
|
387
|
+
@pos.move(dx, dy)
|
|
388
|
+
@map_layers.each{|l| l.pos.move(dx, dy) }
|
|
389
|
+
return self
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
#===マップを移動(移動先指定)
|
|
393
|
+
#_dx_:: 移動先(x方向)
|
|
394
|
+
#_dy_:: 移動先(y方向)
|
|
395
|
+
#返却値:: 自分自身を返す
|
|
396
|
+
def move_to(x,y)
|
|
397
|
+
@pos.move_to(x, y)
|
|
398
|
+
@map_layers.each{|l| l.pos.move_to(x, y) }
|
|
399
|
+
return self
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
#===画像の表示矩形を取得する
|
|
403
|
+
#Mapの大きさを矩形で取得する。値は、Screen.rectメソッドの値と同じ。
|
|
404
|
+
#返却値:: 生成された矩形
|
|
405
|
+
def rect
|
|
406
|
+
return Screen.rect
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
#===現在の画面の最大の大きさを矩形で取得する
|
|
410
|
+
#但し、Mapの場合は最大の大きさ=画面の大きさなので、rectと同じ値が得られる
|
|
411
|
+
#返却値:: 画像の大きさ(Rect構造体のインスタンス)
|
|
412
|
+
def broad_rect
|
|
413
|
+
return self.rect
|
|
414
|
+
end
|
|
415
|
+
|
|
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
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
#===設定したマージンを各レイヤーに同期させる
|
|
438
|
+
#マージンを設定した後は必ずこのメソッドを呼び出すこと
|
|
439
|
+
#返却値:: 自分自身を返す
|
|
440
|
+
def [](idx)
|
|
441
|
+
return @map_layers[idx]
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
#===実座標を使用して、指定のレイヤー・位置のマップチップ番号を取得
|
|
445
|
+
#イベントレイヤーでの番号はイベント番号と一致する
|
|
446
|
+
#ブロックを渡すと、求めたマップチップ番号をブロック引数として受け取る評価を行える
|
|
447
|
+
#_idx_:: マップレイヤー配列のインデックス
|
|
448
|
+
#_x_:: マップチップ単位での位置(ピクセル単位)
|
|
449
|
+
#_y_:: マップチップ単位での位置(ピクセル単位)
|
|
450
|
+
#返却値:: マップチップ番号(マップチップが設定されている時は0以上の整数、設定されていない場合は-1が返る)
|
|
451
|
+
def get_code(idx, x = 0, y = 0)
|
|
452
|
+
code = @map_layers[idx].get_code(x, y)
|
|
453
|
+
yield code if block_given?
|
|
454
|
+
return code
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
#===対象のマップチップ番号の画像を置き換える
|
|
458
|
+
#_idx_:: 置き換えるマップチップレイヤー番号
|
|
459
|
+
#_code_:: 置き換えるマップチップ番号
|
|
460
|
+
#_base_:: 置き換え対象の画像・アニメーション
|
|
461
|
+
#返却値:: 自分自身を返す
|
|
462
|
+
def set_mapchip_base(idx, code, base)
|
|
463
|
+
@map_layers[idx].mapchip_units[code] = base
|
|
464
|
+
return self
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
#===マップチップ1枚の大きさを取得する
|
|
468
|
+
#マップチップの大きさが32×32ピクセルの場合は、[32,32]のSize構造体が返る
|
|
469
|
+
#返却値:: マップチップのサイズ(Size構造体)
|
|
470
|
+
def chip_size
|
|
471
|
+
return @mapchips.first.chip_size
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
#===すべてのマップイベントを終了させる
|
|
475
|
+
#マップに登録しているイベントすべてのfinalメソッドを呼び出す
|
|
476
|
+
def final
|
|
477
|
+
@event_layers.each{|ee| ee.each{|e| e.final }}
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
#===マップ情報を解放する
|
|
481
|
+
def dispose
|
|
482
|
+
@map_layers.each{|l|
|
|
483
|
+
l.dispose
|
|
484
|
+
l = nil
|
|
485
|
+
}
|
|
486
|
+
@map_layers = Array.new
|
|
487
|
+
|
|
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
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
#===マップに登録しているイベントインスタンス(マップイベント)を取得する
|
|
499
|
+
#返却値:: マップイベントの配列
|
|
500
|
+
def events
|
|
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)
|
|
527
|
+
end
|
|
528
|
+
end
|
|
529
|
+
end
|