VX为什么地图只有两层呢?让它变成3层吧!
首先 插入一个精灵的脚本#==============================================================================
# ■ Sprite_Tile
#------------------------------------------------------------------------------
#处理地图显示用的精灵(活动块)类。
#==============================================================================
class Sprite_Tile
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
def initialize(viewport)
@data = $game_map.tile_id_ary.clone
@sprite = []
@viewport = viewport
refresh
end
#--------------------------------------------------------------------------
# ● 获取包含所选图块的元件图档
# tile_id : 元件ID
#--------------------------------------------------------------------------
def tileset_bitmap(tile_id)
set_number = tile_id / 256
return Cache.system("TileB") if set_number == 0
return Cache.system("TileC") if set_number == 1
return Cache.system("TileD") if set_number == 2
return Cache.system("TileE") if set_number == 3
return nil
end
def refresh
for i in 0...@data.size
@sprite = Sprite.new(@viewport)
@sprite.bitmap = Bitmap.new(32,32)
set_tile_bitmap(i,@data)
@sprite.x = screen_x(@data)
@sprite.y = screen_y(@data)
@sprite.z = screen_z(@data,@data)
end
end
def set_tile_bitmap(index,tile_id)
sx = (tile_id / 128 % 2 * 8 + tile_id % 8) * 32
sy = tile_id % 256 / 8 % 16 * 32
bitmap = tileset_bitmap(tile_id)
@sprite.bitmap.blt(0,0,bitmap,Rect.new(sx,sy,32,32))
bitmap.dispose
@sprite.ox = 16
@sprite.oy = 32
end
def update
for i in 0...@data.size
@sprite.x = screen_x(@data)
@sprite.y = screen_y(@data)
end
end
def dispose
for i in 0...@data.size
@sprite.dispose
@sprite.bitmap.dispose
end
@data.clear
end
#--------------------------------------------------------------------------
# ● 获取画面 X 坐标
#--------------------------------------------------------------------------
def screen_x(x)
return ($game_map.adjust_x(x * 256) + 8007) / 8 - 1000 + 16
end
#--------------------------------------------------------------------------
# ● 获取画面 Y 坐标
#--------------------------------------------------------------------------
def screen_y(y)
return ($game_map.adjust_y(y * 256) + 8007) / 8 - 1000 + 32
end
#--------------------------------------------------------------------------
# ● 获取画面 Z 坐标
#--------------------------------------------------------------------------
def screen_z(id,p)
if p == 2
return 200
elsif p == 0
return 60
elsif id > 0
pass = $game_map.passages
if pass & 0x10 == 0x10 # [☆]
return 160
else
return 40
end
else
return 100
end
end
end
在Spriteset_Map中分别在
@tilemap = Tilemap.new(@viewport1)
@tilemap.dispose
@tilemap.update
每句后面各加上
@tilemap_3 = Tilemap.new(@viewport1)
@tilemap_3.dispose
@tilemap_3.update
另外更改 Game_Map
定义实例变量中加一个
attr_reader :tile_id_ary # 地图第三层
初始化的方法中加入
@tile_id_ary = []
在
#--------------------------------------------------------------------------
# ● 设置事件
#--------------------------------------------------------------------------
def setup_events
@events = {} # 地图事件
的后面加入下面的脚本
@tile_id_ary.clear
for i in @map.events.keys
if @map.events.name == ""
id = @map.events.pages.graphic.tile_id
if id > 0
x = @map.events.x
y = @map.events.y
p = @map.events.pages.priority_type
@tile_id_ary.push()
next
end
end
end
将 def passable?(x, 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 # 通行属性を取得
next if pass & 0x10 == 0x10 # [☆] : 不受通行影响
return true if pass & flag == 0x00 # [○] : 可以通行
return false if pass & flag == flag # [×] : 不可以通行
end
for i in 0...@tile_id_ary.size
if @tile_id_ary == x && @tile_id_ary == y
pass = @passages[@tile_id_ary]# 通行属性を取得
next if pass & 0x10 == 0x10 # [☆] : 不受通行影响
return true if pass & flag == 0x00# [○] : 可以通行
return false if pass & flag == flag # [×] : 不可以通行
end
end
for i in # 调用图层顺序
tile_id = @map.data # 获取元件 ID
return false if tile_id == nil # 获取元件 ID 失败 : 不可以通行
pass = @passages # 通行属性を取得
next if pass & 0x10 == 0x10 # [☆] : 不受通行影响
return true if pass & flag == 0x00 # [○] : 可以通行
return false if pass & flag == flag # [×] : 不可以通行
end
return false # 不可以通行
end
用法,事件图块选地图的。。。事件名清空优先级什么的自己定吧。。。
比单纯的事件帧率高点呢? 有个疑问,这样改完了后,在RMVX制作的时候,会不会显示出来呢?还是只会在游戏运行中显示? 能显示出
页:
[1]