#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
# 处理地图的类。包含卷动以及可以通行的判断功能。
# 本类的实例请参考 $game_map 。
#==============================================================================
class Game_Map
MAZE_SWITCH = 1
MAZE_SPRITE_OPACITY = 180
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_reader :screen # 地图画面状态
attr_reader :interpreter # 地图事件用解释器
attr_reader :display_x # 显示 X 坐标 * 256
attr_reader :display_y # 显示 Y 坐标 * 256
attr_reader :parallax_name # 远景 文件名
attr_reader :passages # 通行表
attr_reader :events # 事件
attr_reader :vehicles # 交通工具
attr_accessor :need_refresh # 刷新要求标志
attr_accessor :map # 刷新要求标志
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
def initialize
@screen = Game_Screen.new
@interpreter = Game_Interpreter.new(0, true)
@map_id = 0
@display_x = 0
@display_y = 0
create_vehicles
end
#--------------------------------------------------------------------------
# ● 设置
# map_id : 地图 ID
#--------------------------------------------------------------------------
def setup(map_id)
@map_id = map_id
@map = load_data(sprintf("Data/Map%03d.rvdata", @map_id))
setup_maze
# 临时写在这里
@display_x = 0
@display_y = 0
@passages = $data_system.passages
referesh_vehicles
setup_events
setup_scroll
setup_parallax
@need_refresh = false
end
def setup_maze
$game_maze6R_search[@map_id] = Table.new(width, height) if $game_maze6R_search[@map_id] == nil
$maze_sprite = nil if $map_sprite != nil
$maze_sprite = Sprite.new
$maze_sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
$maze_sprite.bitmap.fill_rect(0, 0, Graphics.width, Graphics.height, Color.new(0, 0, 0))
$maze_sprite.z = 2000
$maze_sprite.zoom_x = 0.4
$maze_sprite.zoom_y = 0.4
$maze_sprite.opacity = MAZE_SPRITE_OPACITY
$maze_sprite.visible = $game_switches[MAZE_SWITCH]
$maze_sprite.update
@maze_rect_width = Graphics.width / width
@maze_rect_height = Graphics.height / height
$maze_player_sprite = nil if $maze_player_sprite != nil
$maze_player_sprite = Sprite.new
$maze_player_sprite.bitmap = Cache.system("Maze_Char_main")
$maze_player_sprite.z = 2002
$maze_player_sprite.ox = $maze_player_sprite.bitmap.width / 2
$maze_player_sprite.oy = $maze_player_sprite.bitmap.height
$maze_player_sprite.visible = $maze_sprite.visible
@refresh_maze_count == 0
end
#-----------------------------------------------------
# ☆ 刷新迷宫game数据,主要用于添加当前一屏幕内容
#-----------------------------------------------------
def refresh_maze_game
for x in 0..$game_map.width
for y in 0..$game_map.height
next if not in_range?(x, y)
$game_maze6R_search[@map_id][x, y] = 1 #unless $game_maze6R_search[@map_id][x, y]
end
end
end
#-----------------------------------------------------
# ☆ 刷新迷宫图片
#-----------------------------------------------------
def refresh_maze_sprite
for x in 0..$game_map.width
for y in 0..$game_map.height
if $game_maze6R_search[@map_id][x, y] == 1
bmpt = get_xy_bitmap(x, y)
$maze_sprite.bitmap.stretch_blt(Rect.new(@maze_rect_width * x, @maze_rect_height * y, @maze_rect_width, @maze_rect_height), bmpt, bmpt.rect)
end
end
end
$maze_sprite.visible = $game_switches[MAZE_SWITCH]
$maze_player_sprite.x = ($game_player.x * @maze_rect_width) * $maze_sprite.zoom_x + $maze_sprite.x
$maze_player_sprite.y = ($game_player.y * @maze_rect_height) * $maze_sprite.zoom_y + $maze_sprite.y
$maze_player_sprite.zoom_x = $maze_sprite.zoom_x
$maze_player_sprite.zoom_y = $maze_sprite.zoom_y
$maze_player_sprite.visible = $maze_sprite.visible
$maze_sprite.update
$maze_player_sprite.update
end
#-----------------------------------------------------
# ☆ 刷新迷宫地图的可视情况
#-----------------------------------------------------
def change_maze_visible(maze_visible = nil)
maze_visible = $game_switches[MAZE_SWITCH] if maze_visible == nil
$maze_sprite.visible = maze_visible
$maze_player_sprite.visible = maze_visible
end
#-----------------------------------------------------
# ☆ 刷新迷宫game数据和图片,小幅度刷新
#-----------------------------------------------------
def refresh_maze_small
screne_x = $game_map.display_x
screne_x -= 256
screne_y = $game_map.display_y
screne_y -= 256
screne_width = $game_map.display_x
screne_width += 8 * Graphics.width + 256
screne_height = $game_map.display_y
screne_height += 8 * Graphics.height + 256
xb = screne_x / 256
yb = screne_y / 256
xe = screne_width / 256
ye = screne_height / 256
if $maze_sprite == nil or $maze_sprite.disposed?
refresh_maze_sprite
end
for x in xb..xe # 0..$game_map.width
for y in yb..ye # 0..$game_map.height
next if not in_range?(x, y)
next if $game_maze6R_search[@map_id][x, y] == 1
$game_maze6R_search[@map_id][x, y] = 1
bmpt = get_xy_bitmap(x, y)
$maze_sprite.bitmap.stretch_blt(Rect.new(@maze_rect_width * x, @maze_rect_height * y, @maze_rect_width, @maze_rect_height), bmpt, bmpt.rect)
end
end
$maze_sprite.visible = $game_switches[MAZE_SWITCH]
$maze_player_sprite.x = ($game_player.x * @maze_rect_width) * $maze_sprite.zoom_x + $maze_sprite.x
$maze_player_sprite.y = ($game_player.y * @maze_rect_height) * $maze_sprite.zoom_y + $maze_sprite.y
$maze_player_sprite.visible = $maze_sprite.visible
$maze_sprite.update
$maze_player_sprite.update
end
#-----------------------------------------------------
# ☆ 看某XY是否在屏幕显示范围内
#-----------------------------------------------------
def in_range?(inx, iny)
screne_x = $game_map.display_x
screne_x -= 256
screne_y = $game_map.display_y
screne_y -= 256
screne_width = $game_map.display_x
screne_width += 4608 # 8 * Graphics.width + 256
screne_height = $game_map.display_y
screne_height += 3584 # 8 * Graphics.height + 256
return false if inx * 256 <= screne_x
return false if inx * 256 >= screne_width
return false if iny * 256 <= screne_y
return false if iny * 256 >= screne_height
return true
end
#-----------------------------------------------------
# ☆ 获得X,Y理论点的图像
#-----------------------------------------------------
def get_xy_bitmap(x, y)
bitmap = Bitmap.new(32, 32)
for i in [0] #, 1, 2]
id = @map.data[x, y, i]
tb = bmprect_id(id)
bitmap.blt(0, 0, tb[0], Rect.new(tb[1] * 32, tb[2] * 32, 32, 32)) if tb[0] != nil
end
return bitmap
end
#-----------------------------------------------------
# ☆ 根据ID获得Bitmap的rect
#-----------------------------------------------------
def bmprect_id(id)
case id
when 0..255
bitmap_rectxyb = get_where(id)
return [$map6r_bitmaps[5], bitmap_rectxyb[0], bitmap_rectxyb[1]]
when 256..511
bitmap_rectxyb = get_where(id - 256)
return [$map6r_bitmaps[6], bitmap_rectxyb[0], bitmap_rectxyb[1]]
when 512..767
bitmap_rectxyb = get_where(id - 512)
return [$map6r_bitmaps[7], bitmap_rectxyb[0], bitmap_rectxyb[1]]
when 768..1023
bitmap_rectxyb = get_where(id - 768)
return [$map6r_bitmaps[8], bitmap_rectxyb[0], bitmap_rectxyb[1]]
when 1536..1791
bitmap_rectxyb = get_where(id - 1536)
return [$map6r_bitmaps[4], bitmap_rectxyb[0], bitmap_rectxyb[1]]
when 2048..8191 # 2048..2048 + 48 * 128 - 1
bitmap_rectxyb = get_where(id)
return [bitmap_rectxyb[0], bitmap_rectxyb[1], bitmap_rectxyb[2]]
end
return [nil, 0, 0]
end
#-----------------------------------------------------
# ☆ 根据ID返回Bitmap的rect
#-----------------------------------------------------
def get_where(id)
case id
when 0..255
x = id % 8
y = id / 8
return [x, y]
when 2048..2767 # 2048..2048 + 48 * 15 - 1
tempid = (id - 2048) % 48 # 这个表示是48系列图中的第几个系列种
series_id = (id - 2048) / 48 # 这个表示是在图上素材分类的第几个
case series_id
when 0
return get_ofxoftdiyilei(tempid, 0, 0)
when 1
return get_ofxoftdiyilei(tempid, 0, 3)
when 2
return get_ofxoftdiyilei(tempid, 6, 0)
when 3
return get_ofxoftdiyilei(tempid, 6, 3)
when 4
return get_ofxoftdiyilei(tempid, 8, 0)
when 5
return get_ofxoftdiyilei(tempid, 8, 3)
when 6
return get_ofxoftdiyilei(tempid, 14, 0)
when 7
return get_ofxoftdiyilei(tempid, 14, 3)
when 8
return get_ofxoftdiyilei(tempid, 0, 6)
when 9
return get_ofxoftdiyilei(tempid, 0, 9)
when 10
return get_ofxoftdiyilei(tempid, 6, 6)
when 11
return get_ofxoftdiyilei(tempid, 6, 9)
when 12
return get_ofxoftdiyilei(tempid, 8, 6)
when 13
return get_ofxoftdiyilei(tempid, 8, 9)
when 14
return get_ofxoftdiyilei(tempid, 14, 6)
when 15
return get_ofxoftdiyilei(tempid, 14, 9)
end
#-----------------------------------------------------------------
# 这个是A2素材的定义方式
#-----------------------------------------------------------------
when 2768..4351 #2048 + 48 * 15..2048 + 48 * 48 - 1
tempid = (id - 2048 - 48 * 16) % 48 # 这个表示是48系列图中的第几个系列种
series_id = (id - 2048 - 48 * 16) / 48 # 这个表示是在图上素材分类的第几个
ofx = (series_id % 8) * 2
ofy = (series_id / 8) * 3
return get_ofxoftdiyilei(tempid, ofx, ofy, 1)
#-----------------------------------------------------------------
# 这个是A3素材的房顶方式,前半部分
#-----------------------------------------------------------------
when 4352..4735 #2048 + 48 * 48..2048 + 48 * 56 - 1
tempid = (id - 2048 - 48 * 48) % 48 # 这个表示是48系列图中的第几个系列种
series_id = (id - 2048 - 48 * 48) / 48 # 这个表示是在图上素材分类的第几个
ofx = (series_id % 8) * 2
ofy = 0
return get_ofxoftdierlei(tempid, ofx, ofy, 2)
#-----------------------------------------------------------------
# 这个是A3素材的房顶方式,后半部分
#-----------------------------------------------------------------
when 5120..5503 #2048 + 48 * 64..2048 + 48 * 72 - 1
tempid = (id - 2048 - 48 * 64) % 48 # 这个表示是48系列图中的第几个系列种
series_id = (id - 2048 - 48 * 64) / 48 # 这个表示是在图上素材分类的第几个
ofx = (series_id % 8) * 2
ofy = 4
return get_ofxoftdierlei(tempid, ofx, ofy, 2)
#-----------------------------------------------------------------
# 这个是A3素材的房屋体方式,前半部分
#-----------------------------------------------------------------
when 4736..5119 #2048 + 48 * 56..2048 + 48 * 64 - 1
tempid = (id - 2048 - 48 * 48) % 48 # 这个表示是48系列图中的第几个系列种
series_id = (id - 2048 - 48 * 48) / 48 # 这个表示是在图上素材分类的第几个
ofx = (series_id % 8) * 2
ofy = 0
return get_ofxoftdierlei(tempid, ofx, ofy, 2, 1)
#-----------------------------------------------------------------
# 这个是A3素材的房屋体方式,后半部分
#-----------------------------------------------------------------
when 5504..5887#2048 + 48 * 72..2048 + 48 * 80 - 1
tempid = (id - 2048 - 48 * 64) % 48 # 这个表示是48系列图中的第几个系列种
series_id = (id - 2048 - 48 * 64) / 48 # 这个表示是在图上素材分类的第几个
ofx = (series_id % 8) * 2
ofy = 4
return get_ofxoftdierlei(tempid, ofx, ofy, 2, 1)
#-----------------------------------------------------------------
# 这个是A4素材的房顶方式 1
#-----------------------------------------------------------------
when 5888..6271 #2048 + 48 * 80..2048 + 48 * 88 - 1
tempid = (id - 2048 - 48 * 80) % 48
series_id = (id - 2048 - 48 * 80) / 48
ofx = (series_id % 8) * 2
ofy = 0
return get_ofxoftdiyilei(tempid, ofx, ofy, 3)
#-----------------------------------------------------------------
# 这个是A4素材的房顶方式 2
#-----------------------------------------------------------------
when 6656..7039 #2048 + 48 * 96..2048 + 48 * 104 - 1
tempid = (id - 2048 - 48 * 80) % 48
series_id = (id - 2048 - 48 * 80) / 48
ofx = (series_id % 8) * 2
ofy = 5
return get_ofxoftdiyilei(tempid, ofx, ofy, 3)
#-----------------------------------------------------------------
# 这个是A4素材的房顶方式 3
#-----------------------------------------------------------------
when 7424..7807 #2048 + 48 * 112..2048 + 48 * 120 - 1
tempid = (id - 2048 - 48 * 80) % 48
series_id = (id - 2048 - 48 * 80) / 48
ofx = (series_id % 8) * 2
ofy = 10
return get_ofxoftdiyilei(tempid, ofx, ofy, 3)
#-----------------------------------------------------------------
# 这个是A4素材的墙壁方式 1
#-----------------------------------------------------------------
when 6272..6655 #2048 + 48 * 88..2048 + 48 * 96 - 1
tempid = (id - 2048 - 48 * 80) % 48
series_id = (id - 2048 - 48 * 80) / 48
ofx = (series_id % 8) * 2
ofy = 0
return get_ofxoftdierlei(tempid, ofx, ofy, 3, 2)
#-----------------------------------------------------------------
# 这个是A4素材的墙壁方式 2
#-----------------------------------------------------------------
when 7040..7423 #2048 + 48 * 104..2048 + 48 * 112 - 1
tempid = (id - 2048 - 48 * 80) % 48
series_id = (id - 2048 - 48 * 80) / 48
ofx = (series_id % 8) * 2
ofy = 5
return get_ofxoftdierlei(tempid, ofx, ofy, 3, 2)
#-----------------------------------------------------------------
# 这个是A4素材的墙壁方式 3
#-----------------------------------------------------------------
when 7808..8191 #2048 + 48 * 120..2048 + 48 * 128 - 1
tempid = (id - 2048 - 48 * 80) % 48
series_id = (id - 2048 - 48 * 80) / 48
ofx = (series_id % 8) * 2
ofy = 10
return get_ofxoftdierlei(tempid, ofx, ofy, 3, 2)
end
end
#--------------------------------------------------------------------------
# ☆ 中间函数,用来返回某张图上的一个rect,特别针对A1
#--------------------------------------------------------------------------
def get_ofxoftdiyilei(tempid = 0, ofx = 0, ofy = 0, bmps = 0)
bmp = Bitmap.new(32, 32)
ta = diyitao(tempid)
ofx *= 32
ofy *= 32
bmp.blt(0,0,$map6r_bitmaps[bmps], Rect.new(ta[0][1]*16 + ofx, ta[0][0]*16 + ofy, 16, 16))
bmp.blt(16,0,$map6r_bitmaps[bmps], Rect.new(ta[1][1]*16 + ofx, ta[1][0]*16 + ofy, 16, 16))
bmp.blt(0,16,$map6r_bitmaps[bmps], Rect.new(ta[2][1]*16 + ofx, ta[2][0]*16 + ofy, 16, 16))
bmp.blt(16,16,$map6r_bitmaps[bmps], Rect.new(ta[3][1]*16 + ofx, ta[3][0]*16 + ofy, 16, 16))
return [bmp, 0, 0]
end
#--------------------------------------------------------------------------
# ☆ 中间函数,用来返回某张图上的一个rect,针对A3
#--------------------------------------------------------------------------
def get_ofxoftdierlei(tempid = 0, ofx = 0, ofy = 0, bmps = 0, hx = 0)
bmp = Bitmap.new(32, 32)
ta = diertao(tempid) if hx == 0
ta = disantao(tempid) if hx == 1
ta = disitao(tempid) if hx == 2
ofx *= 32
ofy *= 32
bmp.blt(0,0,$map6r_bitmaps[bmps], Rect.new(ta[0][1]*16 + ofx, ta[0][0]*16 + ofy, 16, 16))
bmp.blt(16,0,$map6r_bitmaps[bmps], Rect.new(ta[1][1]*16 + ofx, ta[1][0]*16 + ofy, 16, 16))
bmp.blt(0,16,$map6r_bitmaps[bmps], Rect.new(ta[2][1]*16 + ofx, ta[2][0]*16 + ofy, 16, 16))
bmp.blt(16,16,$map6r_bitmaps[bmps], Rect.new(ta[3][1]*16 + ofx, ta[3][0]*16 + ofy, 16, 16))
return [bmp, 0, 0]
end
#--------------------------------------------------------------------------
# ☆ 第二套结构代码,定义了素材A3的房顶部分
#--------------------------------------------------------------------------
def diertao(whattype = 0)
array = [
[[2,2],[2,1],[1,2],[1,1]],
[[2,0],[2,1],[1,0],[1,1]],
[[0,2],[0,1],[1,2],[1,1]],
[[0,0],[0,1],[1,0],[1,1]],
[[2,2],[2,3],[1,2],[1,3]],
[[2,0],[2,3],[1,0],[1,3]],
[[0,2],[0,3],[1,2],[1,3]],
[[0,0],[0,3],[1,0],[1,3]],
[[2,2],[2,1],[3,2],[3,1]],
[[2,0],[2,1],[3,0],[3,1]],
[[0,2],[0,1],[3,2],[3,1]],
[[0,0],[0,1],[3,0],[3,1]],
[[2,2],[2,3],[3,2],[3,3]],
[[2,0],[2,3],[3,0],[3,3]],
[[0,2],[0,3],[3,2],[3,3]],
[[0,0],[0,3],[3,0],[3,3]],
[[0,0],[0,0],[0,0],[0,0]],
]
return array[whattype] if array[whattype] != nil
return [[0,0],[0,0],[0,0],[0,0]]
end
#--------------------------------------------------------------------------
# ☆ 第二套结构代码,定义了素材A4的墙壁部分
#--------------------------------------------------------------------------
def disitao(whattype = 0)
array = [
[[8,2],[8,1],[7,2],[7,1]],
[[8,0],[8,1],[7,0],[7,1]],
[[6,2],[6,1],[7,2],[7,1]],
[[6,0],[6,1],[7,2],[7,1]],
[[8,2],[8,3],[7,2],[7,3]],
[[8,0],[8,3],[7,0],[7,3]],
[[6,2],[6,3],[7,2],[7,3]],
[[6,2],[6,3],[7,0],[7,3]],
[[8,2],[8,1],[9,2],[9,1]],
[[8,0],[8,1],[9,0],[9,1]],
[[6,2],[6,1],[9,2],[9,1]],
[[6,0],[6,1],[9,0],[9,1]],
[[8,2],[8,3],[9,2],[9,3]],
[[8,0],[8,3],[9,0],[9,3]],
[[6,2],[6,3],[9,2],[9,3]],
[[6,0],[6,3],[9,0],[9,3]],
[[6,0],[6,0],[6,0],[6,0]], # 填满48个
]
return array[whattype] if array[whattype] != nil
return [[6,0],[6,0],[6,0],[6,0]]
end
#--------------------------------------------------------------------------
# ☆ 第三套结构代码,定义了素材A3的房屋部分
#--------------------------------------------------------------------------
def disantao(whattype = 0)
array = [
[[6,2],[6,1],[5,2],[5,1]],
[[6,0],[6,1],[5,0],[5,1]],
[[4,2],[4,1],[5,2],[5,1]],
[[4,0],[4,1],[5,2],[5,1]],
[[6,2],[6,3],[5,2],[5,3]],
[[6,0],[6,3],[5,0],[5,3]],
[[4,2],[4,3],[5,2],[5,3]],
[[4,2],[4,3],[5,0],[5,3]],
[[6,2],[6,1],[7,2],[7,1]],
[[6,0],[6,1],[7,0],[7,1]],
[[4,2],[4,1],[7,2],[7,1]],
[[4,0],[4,1],[7,0],[7,1]],
[[6,2],[6,3],[7,2],[7,3]],
[[6,0],[6,3],[7,0],[7,3]],
[[4,2],[4,3],[7,2],[7,3]],
[[4,0],[4,3],[7,0],[7,3]],
[[4,0],[4,0],[4,0],[4,0]], # 填满48个
]
return array[whattype] if array[whattype] != nil
return [[4,0],[4,0],[4,0],[4,0]]
end# 房屋部分
#--------------------------------------------------------------------
# ★ 第一套结构数组,这个用于定义A1里面的自动元件构成。写得晕死了
#--------------------------------------------------------------------
def diyitao(whattype = 0)
array = [
[[4,2],[4,1],[3,2],[3,1]],
[[0,2],[4,1],[3,2],[3,1]],
[[4,2],[0,3],[3,2],[3,1]],
[[0,2],[0,3],[3,2],[3,1]],
[[4,2],[4,1],[3,2],[1,3]],
[[0,2],[4,1],[3,2],[1,3]],
[[4,2],[0,3],[3,2],[1,3]],
[[0,2],[0,3],[3,2],[1,3]],
[[4,2],[4,1],[1,2],[3,1]],
[[0,2],[4,1],[1,2],[3,1]],
[[4,2],[0,3],[1,2],[3,1]],
[[0,2],[0,3],[1,2],[3,1]],
[[4,2],[4,1],[1,2],[1,3]],
[[0,2],[4,1],[1,2],[1,3]],
[[4,2],[0,3],[1,2],[1,3]],
[[0,2],[0,3],[1,2],[1,3]],
[[4,0],[4,1],[3,0],[3,1]],
[[4,0],[0,3],[3,0],[3,1]],
[[4,0],[4,1],[3,0],[1,3]],
[[4,0],[0,3],[3,0],[1,3]],
[[2,2],[2,1],[3,2],[3,1]],
[[2,2],[2,1],[3,2],[1,3]],
[[2,2],[2,1],[1,2],[3,1]],
[[2,2],[2,1],[1,2],[1,3]],
[[4,2],[4,3],[3,2],[3,3]],
[[4,2],[4,3],[1,2],[3,3]],
[[0,2],[4,3],[3,2],[3,3]],
[[0,2],[4,3],[1,2],[3,3]],
[[4,2],[4,1],[5,2],[5,1]],
[[0,2],[4,1],[5,2],[5,1]],
[[4,2],[0,3],[5,2],[5,1]],
[[0,2],[0,3],[5,2],[5,1]],
[[4,0],[4,3],[3,0],[3,3]],
[[2,2],[2,1],[5,2],[5,1]],
[[2,0],[2,1],[3,0],[3,1]], #34
[[2,0],[2,1],[3,0],[1,3]],
[[2,2],[2,3],[3,2],[3,3]],
[[2,2],[2,3],[1,2],[3,3]],
[[4,2],[4,3],[5,2],[5,3]],
[[0,2],[4,3],[5,2],[5,3]],
[[4,0],[4,1],[5,0],[5,1]],
[[4,0],[0,3],[5,0],[5,1]],
[[2,0],[2,3],[3,0],[3,3]],
[[2,0],[2,1],[5,0],[5,1]],
[[4,0],[4,3],[5,0],[5,3]],
[[2,2],[2,3],[5,2],[5,3]],
[[2,0],[2,3],[5,0],[5,3]],
[[0,0],[0,1],[1,0],[1,1]]
]
return array[whattype]
end
#--------------------------------------------------------------------------
# ● 生成交通工具
#--------------------------------------------------------------------------
def create_vehicles
@vehicles = []
@vehicles[0] = Game_Vehicle.new(0) # 小型船
@vehicles[1] = Game_Vehicle.new(1) # 大型船
@vehicles[2] = Game_Vehicle.new(2) # 飛行船
end
#--------------------------------------------------------------------------
# ● 刷新交通工具
#--------------------------------------------------------------------------
def referesh_vehicles
for vehicle in @vehicles
vehicle.refresh
end
end
#--------------------------------------------------------------------------
# ● 获取小型船
#--------------------------------------------------------------------------
def boat
return @vehicles[0]
end
#--------------------------------------------------------------------------
# ● 获取大型船
#--------------------------------------------------------------------------
def ship
return @vehicles[1]
end
#--------------------------------------------------------------------------
# ● 获取飞行船
#--------------------------------------------------------------------------
def airship
return @vehicles[2]
end
#--------------------------------------------------------------------------
# ● 设置事件
#--------------------------------------------------------------------------
def setup_events
@events = {} # 地图事件
for i in @map.events.keys
@events[i] = Game_Event.new(@map_id, @map.events[i])
end
@common_events = {} # 公共事件
for i in 1...$data_common_events.size
@common_events[i] = Game_CommonEvent.new(i)
end
end
#--------------------------------------------------------------------------
# ● 设置滚动
#--------------------------------------------------------------------------
def setup_scroll
@scroll_direction = 2
@scroll_rest = 0
@scroll_speed = 4
@margin_x = (width - 17) * 256 / 2 # 画面不显示的地方宽 / 2
@margin_y = (height - 13) * 256 / 2 # 画面不显示的地方高 / 2
end
#--------------------------------------------------------------------------
# ● 设置远景
#--------------------------------------------------------------------------
def setup_parallax
@parallax_name = @map.parallax_name
@parallax_loop_x = @map.parallax_loop_x
@parallax_loop_y = @map.parallax_loop_y
@parallax_sx = @map.parallax_sx
@parallax_sy = @map.parallax_sy
@parallax_x = 0
@parallax_y = 0
end
#--------------------------------------------------------------------------
# ● 设置显示位置
# x : 新显示 X 坐标 (*256)
# y : 新显示 Y 坐标 (*256)
#--------------------------------------------------------------------------
def set_display_pos(x, y)
@display_x = (x + @map.width * 256) % (@map.width * 256)
@display_y = (y + @map.height * 256) % (@map.height * 256)
@parallax_x = x
@parallax_y = y
refresh_maze_game
refresh_maze_sprite
end
#--------------------------------------------------------------------------
# ● 计算远景显示 X 坐标
# bitmap : 远景位图
#--------------------------------------------------------------------------
def calc_parallax_x(bitmap)
if bitmap == nil
return 0
elsif @parallax_loop_x
return @parallax_x / 16
elsif loop_horizontal?
return 0
else
w1 = bitmap.width - 544
w2 = @map.width * 32 - 544
if w1 <= 0 or w2 <= 0
return 0
else
return @parallax_x * w1 / w2 / 8
end
end
end
#--------------------------------------------------------------------------
# ● 计算远景显示 Y 坐标
# bitmap : 远景位图
#--------------------------------------------------------------------------
def calc_parallax_y(bitmap)
if bitmap == nil
return 0
elsif @parallax_loop_y
return @parallax_y / 16
elsif loop_vertical?
return 0
else
h1 = bitmap.height - 416
h2 = @map.height * 32 - 416
if h1 <= 0 or h2 <= 0
return 0
else
return @parallax_y * h1 / h2 / 8
end
end
end
#--------------------------------------------------------------------------
# ● 获取地图 ID
#--------------------------------------------------------------------------
def map_id
return @map_id
end
#--------------------------------------------------------------------------
# ● 获取宽度
#--------------------------------------------------------------------------
def width
return @map.width
end
#--------------------------------------------------------------------------
# ● 获取高度
#--------------------------------------------------------------------------
def height
return @map.height
end
#--------------------------------------------------------------------------
# ● 横方向循环吗?
#--------------------------------------------------------------------------
def loop_horizontal?
return (@map.scroll_type == 2 or @map.scroll_type == 3)
end
#--------------------------------------------------------------------------
# ● 纵方向循环吗?
#--------------------------------------------------------------------------
def loop_vertical?
return (@map.scroll_type == 1 or @map.scroll_type == 3)
end
#--------------------------------------------------------------------------
# ● 获取跑动与否?
#--------------------------------------------------------------------------
def disable_dash?
return @map.disable_dashing
end
#--------------------------------------------------------------------------
# ● 获取遇敌列表
#--------------------------------------------------------------------------
def encounter_list
return @map.encounter_list
end
#--------------------------------------------------------------------------
# ● 获取遇敌步数
#--------------------------------------------------------------------------
def encounter_step
return @map.encounter_step
end
#--------------------------------------------------------------------------
# ● 获取地图数据
#--------------------------------------------------------------------------
def data
return @map.data
end
#--------------------------------------------------------------------------
# ● 计算扣除显示坐标的 X 坐标
# x : X 坐标
#--------------------------------------------------------------------------
def adjust_x(x)
if loop_horizontal? and x < @display_x - @margin_x
return x - @display_x + @map.width * 256
else
return x - @display_x
end
end
#--------------------------------------------------------------------------
# ● 计算扣除显示坐标的 Y 坐标
# y : Y 坐标
#--------------------------------------------------------------------------
def adjust_y(y)
if loop_vertical? and y < @display_y - @margin_y
return y - @display_y + @map.height * 256
else
return y - @display_y
end
end
#--------------------------------------------------------------------------
# ● 计算循环修正后的 X 坐标
# x : X 坐标
#--------------------------------------------------------------------------
def round_x(x)
if loop_horizontal?
return (x + width) % width
else
return x
end
end
#--------------------------------------------------------------------------
# ● 计算循环修正后的 Y坐标
# y : Y 坐标
#--------------------------------------------------------------------------
def round_y(y)
if loop_vertical?
return (y + height) % height
else
return y
end
end
#--------------------------------------------------------------------------
# ● 计算特定方向移动 1 マス X 坐标
# x : X 坐标
# direction : 方向 (2,4,6,8)
#--------------------------------------------------------------------------
def x_with_direction(x, direction)
return round_x(x + (direction == 6 ? 1 : direction == 4 ? -1 : 0))
end
#--------------------------------------------------------------------------
# ● 计算特定方向移动 1 マス Y 坐标
# y : Y 坐标
# direction : 方向 (2,4,6,8)
#--------------------------------------------------------------------------
def y_with_direction(y, direction)
return round_y(y + (direction == 2 ? 1 : direction == 8 ? -1 : 0))
end
#--------------------------------------------------------------------------
# ● 获取指定坐标存在的事件排列
# x : X 坐标
# y : Y 坐标
#--------------------------------------------------------------------------
def events_xy(x, y)
result = []
for event in $game_map.events.values
result.push(event) if event.pos?(x, y)
end
return result
end
#--------------------------------------------------------------------------
# ● BGM / BGS 自动切换
#--------------------------------------------------------------------------
def autoplay
@map.bgm.play if @map.autoplay_bgm
@map.bgs.play if @map.autoplay_bgs
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
if @map_id > 0
for event in @events.values
event.refresh
end
for common_event in @common_events.values
common_event.refresh
end
end
refresh_mg_tansuo
@need_refresh = false
end
#--------------------------------------------------------------------------
# ● 迷宫探索系统
#--------------------------------------------------------------------------
def refresh_mg_tansuo
end
#--------------------------------------------------------------------------
# ● 向下滚动
# distance : 滚动距离
#--------------------------------------------------------------------------
def scroll_down(distance)
if loop_vertical?
@display_y += distance
@display_y %= @map.height * 256
@parallax_y += distance
else
last_y = @display_y
@display_y = [@display_y + distance, (height - 13) * 256].min
@parallax_y += @display_y - last_y
end
end
#--------------------------------------------------------------------------
# ● 向左滚动
# distance : 滚动距离
#--------------------------------------------------------------------------
def scroll_left(distance)
if loop_horizontal?
@display_x += @map.width * 256 - distance
@display_x %= @map.width * 256
@parallax_x -= distance
else
last_x = @display_x
@display_x = [@display_x - distance, 0].max
@parallax_x += @display_x - last_x
end
end
#--------------------------------------------------------------------------
# ● 向右滚动
# distance : 滚动距离
#--------------------------------------------------------------------------
def scroll_right(distance)
if loop_horizontal?
@display_x += distance
@display_x %= @map.width * 256
@parallax_x += distance
else
last_x = @display_x
@display_x = [@display_x + distance, (width - 17) * 256].min
@parallax_x += @display_x - last_x
end
end
#--------------------------------------------------------------------------
# ● 向上滚动
# distance : 滚动距离
#--------------------------------------------------------------------------
def scroll_up(distance)
if loop_vertical?
@display_y += @map.height * 256 - distance
@display_y %= @map.height * 256
@parallax_y -= distance
else
last_y = @display_y
@display_y = [@display_y - distance, 0].max
@parallax_y += @display_y - last_y
end
end
#--------------------------------------------------------------------------
# ● 有效坐标判定
# x : X 坐标
# y : Y 坐标
#--------------------------------------------------------------------------
def valid?(x, y)
return (x >= 0 and x < width and y >= 0 and y < height)
end
#--------------------------------------------------------------------------
# ● 可以通行判定
# x : X 坐标
# y : Y 坐标
# flag : 检查通行禁止数据 (通常 0x01、交通工具的情况下变更)
#--------------------------------------------------------------------------
def passable?(x, y, flag = 0x01)
for event in events_xy(x, y) # 检查坐标相同的事件
next if event.tile_id == 0 # 地图没有图块的情况下
next if event.priority_type > 0 # 不是[通常形式下]
next if event.through # 穿透状态
pass = @passages[event.tile_id] # 获取通行属性
next if pass & 0x10 == 0x10 # [☆] : 不影响通行
return true if pass & flag == 0x00 # [○] : 可通行
return false if pass & flag == flag # [×] : 不可通行
end
for i in [2, 1, 0] # 从层按从上到下的顺序调查循环
tile_id = @map.data[x, y, i] # 获取元件 ID
return false if tile_id == nil # 取得元件 ID 失败 : 不能通行
pass = @passages[tile_id] # 获取通行属性
next if pass & 0x10 == 0x10 # [☆] : 不影响通行
return true if pass & flag == 0x00 # [○] : 可通行
return false if pass & flag == flag # [×] : 不可通行
end
return false # 通行不可
end
#--------------------------------------------------------------------------
# ● 小型船通行判定
# x : X 坐标
# y : Y 坐标
#--------------------------------------------------------------------------
def boat_passable?(x, y)
return passable?(x, y, 0x02)
end
#--------------------------------------------------------------------------
# ● 大型船通行判定
# x : X 坐标
# y : Y 坐标
#--------------------------------------------------------------------------
def ship_passable?(x, y)
return passable?(x, y, 0x04)
end
#--------------------------------------------------------------------------
# ● 飞行船着陆可能判定
# x : X 坐标
# y : Y 坐标
#--------------------------------------------------------------------------
def airship_land_ok?(x, y)
return passable?(x, y, 0x08)
end
#--------------------------------------------------------------------------
# ● 茂密判定
# x : X 坐标
# y : Y 坐标
#--------------------------------------------------------------------------
def bush?(x, y)
return false unless valid?(x, y)
return @passages[@map.data[x, y, 1]] & 0x40 == 0x40
end
#--------------------------------------------------------------------------
# ● 反击判定
# x : X 坐标
# y : Y 坐标
#--------------------------------------------------------------------------
def counter?(x, y)
return false unless valid?(x, y)
return @passages[@map.data[x, y, 0]] & 0x80 == 0x80
end
#--------------------------------------------------------------------------
# ● 滚动开始
# direction : 滚动方向
# distance : 滚动距离
# speed : 滚动速度
#--------------------------------------------------------------------------
def start_scroll(direction, distance, speed)
@scroll_direction = direction
@scroll_rest = distance * 256
@scroll_speed = speed
end
#--------------------------------------------------------------------------
# ● 滚动中中判定
#--------------------------------------------------------------------------
def scrolling?
return @scroll_rest > 0
end
#--------------------------------------------------------------------------
# ● 画面刷新
#--------------------------------------------------------------------------
def update
refresh if $game_map.need_refresh
update_scroll
update_events
update_vehicles
update_parallax
update_maze
@screen.update
end
#--------------------------------------------------------------------------
# ● 刷新迷宫,每20帧刷一次
#--------------------------------------------------------------------------
def update_maze
@refresh_maze_count = 0 if @refresh_maze_count == nil
if @refresh_maze_count == 0
refresh_maze_small
@refresh_maze_count = 20
else
@refresh_maze_count -= 1
end
end
#--------------------------------------------------------------------------
# ● 滚动刷新
#--------------------------------------------------------------------------
def update_scroll
if @scroll_rest > 0 # 滚动中的情况下
distance = 2 ** @scroll_speed # 滚动速度变化为地图坐标系的距离
case @scroll_direction
when 2 # 下
scroll_down(distance)
when 4 # 左
scroll_left(distance)
when 6 # 右
scroll_right(distance)
when 8 # 上
scroll_up(distance)
end
@scroll_rest -= distance # 滚动距离的减法运算
end
end
#--------------------------------------------------------------------------
# ● 刷新事件
#--------------------------------------------------------------------------
def update_events
for event in @events.values
event.update
end
for common_event in @common_events.values
common_event.update
end
end
#--------------------------------------------------------------------------
# ● 刷新交通工具
#--------------------------------------------------------------------------
def update_vehicles
for vehicle in @vehicles
vehicle.update
end
end
#--------------------------------------------------------------------------
# ● 刷新远景
#--------------------------------------------------------------------------
def update_parallax
@parallax_x += @parallax_sx * 4 if @parallax_loop_x
@parallax_y += @parallax_sy * 4 if @parallax_loop_y
end
end