|
首先 插入一个精灵的脚本
- #==============================================================================
- # ■ 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[i] = Sprite.new(@viewport)
- @sprite[i].bitmap = Bitmap.new(32,32)
- set_tile_bitmap(i,@data[i][0])
- @sprite[i].x = screen_x(@data[i][1])
- @sprite[i].y = screen_y(@data[i][2])
- @sprite[i].z = screen_z(@data[i][0],@data[i][3])
- 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[index].bitmap.blt(0,0,bitmap,Rect.new(sx,sy,32,32))
- bitmap.dispose
- @sprite[index].ox = 16
- @sprite[index].oy = 32
- end
- def update
- for i in 0...@data.size
- @sprite[i].x = screen_x(@data[i][1])
- @sprite[i].y = screen_y(@data[i][2])
- end
- end
- def dispose
- for i in 0...@data.size
- @sprite[i].dispose
- @sprite[i].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[id]
- 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[i].name == ""
- id = @map.events[i].pages[0].graphic.tile_id
- if id > 0
- x = @map.events[i].x
- y = @map.events[i].y
- p = @map.events[i].pages[0].priority_type
- @tile_id_ary.push([id,x,y,p])
- 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[event.tile_id] # 通行属性を取得
- 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[i][1] == x && @tile_id_ary[i][2] == y
- pass = @passages[@tile_id_ary[i][0]]# 通行属性を取得
- next if pass & 0x10 == 0x10 # [☆] : 不受通行影响
- return true if pass & flag == 0x00 # [○] : 可以通行
- return false if pass & flag == flag # [×] : 不可以通行
- end
- 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
复制代码
用法,事件图块选地图的。。。事件名清空优先级什么的自己定吧。。。
比单纯的事件帧率高点呢? |
|