赞 | 0 |
VIP | 46 |
好人卡 | 26 |
积分 | 7 |
经验 | 76056 |
最后登录 | 2024-11-23 |
在线时间 | 2658 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 653
- 在线时间
- 2658 小时
- 注册时间
- 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
复制代码- 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
复制代码 我用了重力系统,发现两个共用时人物在跳的时候会有明显的BUG(如停在空中)。移除四方通行脚本就不会有这个BUG了。但是因为地图的原因不能移除这个脚本,所以想给四方通行加个开关,当打开时这个脚本才生效。请问可以实现吗?谢谢! |
|