设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 8899|回复: 20
打印 上一主题 下一主题

[RMVX发布] 新 四方通行脚本 v2.0

 关闭 [复制链接]

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

跳转到指定楼层
1
发表于 2009-1-31 11:26:44 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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 文件夹里面自动生成通行、地形标记等等...的文件

范例尚未更新
范例:按我下载


设定部分:

  1. class Game_Map
  2.   
  3.   $重设四方通行文件 = false
  4.   
  5.   def reset_map_files
  6.     #--------------------------------------------------------------------------
  7.     # ★ A 图块元件通行设定
  8.     #--------------------------------------------------------------------------
  9.     map_id_passage_A_preset = {
  10.       0b1011 => [],      # 左方不可通行
  11.       0b1110 => [],      # 上方不可通行
  12.       0b1101 => [],      # 右方不可通行
  13.       0b0111 => [],      # 下方不可通行

  14.       0b1001 => [134, 135, 142, 143] + (193..208).to_a,      # 上下通行
  15.       0b0110 => [],      # 左右通行
  16.       0b1010 => [],      # 右下通行
  17.       0b1100 => [],      # 左下通行
  18.       0b0101 => [],      # 左上通行
  19.       0b0011 => [],      # 右上通行

  20.       0b1000 => [],      # 下方可以通行
  21.       0b0010 => [],      # 右方可以通行
  22.       0b0001 => [],      # 上方可以通行
  23.       0b0100 => [],      # 左方可以通行

  24.       0b0000 => [],      # 全部不可通行
  25.       0b1111 => [],      # 全部可以通行
  26.       
  27.       # 设定墙壁上方通行度为 □      
  28.       -0b1111 => ((81..88).to_a + (97..104).to_a + (113..120).to_a),
  29.       # 编辑器中设定为不可通行
  30.       -100 => [],
  31.     }

  32.     #--------------------------------------------------------------------------
  33.     # ★ B 图块元件通行设定
  34.     #--------------------------------------------------------------------------
  35.     map_id_passage_B_preset = {
  36.       0b1011 => [],      # 左方不可通行
  37.       0b1110 => [],      # 上方不可通行
  38.       0b1101 => [],      # 右方不可通行
  39.       0b0111 => [],      # 下方不可通行

  40.       # 上下通行
  41.       0b1001 => [17, 18, 20, 22, 142, 143, 223, 239],
  42.       # 左右通行
  43.       0b0110 => [16, 19, 21, 23, 215, 231],
  44.       
  45.       0b1010 => [],      # 右下通行
  46.       0b1100 => [],      # 左下通行
  47.       0b0101 => [],      # 左上通行
  48.       0b0011 => [],      # 右上通行

  49.       0b1000 => [],      # 下方可以通行
  50.       0b0010 => [],      # 右方可以通行
  51.       0b0001 => [],      # 上方可以通行
  52.       0b0100 => [],      # 左方可以通行

  53.       0b0000 => [],      # 全部不可通行
  54.       0b1111 => [],      # 全部可以通行
  55.       
  56.       # 编辑器中设定为不可通行
  57.       -100 => [1],
  58.     }
  59.    
  60.     #--------------------------------------------------------------------------
  61.     # ★ C 图块元件通行设定
  62.     #--------------------------------------------------------------------------
  63.     map_id_passage_C_preset = {
  64.       0b1011 => [],      # 左方不可通行
  65.       0b1110 => [],      # 上方不可通行
  66.       0b1101 => [],      # 右方不可通行
  67.       0b0111 => [],      # 下方不可通行

  68.       0b1001 => [4, 5, 6, 7, 12, 13, 14, 15],      # 上下通行
  69.       0b0110 => [],      # 左右通行
  70.       0b1010 => [],      # 右下通行
  71.       0b1100 => [],      # 左下通行
  72.       0b0101 => [],      # 左上通行
  73.       0b0011 => [],      # 右上通行

  74.       0b1000 => [],                 # 下方可以通行
  75.       0b0010 => [1, 3, 8, 10],      # 右方可以通行
  76.       0b0001 => [28, 29, 30, 23],   # 上方可以通行
  77.       0b0100 => [0, 2, 9, 11],      # 左方可以通行

  78.       0b0000 => [],      # 全部不可通行
  79.       0b1111 => [],      # 全部可以通行
  80.       
  81.       # 编辑器中设定为不可通行
  82.       -100 => [],
  83.     }
  84.    
  85.     #--------------------------------------------------------------------------
  86.     # ★ D 图块元件通行设定
  87.     #--------------------------------------------------------------------------
  88.     map_id_passage_D_preset = {
  89.       0b1011 => [],      # 左方不可通行
  90.       0b1110 => [],      # 上方不可通行
  91.       0b1101 => [],      # 右方不可通行
  92.       0b0111 => (8..11).to_a + (88..92).to_a,      # 下方不可通行

  93.       0b1001 => [],      # 上下通行
  94.       0b0110 => [],      # 左右通行
  95.       0b1010 => [],      # 右下通行
  96.       0b1100 => [],      # 左下通行
  97.       0b0101 => [],      # 左上通行
  98.       0b0011 => [],      # 右上通行

  99.       0b1000 => [],      # 下方可以通行
  100.       0b0010 => [],      # 右方可以通行
  101.       0b0001 => [],      # 上方可以通行
  102.       0b0100 => [],      # 左方可以通行

  103.       0b0000 => [],      # 全部不可通行
  104.       0b1111 => [],      # 全部可以通行
  105.       
  106.       # 编辑器中设定为不可通行
  107.       -100 => [],
  108.     }
  109.    
  110.     #--------------------------------------------------------------------------
  111.     # ★ E 图块元件通行设定
  112.     #--------------------------------------------------------------------------
  113.     map_id_passage_E_preset = {
  114.       0b1011 => [],      # 左方不可通行
  115.       0b1110 => [],      # 上方不可通行
  116.       0b1101 => [],      # 右方不可通行
  117.       0b0111 => [],      # 下方不可通行

  118.       0b1001 => [],      # 上下通行
  119.       0b0110 => [],      # 左右通行
  120.       0b1010 => [],      # 右下通行
  121.       0b1100 => [],      # 左下通行
  122.       0b0101 => [],      # 左上通行
  123.       0b0011 => [],      # 右上通行

  124.       0b1000 => [],      # 下方可以通行
  125.       0b0010 => [],      # 右方可以通行
  126.       0b0001 => [],      # 上方可以通行
  127.       0b0100 => [],      # 左方可以通行

  128.       0b0000 => [],      # 全部不可通行
  129.       0b1111 => [],      # 全部可以通行
  130.       
  131.       # 编辑器中设定为不可通行
  132.       -100 => [],
  133.     }
  134.    
  135.     #--------------------------------------------------------------------------
  136.     # ★ 自动元件通行设定(不可更改)
  137.     #--------------------------------------------------------------------------
  138.     map_autotile_passage_preset = {
  139.       0b1011 => [0, 1, 2, 3],      # 左方不可通行
  140.       0b1110 => [4, 5, 6, 7],      # 上方不可通行
  141.       0b1101 => [8, 9, 10, 11],    # 右方不可通行
  142.       0b0111 => [12, 13, 14, 15],  # 下方不可通行

  143.       0b1001 => [16],              # 上下通行
  144.       0b0110 => [17],              # 左右通行
  145.       0b1010 => [18, 19],          # 右下通行
  146.       0b1100 => [20, 21],          # 左下通行
  147.       0b0101 => [22, 23],          # 左上通行
  148.       0b0011 => [24, 25],          # 右上通行

  149.       0b1000 => [26],              # 下方可以通行
  150.       0b0010 => [27],              # 右方可以通行
  151.       0b0001 => [28],              # 上方可以通行
  152.       0b0100 => [29],              # 左方可以通行

  153.       0b0000 => [30],              # 全部不可通行
  154.       0b1111 => (32..47).to_a      # 全部可以通行
  155.     }
  156.    
  157.     map_counter_tiles_preset = [[],
  158.     # A图块
  159.     [],
  160.     # B图块
  161.     [],
  162.     # C图块
  163.     [342, 343]+(350..356).to_a,
  164.     # D图块
  165.     [],
  166.     # E图块
  167.     []
  168.     ]
  169.    
  170.     map_bush_tiles_preset = [[],
  171.     # A图块
  172.     [],
  173.     # B图块
  174.     [100, 101, 102, 103],
  175.     # C图块
  176.     [],
  177.     # D图块
  178.     [],
  179.     # E图块
  180.     []
  181.     ]
  182.    
  183.     for set in 1..5
  184.       for id in 0..256
  185.         if set == 1
  186.           tid = get_true_id(id)
  187.           pass = @passages[tid]                # 获取通行属性
  188.         else
  189.           pass = @passages[id]                 # 获取通行属性
  190.         end
  191.         if pass & 0x01 == 0x01   # x: 不可通行
  192.           tile = [nil, "A", "B", "C", "D", "E"]
  193.           temp_set = eval("map_id_passage_#{tile[set]}_preset")
  194.           temp_set[-100].push(id)
  195.         end
  196.         if pass & 0x40 == 0x40
  197.           map_bush_tiles_preset[set].push(id)
  198.         end
  199.         if pass & 0x80 == 0x80
  200.           map_counter_tiles_preset[set].push(id)
  201.         end
  202.       end
  203.     end
  204.     passage_all_maps_blah = [map_id_passage_A_preset, map_id_passage_B_preset,
  205.     map_id_passage_C_preset, map_id_passage_D_preset, map_id_passage_E_preset,
  206.     map_autotile_passage_preset]
  207.     save_data(passage_all_maps_blah, "Data/Passage.rvdata")
  208.     save_data(map_bush_tiles_preset, "Data/Bush.rvdata")
  209.     save_data(map_counter_tiles_preset, "Data/Counter.rvdata")

  210.     p ("重设四方通行文件完毕")
  211.   end
  212.   def get_true_id(id)
  213.     if id > 128
  214.       return id +1407
  215.     else
  216.       return (id*48) + 2000
  217.     end
  218.   end
  219.   def above?(id)
  220.     return @passages[id] & 0x10 == 0x10
  221.   end
  222. end
  223. class Game_Character
  224.   $重设地形标记文件 = false
  225.   @map_tile_tag_A = {
  226.     0 => [],
  227.     1 => [],
  228.     2 => [],
  229.     3 => [],
  230.     4 => [],
  231.     5 => [],
  232.     6 => [],
  233.     7 => []
  234.   }
  235.   @map_tile_tag_B = {
  236.     0 => [],
  237.     1 => [],
  238.     2 => [],
  239.     3 => [],
  240.     4 => [],
  241.     5 => [],
  242.     6 => [],
  243.     7 => []
  244.   }
  245.   @map_tile_tag_C = {
  246.     0 => [],
  247.     1 => [],
  248.     2 => [],
  249.     3 => [],
  250.     4 => [],
  251.     5 => [],
  252.     6 => [],
  253.     7 => []
  254.   }
  255.   @map_tile_tag_D = {
  256.     0 => [],
  257.     1 => [],
  258.     2 => [],
  259.     3 => [],
  260.     4 => [],
  261.     5 => [],
  262.     6 => [],
  263.     7 => []
  264.   }
  265.   @map_tile_tag_E = {
  266.     0 => [],
  267.     1 => [],
  268.     2 => [],
  269.     3 => [],
  270.     4 => [],
  271.     5 => [],
  272.     6 => [],
  273.     7 => []
  274.   }
  275.   tile_tag = [@map_tile_tag_A, @map_tile_tag_B,
  276.   @map_tile_tag_C, @map_tile_tag_D, @map_tile_tag_E]
  277.   if $重设地形标记文件
  278.     save_data(tile_tag, "Data/TerrainTags.rvdata")
  279.     p ("重设地形标记文件完毕")
  280.     exit
  281.   end
  282. end
复制代码


四方通行部分:

  1. class Game_Map
  2.   alias setup_4_passage setup
  3.   def setup(map_id)
  4.     setup_4_passage(map_id)
  5.     reset_map_files if $重设四方通行文件
  6.     loaded_passages = load_data("Data/Passage.rvdata")
  7.     @map_id_passage_A = loaded_passages[0]
  8.     @map_id_passage_B = loaded_passages[1]
  9.     @map_id_passage_C = loaded_passages[2]
  10.     @map_id_passage_D = loaded_passages[3]
  11.     @map_id_passage_E = loaded_passages[4]
  12.     @map_autotile_passage = loaded_passages[5]
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 获取ID
  16.   #--------------------------------------------------------------------------
  17.   def get_tile_id(x, y)
  18.     a = data[x, y, 0]-2000
  19.     map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
  20.     map_tile_id_1 = (data[x, y, 1]-2000) / 48
  21.     map_tile_id_2 = (data[x, y, 2])
  22.          
  23.     map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
  24.     map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
  25.     map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
  26.    
  27.     # 图块 ID 矫正
  28.     map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0
  29.     unless @events.nil?
  30.       for event in @events.values
  31.         if event.pos?(x, y) and event.tile_id > 0
  32.           # 若是事件使用地图元件,使用该地图元件的ID
  33.           map_tile_id_2 = event.tile_id
  34.         end
  35.       end
  36.     end
  37.     # 返回 [底层ID, 上层ID]
  38.     return [map_tile_id_0, map_tile_id_2]
  39.   end
  40.   #--------------------------------------------------------------------------
  41.   # ● 根据通行设定获取通行度
  42.   #     value : 数值
  43.   #     pas   : 通行度哈希表
  44.   #--------------------------------------------------------------------------
  45.   def get_passage(value, pas)
  46.     for i in pas.keys
  47.       # 找到通行度就返回
  48.       return i if pas[i].include?(value)
  49.     end
  50.     # 找不到设定即返回“全部可以通行”
  51.     return 0b1111
  52.   end
  53.   def set_passage(id, value, pas)
  54.     return if value > 15 or value < 0
  55.     for i in pas.keys
  56.       pas[i].delete(id) if pas.include?(id)
  57.       pas[i].push(id) if i == value
  58.     end
  59.   end
  60.   def autotile?(x, y)
  61.     return get_tile_id(x,y)[0] < 129
  62.   end
  63.   #--------------------------------------------------------------------------
  64.   # ● 四方向通行判断
  65.   #--------------------------------------------------------------------------
  66.   def passable_dir?(x, y, d)
  67.     # 通行判定优先度:
  68.     #   事件内设定 > 事件元件 > B层 > A层
  69.    
  70.     return false unless passable?(x, y, 0x01)
  71.     id = get_tile_id(x,y)
  72.     case id[1]
  73.     when 0
  74.       # 获取图块A部分的通行度
  75.       passage = get_passage(id[0], @map_id_passage_A) if ( (1..256) === id[0])
  76.       # 是自动元件且通行设定为 □
  77.       if autotile?(x, y) and passage == -0b1111
  78.         a = data[x, y, 0]
  79.         passage = get_passage(a%48, @map_autotile_passage)
  80.       end
  81.     when 1..255
  82.       # 获取图块B部分的通行度
  83.       passage = get_passage(id[1], @map_id_passage_B)
  84.     when 256..511
  85.       # 获取图块C部分的通行度
  86.       passage = get_passage(id[1]-256, @map_id_passage_C)
  87.     when 512..767
  88.       # 获取图块D部分的通行度
  89.       passage = get_passage(id[1]-512, @map_id_passage_D)
  90.     when 768..1023
  91.       # 获取图块E部分的通行度
  92.       passage = get_passage(id[1]-768, @map_id_passage_E)
  93.     end
  94.     # 获取事件内的通行设定
  95.     e = $game_map.events_xy(x, y)
  96.     unless e.empty?
  97.       e.size.times{ |i|
  98.         # 一获取通行设定就跳出循环
  99.         if e[i].passage
  100.           passage = e[i].passage
  101.           break
  102.         end
  103.       }
  104.     end
  105.     # 判断桥的通行
  106.     passage = passable_bridge(id[1], x, y, d, passage) if bridge?(passage)
  107.     return (passage[(d/2)-1] == 1)
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # ● 桥元件通行判断
  111.   #--------------------------------------------------------------------------
  112.   def passable_bridge(id, x, y, d, pas)
  113.     # 不是桥元件就直接返回原通行度
  114.     return pas unless bridge?(pas)
  115.     # 是自动元件的情况返回原通行度
  116.     return pas if autotile?(x, y) and get_tile_id(x,y)[1] == 0
  117.     case d
  118.     when 2; temp_id = get_tile_id(x,y-1)      
  119.     when 4; temp_id = get_tile_id(x+1,y)
  120.     when 6; temp_id = get_tile_id(x-1,y)
  121.     when 8; temp_id = get_tile_id(x,y+1)
  122.     end
  123.     return 0b1111 if temp_id.include?(id)
  124.     return pas
  125.   end
  126.   def bridge?(pas)
  127.     return (pas == 0b1001 or pas == 0b0110)
  128.   end
  129.   #--------------------------------------------------------------------------
  130.   # ● 判断草木繁茂处
  131.   #     x : X 坐标
  132.   #     y : Y 坐标
  133.   #--------------------------------------------------------------------------
  134.   alias pass_4_direction_bush? bush?
  135.   def bush?(x, y)
  136.     return false unless valid?(x, y)
  137.     id = get_tile_id(x, y)
  138.     map_bush_tiles = load_data("Data/Bush.rvdata")
  139.     case id[1]
  140.     when 0
  141.       return true if map_bush_tiles[1].include?(id[0])
  142.     when 1...1023
  143.       return true if map_bush_tiles[id[1]/256+2].include?(id[1])
  144.     end
  145.     pass_4_direction_bush?(x, y)
  146.   end
  147.   #--------------------------------------------------------------------------
  148.   # ● 判断柜台属性
  149.   #     x : X 坐标
  150.   #     y : Y 坐标
  151.   #--------------------------------------------------------------------------
  152.   alias pass_4_direction_counter? counter?
  153.   def counter?(x, y)
  154.     return false unless valid?(x, y)
  155.     id = get_tile_id(x, y)
  156.     map_counter_tiles = load_data("Data/Counter.rvdata")
  157.     case id[1]
  158.     when 0
  159.       return true if map_counter_tiles[1].include?(id[0])
  160.     when 1...1023
  161.       return true if map_counter_tiles[id[1]/256+2].include?(id[1])
  162.     end
  163.     pass_4_direction_counter?(x, y)
  164.   end
  165. end

  166. class Game_Character
  167.   #--------------------------------------------------------------------------
  168.   # ● 通行判断
  169.   #--------------------------------------------------------------------------
  170.   def map_passable?(x, y, d=@move_direction)
  171.     return (map_passable_here?(x, y) and map_passable_there?(x, y, d))
  172.   end
  173.   #--------------------------------------------------------------------------
  174.   # ● 本地通行判断
  175.   #--------------------------------------------------------------------------
  176.   def map_passable_here?(x, y, d=@move_direction)
  177.     return $game_map.passable_dir?(x, y, d)
  178.   end
  179.   #--------------------------------------------------------------------------
  180.   # ● 前方通行判断
  181.   #--------------------------------------------------------------------------
  182.   def map_passable_there?(x, y, d_o)
  183.     d = 10 - d_o             # 反向判断
  184.     # 修正座标
  185.     case d
  186.     when 2; y += 1
  187.     when 4; x -= 1
  188.     when 6; x += 1
  189.     when 8; y -= 1
  190.     end
  191.     x = $game_map.round_x(x) # 横向循环校正
  192.     y = $game_map.round_y(y) # 纵向循环校正
  193.     return $game_map.passable_dir?(x, y, d)
  194.   end
  195.   alias passage_4_dir_move_down move_down
  196.   def move_down(turn_ok = true)
  197.     @move_direction = 2
  198.     passage_4_dir_move_down(turn_ok)
  199.   end
  200.   alias passage_4_dir_move_left move_left
  201.   def move_left(turn_ok = true)
  202.     @move_direction = 4
  203.     passage_4_dir_move_left(turn_ok)
  204.   end
  205.   alias passage_4_dir_move_right move_right
  206.   def move_right(turn_ok = true)
  207.     @move_direction = 6
  208.     passage_4_dir_move_right(turn_ok)
  209.   end
  210.   alias passage_4_dir_move_up move_up
  211.   def move_up(turn_ok = true)
  212.     @move_direction = 8
  213.     passage_4_dir_move_up(turn_ok)
  214.   end
  215. end
  216. class Game_Event < Game_Character
  217.   #--------------------------------------------------------------------------
  218.   # ● 接触事件启动判定
  219.   #--------------------------------------------------------------------------
  220.   alias passage_4_dir_check_event_trigger_touch check_event_trigger_touch
  221.   def check_event_trigger_touch(x, y)
  222.     return false if !map_passable?(x, y)
  223.     passage_4_check_event_trigger_touch(x, y)
  224.   end
  225.   def passage
  226.     return false if @list[0].code != 108 # 第一个指令不是“注释”时返回 false
  227.     pas = @list[0].parameters[0]
  228.     return false if pas !~ /0b\d{4}/     # 如果不是设定通行度就返回 false
  229.     return pas.to_i(2)
  230.   end
  231. end
  232. class Game_Player < Game_Character
  233.   #--------------------------------------------------------------------------
  234.   # ● 判断前方事件是否被触发
  235.   #--------------------------------------------------------------------------
  236.   alias passage_4_dir_check_event_trigger_there check_event_trigger_there
  237.   def check_event_trigger_there(triggers)
  238.     return false if !map_passable?(@x, @y)
  239.     passage_4_dir_check_event_trigger_there(triggers)
  240.   end
  241.   #--------------------------------------------------------------------------
  242.   # ● 判断接触事件是否被触发
  243.   #--------------------------------------------------------------------------
  244.   alias passage_4_dir_check_event_trigger_touch check_event_trigger_touch
  245.   def check_event_trigger_touch(x, y)
  246.   return false if !map_passable?(x, y)
  247.     passage_4_dir_check_event_trigger_touch(x, y)
  248.   end
  249.   #--------------------------------------------------------------------------
  250.   # ● 通行判断
  251.   #--------------------------------------------------------------------------
  252.   alias passage_4_dir_map_passable? map_passable?
  253.   def map_passable?(x, y)
  254.     # 在交通工具中的话,使用默认脚本
  255.     in_vehicle? ? passage_4_dir_map_passable?(x, y) : super
  256.   end
  257.   #--------------------------------------------------------------------------
  258.   # ● 判断行走通行度
  259.   #--------------------------------------------------------------------------
  260.   def can_walk?(x, y)
  261.     last_vehicle_type = @vehicle_type   # 移除交通工具类型
  262.     @vehicle_type = -1                  # 暂时设置为行走
  263.     result = passage_4_dir_map_passable?(x, y) # 判断是否可以通行
  264.     @vehicle_type = last_vehicle_type   # 回复交通工具类型
  265.     return result
  266.   end
  267. end
复制代码


地形标记部分
  1. class Game_Character
  2.   alias terrain_tag_ini initialize
  3.   def initialize
  4.     terrain_tag_ini
  5.     loaded_passages = load_data("Data/TerrainTags.rvdata")
  6.     @map_tile_tag_A = loaded_passages[0]
  7.     @map_tile_tag_B = loaded_passages[1]
  8.     @map_tile_tag_C = loaded_passages[2]
  9.     @map_tile_tag_D = loaded_passages[3]
  10.     @map_tile_tag_E = loaded_passages[4]
  11.   end
  12.   #--------------------------------------------------------------------------
  13.   # ● 获取地形标志
  14.   #--------------------------------------------------------------------------
  15.   def terrain_tag   
  16.     # 计算图块ID数值
  17.     a = $game_map.data[@x, @y, 0]-2000
  18.     map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
  19.     map_tile_id_1 = ($game_map.data[@x, @y, 1]-2000) / 48
  20.     map_tile_id_2 = ($game_map.data[@x, @y, 2])
  21.          
  22.     map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
  23.     map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
  24.     map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
  25.    
  26.     # 图块 ID 矫正
  27.     map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0
  28.     for event in $game_map.events.values
  29.       if event.pos?(@x, @y) and event.tile_id > 0
  30.         map_tile_id_2 = event.tile_id
  31.       end
  32.     end
  33.    
  34.     $map_tile_id_2 = map_tile_id_2
  35.    
  36.     case map_tile_id_2
  37.     when 0
  38.       # 获取图块A部分的地形标志
  39.       return get_tag(map_tile_id_0, @map_tile_tag_A) if ( (1..256) === map_tile_id_0)
  40.       return @map_tile_tag_A[map_tile_id_0] if ( (1..256) === map_tile_id_0)
  41.     when 1..255
  42.       # 获取图块B部分的地形标志
  43.       return get_tag(map_tile_id_2, @map_tile_tag_B)
  44.       return @map_tile_tag_B[map_tile_id_2]
  45.     when 256..511
  46.       # 获取图块C部分的地形标志
  47.       return get_tag(map_tile_id_2, @map_tile_tag_C)
  48.       return @map_tile_tag_C[map_tile_id_2-256]
  49.     when 511..767
  50.       # 获取图块D部分的地形标志
  51.       return get_tag(map_tile_id_2, @map_tile_tag_D)
  52.       return @map_tile_tag_D[map_tile_id_2-512]
  53.     when 768..1023
  54.       # 获取图块E部分的地形标志
  55.       return get_tag(map_tile_id_2, @map_tile_tag_E)
  56.       return @map_tile_tag_E[map_tile_id_2-768]
  57.     else
  58.       # 黑屏区未定义(尚未规划任何)图块区域  回传0
  59.       return 0
  60.     end
  61.   end
  62.   def get_tag(id, tag_table)
  63.     for i in tag_table.keys
  64.       # 找到通行度就返回
  65.       return i if tag_table[i].include?(id)
  66.     end
  67.     # 找不到设定即返回 0
  68.     return 0
  69.   end
  70.   def set_tag(id, value, tag_table)
  71.     return if value > 7 or value < 0
  72.     for i in tag_table.keys
  73.       tag_table[i].delete(id) if tag_table.include?(id)
  74.       tag_table[i].push(id) if i == value
  75.     end
  76.   end
  77. end
复制代码
VA脚本开工中...
偷窃脚本1.0 - 已完成

Lv1.梦旅人

梦石
0
星屑
119
在线时间
0 小时
注册时间
2009-10-5
帖子
4
21
发表于 2010-2-26 11:51:29 | 只看该作者
同楼上问……
貌似2.0中重设四方通行文件部分没有执行……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
396 小时
注册时间
2009-7-22
帖子
34
20
发表于 2009-8-15 10:58:00 | 只看该作者
我在使用新 四方通行脚本 v2.0时已经把「设定部分」的「$重设四方通行文件」 跟 「$重设地形标记文件」改成 true,可是在Data 文件夹里面只生成了TerrainTags.rvdata,没有生成Passage.rvdata、Bush.rvdata、Counter.rvdata...........
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

19
 楼主| 发表于 2009-2-14 04:34:53 | 只看该作者
以下引用cybcaoyibo于2009-2-13 16:44:30的发言:
那个范例中的桥
从左走到右,再走回左就走不了了,必须先走出桥再回到桥上才能走回去

事件设置问题,跟脚本无关
因为只是做个范例而已。所以没有多做判断
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
1 小时
注册时间
2009-1-6
帖子
12
18
发表于 2009-2-14 00:44:30 | 只看该作者
那个范例中的桥
从左走到右,再走回左就走不了了,必须先走出桥再回到桥上才能走回去
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

17
 楼主| 发表于 2009-2-13 07:49:59 | 只看该作者
脚本更新:
* 2009/2/12
- 功能增加:无法通行处不能触发事件
- 功能增加:加入草木繁茂处、柜台属性的判定跟设定
- 功能增加:通行度等资料存进文件中,设定好了就不会变(除非用编辑器)
- 脚本整合:加入地形标记的设定和判定
- 脚本更新:放出编辑器
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
59
在线时间
31 小时
注册时间
2009-1-30
帖子
207
16
发表于 2009-2-6 11:29:59 | 只看该作者
{/cy}{/cy}真是有效率!
蚊香
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

15
 楼主| 发表于 2009-2-6 11:19:31 | 只看该作者
脚本更新
* 2009/2/5
  - 错误修复:「设置移动路线」会无效的BUG已修复
  - 脚本更新:把 □ 通行度设定为 -0b1111

下次预计更新:编辑器
不过至少要到星期二
未来三天都没空上来了
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
14
发表于 2009-2-6 09:51:52 | 只看该作者
除了有了地形标志以后,
流星姐一直很努力把RM_VX XP化呢。

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
59
在线时间
31 小时
注册时间
2009-1-30
帖子
207
13
发表于 2009-2-6 08:52:58 | 只看该作者
{/cy}{/cy}都不错 就有一个小问题
步步判断通行度 那个事件里的人物路线图不能自动完成了  必须自己按下走一步
蚊香
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-30 02:23

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表