| 
 
| 赞 | 0 |  
| VIP | 46 |  
| 好人卡 | 26 |  
| 积分 | 6 |  
| 经验 | 76056 |  
| 最后登录 | 2023-9-17 |  
| 在线时间 | 2656 小时 |  
 Lv2.观梦者 
	梦石0 星屑618 在线时间2656 小时注册时间2010-6-28帖子1361 
 | 
| 脚本如下: 复制代码class Game_Map
  alias setup_4_passage setup
  def setup(map_id)
    setup_4_passage(map_id)
    #--------------------------------------------------------------------------
    # ★ A 图块元件通行设定
    #--------------------------------------------------------------------------
    @map_id_passage_A = {
      0b1011 => [],      # 左方不可通行
      0b1110 => [],      # 上方不可通行
      0b1101 => [],      # 右方不可通行
      0b0111 => [],      # 下方不可通行
      0b1001 => [134, 135, 142, 143] + (193..208).to_a,      # 上下通行
      0b0110 => [],      # 左右通行
      0b1010 => [],      # 右下通行
      0b1100 => [],      # 左下通行
      0b0101 => [],      # 左上通行
      0b0011 => [],      # 右上通行
      0b1000 => [],      # 下方可以通行
      0b0010 => [],      # 右方可以通行
      0b0001 => [],      # 上方可以通行
      0b0100 => [],      # 左方可以通行
      # 设定墙壁上方通行度为 □
      0b0000 => ((81..88).to_a + (97..104).to_a + (113..120).to_a),
      0b1111 => []       # 全部可以通行
    }
    #--------------------------------------------------------------------------
    # ★ B 图块元件通行设定
    #--------------------------------------------------------------------------
    @map_id_passage_B = {
      0b1011 => [],      # 左方不可通行
      0b1110 => [],      # 上方不可通行
      0b1101 => [],      # 右方不可通行
      0b0111 => [],      # 下方不可通行
      # 上下通行
      0b1001 => [],
      # 左右通行
      0b0110 => [],
      
      0b1010 => [],      # 右下通行
      0b1100 => [],      # 左下通行
      0b0101 => [],      # 左上通行
      0b0011 => [],      # 右上通行
      0b1000 => [],      # 下方可以通行
      0b0010 => [],      # 右方可以通行
      0b0001 => [],      # 上方可以通行
      0b0100 => [],      # 左方可以通行
      0b0000 => [],      # 全部不可通行
      0b1111 => []       # 全部可以通行
    }
    
    #--------------------------------------------------------------------------
    # ★ C 图块元件通行设定
    #--------------------------------------------------------------------------
    @map_id_passage_C = {
      0b1011 => [],      # 左方不可通行
      0b1110 => [],      # 上方不可通行
      0b1101 => [],      # 右方不可通行
      0b0111 => [],      # 下方不可通行
      0b1001 => [],      # 上下通行
      0b0110 => [],      # 左右通行
      0b1010 => [],      # 右下通行
      0b1100 => [],      # 左下通行
      0b0101 => [],      # 左上通行
      0b0011 => [],      # 右上通行
      0b1000 => [],      # 下方可以通行
      0b0010 => [],      # 右方可以通行
      0b0001 => [],      # 上方可以通行
      0b0100 => [],      # 左方可以通行
      0b0000 => [],      # 全部不可通行
      0b1111 => []       # 全部可以通行
    }
    
    #--------------------------------------------------------------------------
    # ★ D 图块元件通行设定
    #--------------------------------------------------------------------------
    @map_id_passage_D = {
      0b1011 => [],      # 左方不可通行
      0b1110 => [],      # 上方不可通行
      0b1101 => [],      # 右方不可通行
      0b0111 => (8..11).to_a + (88..92).to_a,      # 下方不可通行
      0b1001 => [],      # 上下通行
      0b0110 => [],      # 左右通行
      0b1010 => [],      # 右下通行
      0b1100 => [],      # 左下通行
      0b0101 => [],      # 左上通行
      0b0011 => [],      # 右上通行
      0b1000 => [],      # 下方可以通行
      0b0010 => [],      # 右方可以通行
      0b0001 => [],      # 上方可以通行
      0b0100 => [],      # 左方可以通行
      0b0000 => [],      # 全部不可通行
      0b1111 => []       # 全部可以通行
    }
    
    #--------------------------------------------------------------------------
    # ★ E 图块元件通行设定
    #--------------------------------------------------------------------------
    @map_id_passage_E = {
      0b1011 => [],      # 左方不可通行
      0b1110 => [],      # 上方不可通行
      0b1101 => [],      # 右方不可通行
      0b0111 => [],      # 下方不可通行
      0b1001 => [],      # 上下通行
      0b0110 => [],      # 左右通行
      0b1010 => [],      # 右下通行
      0b1100 => [],      # 左下通行
      0b0101 => [],      # 左上通行
      0b0011 => [],      # 右上通行
      0b1000 => [],      # 下方可以通行
      0b0010 => [],      # 右方可以通行
      0b0001 => [],      # 上方可以通行
      0b0100 => [],      # 左方可以通行
      0b0000 => [],      # 全部不可通行
      0b1111 => []       # 全部可以通行
    }
    
    #--------------------------------------------------------------------------
    # ★ 自动元件通行设定(不可更改)
    #--------------------------------------------------------------------------
    @map_autotile_passage = {
      0b1011 => [0, 1, 2, 3],      # 左方不可通行
      0b1110 => [4, 5, 6, 7],      # 上方不可通行
      0b1101 => [8, 9, 10, 11],    # 右方不可通行
      0b0111 => [12, 13, 14, 15],  # 下方不可通行
      0b1001 => [16],              # 上下通行
      0b0110 => [17],              # 左右通行
      0b1010 => [18, 19],          # 右下通行
      0b1100 => [20, 21],          # 左下通行
      0b0101 => [22, 23],          # 左上通行
      0b0011 => [24, 25],          # 右上通行
      0b1000 => [26],              # 下方可以通行
      0b0010 => [27],              # 右方可以通行
      0b0001 => [28],              # 上方可以通行
      0b0100 => [29],              # 左可以通行
      0b0000 => [30],              # 全部不可通行
      0b1111 => (32..47).entries   # 全部可以通行
    }
  end
end
我用了重力系统,发现两个共用时人物在跳的时候会有明显的BUG(如停在空中)。移除四方通行脚本就不会有这个BUG了。但是因为地图的原因不能移除这个脚本,所以想给四方通行加个开关,当打开时这个脚本才生效。请问可以实现吗?谢谢!复制代码class Game_Map
  #--------------------------------------------------------------------------
  # ● 获取ID
  #--------------------------------------------------------------------------
  def get_tile_id(x, y)
    a = data[x, y, 0]-2000
    map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
    map_tile_id_1 = (data[x, y, 1]-2000) / 48
    map_tile_id_2 = (data[x, y, 2])
         
    map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
    map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
    map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
    
    # 图块 ID 矫正
    map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0
    for event in @events.values
      if event.pos?(x, y) and event.tile_id > 0
        # 若是事件使用地图元件,使用该地图元件的ID
        map_tile_id_2 = event.tile_id
      end
    end
    # 返回 [底层ID, 上层ID]
    return [map_tile_id_0, map_tile_id_2]
  end
  #--------------------------------------------------------------------------
  # ● 根据通行设定获取通行度
  #     value : 数值
  #     pas   : 通行度哈希表
  #--------------------------------------------------------------------------
  def get_passage(value, pas)
    for i in pas.keys
      # 找到通行度就返回
      return i if pas[i].include?(value)
    end
    # 找不到设定即返回「全部可以通行」
    return 0b1111
  end
  #--------------------------------------------------------------------------
  # ● 四方向通行判断
  #--------------------------------------------------------------------------
  def passable_dir?(x, y, d)
    # 通行判定优先度:
    #   事件内设定 > 事件元件 > B层 > A层
    
    return false unless passable?(x, y, 0x01)
    id = get_tile_id(x,y)
    case id[1]
    when 0
      # 获取图块A部分的通行度
      passage = get_passage(id[0], @map_id_passage_A) if ( (1..256) === id[0])
      # 是自动元件且通行设定为 □
      if id[0] < 129 and passage == 0b0000
        a = data[x, y, 0]
        passage = get_passage(a%48, @map_autotile_passage)
      end
    when 1..255
      # 获取图块B部分的通行度
      passage = get_passage(id[1], @map_id_passage_B)
    when 256..511
      # 获取图块C部分的通行度
      passage = get_passage(id[1]-256, @map_id_passage_C)
    when 511..767
      # 获取图块D部分的通行度
      passage = get_passage(id[1]-512, @map_id_passage_D)
    when 768..1023
      # 获取图块E部分的通行度
      passage = get_passage(id[1]-768, @map_id_passage_E)
    end
    # 获取事件內的通行设定
    e = $game_map.events_xy(x, y)
    unless e.empty?
      e.size.times{ |i|
        # 一获取通行设定就跳出循环
        if e[i].passage
          passage = e[i].passage
          break
        end
      }
    end
    # 判断桥的通行
    passage = passable_bridge(id[1], x, y, d, passage) if bridge?(passage)
    return (passage[(d/2)-1] == 1)
  end
  #--------------------------------------------------------------------------
  # ● 桥元件通行判断
  #--------------------------------------------------------------------------
  def passable_bridge(id, x, y, d, pas)
    # 不是桥元件就直接返回原通行度
    return pas unless bridge?(pas)
    # 是自动元件的情况返回原通行度
    return pas if get_tile_id(x,y)[0] < 129 and get_tile_id(x,y)[1] == 0
    case d
    when 0
      temp_id = get_tile_id(x,y+1)
      return 0b1111 if temp_id.include?(id)
    end
    return pas
  end
  def bridge?(pas)
    return (pas == 0b1001 or pas == 0b0110)
  end
end
class Game_Character
  #--------------------------------------------------------------------------
  # ● 通行判断
  #--------------------------------------------------------------------------
  def map_passable?(x, y)
    return (map_passable_here?(x, y) and map_passable_there?(x, y, Input.dir4))
  end
  #--------------------------------------------------------------------------
  # ● 本地通行判断
  #--------------------------------------------------------------------------
  def map_passable_here?(x, y)
    return $game_map.passable_dir?(x, y, Input.dir4)
  end
  #--------------------------------------------------------------------------
  # ● 前方通行判断
  #--------------------------------------------------------------------------
  def map_passable_there?(x, y, d_o)
    d = 10 - d_o             # 反向判断
    # 修正座标
    case d
    when 2; y += 1
    when 4; x -= 1
    when 6; x += 1
    when 8; y -= 1
    end
    x = $game_map.round_x(x) # 横向循环校正
    y = $game_map.round_y(y) # 纵向循环校正
    return $game_map.passable_dir?(x, y, d)
  end
end
class Game_Event < Game_Character
  def passage
    return false if @list[0].code != 108 # 第一个指令不是「注释」时返回 false
    pas = @list[0].parameters[0]
    return false if pas !~ /0b\d{4}/     # 如果不是設定通行度就返回 false
    return pas.to_i(2)
  end
end
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 通行判断
  #--------------------------------------------------------------------------
  alias passage_4_dir_map_passable? map_passable?
  def map_passable?(x, y)
    # 在交通工具中的話,使用默认脚本
    in_vehicle? ? passage_4_dir_map_passable?(x, y) : super
  end
  #--------------------------------------------------------------------------
  # ● 判斷行走通行度
  #--------------------------------------------------------------------------
  def can_walk?(x, y)
    last_vehicle_type = @vehicle_type   # 移除交通工具類型
    @vehicle_type = -1                  # 暫時設置為行走
    result = passage_4_dir_map_passable?(x, y) # 判斷是否可以通行
    @vehicle_type = last_vehicle_type   # 回復交通工具類型
    return result
  end
end
 | 
 |