secondsen 发表于 2009-11-11 00:56:46

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

用法,事件图块选地图的。。。事件名清空优先级什么的自己定吧。。。
比单纯的事件帧率高点呢?

小睡 发表于 2010-1-15 20:01:26

有个疑问,这样改完了后,在RMVX制作的时候,会不会显示出来呢?还是只会在游戏运行中显示?

secondsen 发表于 2010-1-15 20:26:34

能显示出
页: [1]
查看完整版本: VX为什么地图只有两层呢?让它变成3层吧!