赞 | 5 |
VIP | 71 |
好人卡 | 22 |
积分 | 6 |
经验 | 32145 |
最后登录 | 2013-8-9 |
在线时间 | 184 小时 |
Lv2.观梦者 天仙
- 梦石
- 0
- 星屑
- 620
- 在线时间
- 184 小时
- 注册时间
- 2008-4-15
- 帖子
- 5023
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
脚本更新:
* 2009/1/31
- 功能增加:事件页通行度判定
* 2009/2/2
- 功能增加:自动元件 □ 通行度设定
- 功能增加:桥元件通行判定
- 脚本更新:添加了大量默认图块元件的通行度
* 2009/2/5
- 错误修复:「设置移动路线」会无效的BUG已修复
- 脚本更新:把 □ 通行度设定为 -0b1111
* 2009/2/12
- 功能增加:无法通行处不能触发事件
- 功能增加:加入草木繁茂处、柜台属性的判定跟设定
- 功能增加:通行度等资料存进文件中,设定好了就不会变(除非用编辑器)
- 脚本整合:加入地形标记的设定和判定
- 脚本更新:放出编辑器
设置说明:
在
@map_id_passage_X = {}
这段之中设定, X 代表图块名(A~E)
格示为: 通行度设定 => [图块ID]
通行度设定为: 0b下左右上
0 代表不可通行
1 代表可通行
例如:
0b1001 表示上下可通行,左右不可通行
0b0110 表示左右可通行,上下不可通行
在事件的内容中用注释可以设定不同事件页的通行度
设定方式与上面一样
没有设定的以「穿透」判断通行度(也就是没有四方通行的判定)
详细看范例内设定
自动元件 □ 通行度设定方法
在编辑器(也就是VX中)的通行设定为 ○
然後在脚本中的通行设定为 -0b1111
那麽就会判定为 □
桥元件通行判定
通行设定为「上下通行」或「左右通行」的判定为桥元件
桥元件并列的时候可以互相通行
详细见范例
脚本中已经设定好 B 图块第3行的全部桥的通行度
第一次运行的时候先把「设定部分」的
「$重设四方通行文件」 跟 「$重设地形标记文件」 改成 true
就会在 Data 文件夹里面自动生成通行、地形标记等等...的文件
范例尚未更新
范例:按我下载
设定部分:
- class Game_Map
-
- $重设四方通行文件 = false
-
- def reset_map_files
- #--------------------------------------------------------------------------
- # ★ A 图块元件通行设定
- #--------------------------------------------------------------------------
- map_id_passage_A_preset = {
- 0b1011 => [], # 左方不可通行
- 0b1110 => [], # 上方不可通行
- 0b1101 => [], # 右方不可通行
- 0b0111 => [], # 下方不可通行
- 0b1001 => [134, 135, 142, 143] + (193..208).to_a, # 上下通行
- 0b0110 => [], # 左右通行
- 0b1010 => [], # 右下通行
- 0b1100 => [], # 左下通行
- 0b0101 => [], # 左上通行
- 0b0011 => [], # 右上通行
- 0b1000 => [], # 下方可以通行
- 0b0010 => [], # 右方可以通行
- 0b0001 => [], # 上方可以通行
- 0b0100 => [], # 左方可以通行
- 0b0000 => [], # 全部不可通行
- 0b1111 => [], # 全部可以通行
-
- # 设定墙壁上方通行度为 □
- -0b1111 => ((81..88).to_a + (97..104).to_a + (113..120).to_a),
- # 编辑器中设定为不可通行
- -100 => [],
- }
- #--------------------------------------------------------------------------
- # ★ B 图块元件通行设定
- #--------------------------------------------------------------------------
- map_id_passage_B_preset = {
- 0b1011 => [], # 左方不可通行
- 0b1110 => [], # 上方不可通行
- 0b1101 => [], # 右方不可通行
- 0b0111 => [], # 下方不可通行
- # 上下通行
- 0b1001 => [17, 18, 20, 22, 142, 143, 223, 239],
- # 左右通行
- 0b0110 => [16, 19, 21, 23, 215, 231],
-
- 0b1010 => [], # 右下通行
- 0b1100 => [], # 左下通行
- 0b0101 => [], # 左上通行
- 0b0011 => [], # 右上通行
- 0b1000 => [], # 下方可以通行
- 0b0010 => [], # 右方可以通行
- 0b0001 => [], # 上方可以通行
- 0b0100 => [], # 左方可以通行
- 0b0000 => [], # 全部不可通行
- 0b1111 => [], # 全部可以通行
-
- # 编辑器中设定为不可通行
- -100 => [1],
- }
-
- #--------------------------------------------------------------------------
- # ★ C 图块元件通行设定
- #--------------------------------------------------------------------------
- map_id_passage_C_preset = {
- 0b1011 => [], # 左方不可通行
- 0b1110 => [], # 上方不可通行
- 0b1101 => [], # 右方不可通行
- 0b0111 => [], # 下方不可通行
- 0b1001 => [4, 5, 6, 7, 12, 13, 14, 15], # 上下通行
- 0b0110 => [], # 左右通行
- 0b1010 => [], # 右下通行
- 0b1100 => [], # 左下通行
- 0b0101 => [], # 左上通行
- 0b0011 => [], # 右上通行
- 0b1000 => [], # 下方可以通行
- 0b0010 => [1, 3, 8, 10], # 右方可以通行
- 0b0001 => [28, 29, 30, 23], # 上方可以通行
- 0b0100 => [0, 2, 9, 11], # 左方可以通行
- 0b0000 => [], # 全部不可通行
- 0b1111 => [], # 全部可以通行
-
- # 编辑器中设定为不可通行
- -100 => [],
- }
-
- #--------------------------------------------------------------------------
- # ★ D 图块元件通行设定
- #--------------------------------------------------------------------------
- map_id_passage_D_preset = {
- 0b1011 => [], # 左方不可通行
- 0b1110 => [], # 上方不可通行
- 0b1101 => [], # 右方不可通行
- 0b0111 => (8..11).to_a + (88..92).to_a, # 下方不可通行
- 0b1001 => [], # 上下通行
- 0b0110 => [], # 左右通行
- 0b1010 => [], # 右下通行
- 0b1100 => [], # 左下通行
- 0b0101 => [], # 左上通行
- 0b0011 => [], # 右上通行
- 0b1000 => [], # 下方可以通行
- 0b0010 => [], # 右方可以通行
- 0b0001 => [], # 上方可以通行
- 0b0100 => [], # 左方可以通行
- 0b0000 => [], # 全部不可通行
- 0b1111 => [], # 全部可以通行
-
- # 编辑器中设定为不可通行
- -100 => [],
- }
-
- #--------------------------------------------------------------------------
- # ★ E 图块元件通行设定
- #--------------------------------------------------------------------------
- map_id_passage_E_preset = {
- 0b1011 => [], # 左方不可通行
- 0b1110 => [], # 上方不可通行
- 0b1101 => [], # 右方不可通行
- 0b0111 => [], # 下方不可通行
- 0b1001 => [], # 上下通行
- 0b0110 => [], # 左右通行
- 0b1010 => [], # 右下通行
- 0b1100 => [], # 左下通行
- 0b0101 => [], # 左上通行
- 0b0011 => [], # 右上通行
- 0b1000 => [], # 下方可以通行
- 0b0010 => [], # 右方可以通行
- 0b0001 => [], # 上方可以通行
- 0b0100 => [], # 左方可以通行
- 0b0000 => [], # 全部不可通行
- 0b1111 => [], # 全部可以通行
-
- # 编辑器中设定为不可通行
- -100 => [],
- }
-
- #--------------------------------------------------------------------------
- # ★ 自动元件通行设定(不可更改)
- #--------------------------------------------------------------------------
- map_autotile_passage_preset = {
- 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).to_a # 全部可以通行
- }
-
- map_counter_tiles_preset = [[],
- # A图块
- [],
- # B图块
- [],
- # C图块
- [342, 343]+(350..356).to_a,
- # D图块
- [],
- # E图块
- []
- ]
-
- map_bush_tiles_preset = [[],
- # A图块
- [],
- # B图块
- [100, 101, 102, 103],
- # C图块
- [],
- # D图块
- [],
- # E图块
- []
- ]
-
- for set in 1..5
- for id in 0..256
- if set == 1
- tid = get_true_id(id)
- pass = @passages[tid] # 获取通行属性
- else
- pass = @passages[id] # 获取通行属性
- end
- if pass & 0x01 == 0x01 # x: 不可通行
- tile = [nil, "A", "B", "C", "D", "E"]
- temp_set = eval("map_id_passage_#{tile[set]}_preset")
- temp_set[-100].push(id)
- end
- if pass & 0x40 == 0x40
- map_bush_tiles_preset[set].push(id)
- end
- if pass & 0x80 == 0x80
- map_counter_tiles_preset[set].push(id)
- end
- end
- end
- passage_all_maps_blah = [map_id_passage_A_preset, map_id_passage_B_preset,
- map_id_passage_C_preset, map_id_passage_D_preset, map_id_passage_E_preset,
- map_autotile_passage_preset]
- save_data(passage_all_maps_blah, "Data/Passage.rvdata")
- save_data(map_bush_tiles_preset, "Data/Bush.rvdata")
- save_data(map_counter_tiles_preset, "Data/Counter.rvdata")
- p ("重设四方通行文件完毕")
- end
- def get_true_id(id)
- if id > 128
- return id +1407
- else
- return (id*48) + 2000
- end
- end
- def above?(id)
- return @passages[id] & 0x10 == 0x10
- end
- end
- class Game_Character
- $重设地形标记文件 = false
- @map_tile_tag_A = {
- 0 => [],
- 1 => [],
- 2 => [],
- 3 => [],
- 4 => [],
- 5 => [],
- 6 => [],
- 7 => []
- }
- @map_tile_tag_B = {
- 0 => [],
- 1 => [],
- 2 => [],
- 3 => [],
- 4 => [],
- 5 => [],
- 6 => [],
- 7 => []
- }
- @map_tile_tag_C = {
- 0 => [],
- 1 => [],
- 2 => [],
- 3 => [],
- 4 => [],
- 5 => [],
- 6 => [],
- 7 => []
- }
- @map_tile_tag_D = {
- 0 => [],
- 1 => [],
- 2 => [],
- 3 => [],
- 4 => [],
- 5 => [],
- 6 => [],
- 7 => []
- }
- @map_tile_tag_E = {
- 0 => [],
- 1 => [],
- 2 => [],
- 3 => [],
- 4 => [],
- 5 => [],
- 6 => [],
- 7 => []
- }
- tile_tag = [@map_tile_tag_A, @map_tile_tag_B,
- @map_tile_tag_C, @map_tile_tag_D, @map_tile_tag_E]
- if $重设地形标记文件
- save_data(tile_tag, "Data/TerrainTags.rvdata")
- p ("重设地形标记文件完毕")
- exit
- end
- end
复制代码
四方通行部分:
- class Game_Map
- alias setup_4_passage setup
- def setup(map_id)
- setup_4_passage(map_id)
- reset_map_files if $重设四方通行文件
- loaded_passages = load_data("Data/Passage.rvdata")
- @map_id_passage_A = loaded_passages[0]
- @map_id_passage_B = loaded_passages[1]
- @map_id_passage_C = loaded_passages[2]
- @map_id_passage_D = loaded_passages[3]
- @map_id_passage_E = loaded_passages[4]
- @map_autotile_passage = loaded_passages[5]
- end
- #--------------------------------------------------------------------------
- # ● 获取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
- unless @events.nil?
- 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
- 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 set_passage(id, value, pas)
- return if value > 15 or value < 0
- for i in pas.keys
- pas[i].delete(id) if pas.include?(id)
- pas[i].push(id) if i == value
- end
- end
- def autotile?(x, y)
- return get_tile_id(x,y)[0] < 129
- 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 autotile?(x, y) and passage == -0b1111
- 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 512..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 autotile?(x, y) and get_tile_id(x,y)[1] == 0
- case d
- when 2; temp_id = get_tile_id(x,y-1)
- when 4; temp_id = get_tile_id(x+1,y)
- when 6; temp_id = get_tile_id(x-1,y)
- when 8; temp_id = get_tile_id(x,y+1)
- end
- return 0b1111 if temp_id.include?(id)
- return pas
- end
- def bridge?(pas)
- return (pas == 0b1001 or pas == 0b0110)
- end
- #--------------------------------------------------------------------------
- # ● 判断草木繁茂处
- # x : X 坐标
- # y : Y 坐标
- #--------------------------------------------------------------------------
- alias pass_4_direction_bush? bush?
- def bush?(x, y)
- return false unless valid?(x, y)
- id = get_tile_id(x, y)
- map_bush_tiles = load_data("Data/Bush.rvdata")
- case id[1]
- when 0
- return true if map_bush_tiles[1].include?(id[0])
- when 1...1023
- return true if map_bush_tiles[id[1]/256+2].include?(id[1])
- end
- pass_4_direction_bush?(x, y)
- end
- #--------------------------------------------------------------------------
- # ● 判断柜台属性
- # x : X 坐标
- # y : Y 坐标
- #--------------------------------------------------------------------------
- alias pass_4_direction_counter? counter?
- def counter?(x, y)
- return false unless valid?(x, y)
- id = get_tile_id(x, y)
- map_counter_tiles = load_data("Data/Counter.rvdata")
- case id[1]
- when 0
- return true if map_counter_tiles[1].include?(id[0])
- when 1...1023
- return true if map_counter_tiles[id[1]/256+2].include?(id[1])
- end
- pass_4_direction_counter?(x, y)
- end
- end
- class Game_Character
- #--------------------------------------------------------------------------
- # ● 通行判断
- #--------------------------------------------------------------------------
- def map_passable?(x, y, d=@move_direction)
- return (map_passable_here?(x, y) and map_passable_there?(x, y, d))
- end
- #--------------------------------------------------------------------------
- # ● 本地通行判断
- #--------------------------------------------------------------------------
- def map_passable_here?(x, y, d=@move_direction)
- return $game_map.passable_dir?(x, y, d)
- 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
- alias passage_4_dir_move_down move_down
- def move_down(turn_ok = true)
- @move_direction = 2
- passage_4_dir_move_down(turn_ok)
- end
- alias passage_4_dir_move_left move_left
- def move_left(turn_ok = true)
- @move_direction = 4
- passage_4_dir_move_left(turn_ok)
- end
- alias passage_4_dir_move_right move_right
- def move_right(turn_ok = true)
- @move_direction = 6
- passage_4_dir_move_right(turn_ok)
- end
- alias passage_4_dir_move_up move_up
- def move_up(turn_ok = true)
- @move_direction = 8
- passage_4_dir_move_up(turn_ok)
- end
- end
- class Game_Event < Game_Character
- #--------------------------------------------------------------------------
- # ● 接触事件启动判定
- #--------------------------------------------------------------------------
- alias passage_4_dir_check_event_trigger_touch check_event_trigger_touch
- def check_event_trigger_touch(x, y)
- return false if !map_passable?(x, y)
- passage_4_check_event_trigger_touch(x, y)
- end
- 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_check_event_trigger_there check_event_trigger_there
- def check_event_trigger_there(triggers)
- return false if !map_passable?(@x, @y)
- passage_4_dir_check_event_trigger_there(triggers)
- end
- #--------------------------------------------------------------------------
- # ● 判断接触事件是否被触发
- #--------------------------------------------------------------------------
- alias passage_4_dir_check_event_trigger_touch check_event_trigger_touch
- def check_event_trigger_touch(x, y)
- return false if !map_passable?(x, y)
- passage_4_dir_check_event_trigger_touch(x, y)
- end
- #--------------------------------------------------------------------------
- # ● 通行判断
- #--------------------------------------------------------------------------
- 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
复制代码
地形标记部分
- class Game_Character
- alias terrain_tag_ini initialize
- def initialize
- terrain_tag_ini
- loaded_passages = load_data("Data/TerrainTags.rvdata")
- @map_tile_tag_A = loaded_passages[0]
- @map_tile_tag_B = loaded_passages[1]
- @map_tile_tag_C = loaded_passages[2]
- @map_tile_tag_D = loaded_passages[3]
- @map_tile_tag_E = loaded_passages[4]
- end
- #--------------------------------------------------------------------------
- # ● 获取地形标志
- #--------------------------------------------------------------------------
- def terrain_tag
- # 计算图块ID数值
- a = $game_map.data[@x, @y, 0]-2000
- map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
- map_tile_id_1 = ($game_map.data[@x, @y, 1]-2000) / 48
- map_tile_id_2 = ($game_map.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 $game_map.events.values
- if event.pos?(@x, @y) and event.tile_id > 0
- map_tile_id_2 = event.tile_id
- end
- end
-
- $map_tile_id_2 = map_tile_id_2
-
- case map_tile_id_2
- when 0
- # 获取图块A部分的地形标志
- return get_tag(map_tile_id_0, @map_tile_tag_A) if ( (1..256) === map_tile_id_0)
- return @map_tile_tag_A[map_tile_id_0] if ( (1..256) === map_tile_id_0)
- when 1..255
- # 获取图块B部分的地形标志
- return get_tag(map_tile_id_2, @map_tile_tag_B)
- return @map_tile_tag_B[map_tile_id_2]
- when 256..511
- # 获取图块C部分的地形标志
- return get_tag(map_tile_id_2, @map_tile_tag_C)
- return @map_tile_tag_C[map_tile_id_2-256]
- when 511..767
- # 获取图块D部分的地形标志
- return get_tag(map_tile_id_2, @map_tile_tag_D)
- return @map_tile_tag_D[map_tile_id_2-512]
- when 768..1023
- # 获取图块E部分的地形标志
- return get_tag(map_tile_id_2, @map_tile_tag_E)
- return @map_tile_tag_E[map_tile_id_2-768]
- else
- # 黑屏区未定义(尚未规划任何)图块区域 回传0
- return 0
- end
- end
- def get_tag(id, tag_table)
- for i in tag_table.keys
- # 找到通行度就返回
- return i if tag_table[i].include?(id)
- end
- # 找不到设定即返回 0
- return 0
- end
- def set_tag(id, value, tag_table)
- return if value > 7 or value < 0
- for i in tag_table.keys
- tag_table[i].delete(id) if tag_table.include?(id)
- tag_table[i].push(id) if i == value
- end
- end
- end
复制代码 |
|