Project1

标题: 新 四方通行脚本 v2.0 [打印本页]

作者: 雪流星    时间: 2009-1-31 11:26
标题: 新 四方通行脚本 v2.0
脚本更新:
* 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
复制代码

作者: 雪流星    时间: 2009-1-31 11:32
调用编辑器方法:
$scene = Scene_Tile.new


编辑器窗口部分:
  1. class Window_Tile < Window_Selectable
  2.   attr_writer :tile_ltr
  3.   def initialize
  4.     super(120, 0, 288, 1056, 0)
  5.     @item_max = 256
  6.     @column_max = 8
  7.     @tile_ltr = "A"
  8.     @cur_opa_inc = true
  9.     self.index = 0
  10.     create_contents
  11.     self.height = 416
  12.    
  13.     @contents_fake = Sprite.new
  14.     @contents_fake.bitmap = Bitmap.new(self.contents.width, self.contents.height)
  15.     @contents_fake.x = self.x + 16
  16.     @contents_fake.y = self.y + 16
  17.     @contents_fake.z = 9999
  18.     @contents_fake.src_rect.height = self.height-32
  19.    
  20.     # 从文件中载入地形标记跟通行度
  21.     loaded_tags = load_data(Tile::TagDir)
  22.     @tile_A_terrain_tag = loaded_tags[0]
  23.     @tile_B_terrain_tag = loaded_tags[1]
  24.     @tile_C_terrain_tag = loaded_tags[2]
  25.     @tile_D_terrain_tag = loaded_tags[3]
  26.     @tile_E_terrain_tag = loaded_tags[4]
  27.    
  28.     loaded_passages = load_data(Tile::PasDir)
  29.     @map_id_passage_A = loaded_passages[0]
  30.     @map_id_passage_B = loaded_passages[1]
  31.     @map_id_passage_C = loaded_passages[2]
  32.     @map_id_passage_D = loaded_passages[3]
  33.     @map_id_passage_E = loaded_passages[4]
  34.    
  35.     @tags = eval("@tile_#{@tile_ltr}_terrain_tag")
  36.     @pass = eval("@map_id_passage_#{@tile_ltr}")
  37.     @map_counter_tiles = load_data("Data/Counter.rvdata")
  38.     @map_bush_tiles = load_data("Data/Bush.rvdata")
  39.     @cursor_sprite = Sprite.new
  40.     @cursor_sprite.bitmap = Cache.system("Window")
  41.     @cursor_sprite.src_rect = Rect.new(64, 64, 32, 32)
  42.     load_tilemap
  43.     refresh
  44.   end
  45.   def refresh
  46.     self.contents.clear
  47.     @contents_fake.bitmap.clear
  48.     draw_tile
  49.     draw_cursor
  50.   end
  51.   def update
  52.     super
  53.     if Input.repeat?(Input::DOWN) or Input.repeat?(Input::UP) or
  54.       Input.repeat?(Input::LEFT) or Input.repeat?(Input::RIGHT) or
  55.       Input.repeat?(Input::L) or Input.repeat?(Input::R)
  56.       @contents_fake.src_rect.y = self.oy
  57.       draw_cursor
  58.     end
  59.     cursor_flash
  60.     @tags = eval("@tile_#{@tile_ltr}_terrain_tag")
  61.     @pass = eval("@map_id_passage_#{@tile_ltr}")
  62.   end
  63.   def cursor_movable?
  64.     return false if Input.trigger?(Input::A)
  65.     super
  66.   end
  67.   def draw_cursor
  68.     @cur_opa_inc = true
  69.     @cursor_sprite.opacity = 255
  70.     @cursor_sprite.x = self.cursor_rect.x + self.x + 16
  71.     @cursor_sprite.y = self.cursor_rect.y + 16
  72.     @cursor_sprite.z = self.z + 100
  73.   end
  74.   def cursor_flash
  75.     if @cur_opa_inc
  76.       if @cursor_sprite.opacity < 255
  77.         @cursor_sprite.opacity += 15
  78.       else
  79.         @cur_opa_inc = false
  80.       end
  81.     else
  82.       if @cursor_sprite.opacity > 0
  83.         @cursor_sprite.opacity -= 15
  84.       else
  85.         @cur_opa_inc = true
  86.       end
  87.     end
  88.   end
  89.   def draw_tile
  90.     self.contents.clear
  91.     if @tile_ltr == "A"
  92.       create_tile_A
  93.     else
  94.       rect = Rect.new(0, 0, 256, 512)
  95.       i = {"B" => 5, "C" => 6, "D" => 7, "E" => 8}
  96.       self.contents.blt(0, 0, @tile_bitmaps[i[@tile_ltr]], rect)
  97.       rect.x += 256
  98.       self.contents.blt(0, 512, @tile_bitmaps[i[@tile_ltr]], rect)      
  99.     end
  100.   end
  101.   def draw_tile_this(mode)
  102.     @contents_fake.bitmap.clear
  103.     @tags = eval("@tile_#{@tile_ltr}_terrain_tag")
  104.     @pass = eval("@map_id_passage_#{@tile_ltr}")
  105.     257.times {|i|
  106.       x = (i%8) * 32
  107.       y = (i/8) * 32
  108.       case mode
  109.       when "tags"
  110.         t = $game_player.get_tag(i, @tags)
  111.         @contents_fake.bitmap.font.color = Color.new(255, 255, 255)
  112.         @contents_fake.bitmap.draw_text(x, y, 32, 32, t, 1)
  113.       when "4dir"
  114.         if @tile_ltr == "A"
  115.           i2 = i - 1
  116.           x = (i2%8) * 32
  117.           y = (i2/8) * 32            
  118.         end
  119.         draw_tile_4_direction(x, y, i)
  120.       when "bush"
  121.         if @tile_ltr == "A"
  122.           a = self.bush[1].include?(i+1)
  123.         else
  124.           j = Tile::TILESETS.index(@tile_ltr)
  125.           a = self.bush[j+1].include?(i+(j-1)*256)
  126.         end
  127.         t = a ? "~" : "="
  128.         @contents_fake.bitmap.font.color = a ? Color.new(0, 255, 0) : Color.new(255, 255, 255)
  129.         @contents_fake.bitmap.draw_text(x, y, 32, 32, t, 1)
  130.       when "counter"
  131.         if @tile_ltr == "A"
  132.           a = self.counter[1].include?(i+1)
  133.         else
  134.           j = Tile::TILESETS.index(@tile_ltr)
  135.           a = self.counter[j+1].include?(i+(j-1)*256)
  136.         end
  137.         t = a ? "╬" : "⊕"
  138.         @contents_fake.bitmap.font.color = a ? Color.new(255, 255, 0) : Color.new(255, 255, 255)
  139.         @contents_fake.bitmap.draw_text(x, y, 32, 32, t, 1)
  140.       end
  141.     }
  142.   end
  143.   def draw_tile_4_direction(x, y, i=@index)
  144.     @contents_fake.bitmap.clear_rect(x, y, 32, 32)
  145.     @contents_fake.bitmap.font.bold = true
  146.     @contents_fake.bitmap.font.shadow = false
  147.     temp_pas = pass(i)
  148.     if temp_pas == -100
  149.       @contents_fake.bitmap.font.color = Color.new(255, 0, 0)
  150.       @contents_fake.bitmap.draw_text(x , y, 32, 32, "╳", 1)
  151.     elsif temp_pas == -0b1111
  152.       @contents_fake.bitmap.font.color = Color.new(0, 0, 255)
  153.       @contents_fake.bitmap.draw_text(x , y, 32, 32, "□", 1)
  154.     else
  155.       if $game_map.above?(i)# ☆: 不影響通行判定
  156.         @contents_fake.bitmap.font.color = Color.new(255, 255, 128)
  157.         @contents_fake.bitmap.draw_text(x , y, 32, 32, "☆", 1)
  158.       end
  159.       str = ["", "↑", "•", "←", "•", "→", "•", "↓", "•"]
  160.       @contents_fake.bitmap.font.color = str[2-temp_pas[0]] == "•" ? Color.new(128, 0, 0) : Color.new(0, 128, 0)
  161.       @contents_fake.bitmap.draw_text(x+6 , y-8, 32, 32, str[2-temp_pas[0]])
  162.       @contents_fake.bitmap.font.color = str[4-temp_pas[1]] == "•" ? Color.new(128, 0, 0) : Color.new(0, 128, 0)
  163.       @contents_fake.bitmap.draw_text(x-2 , y  , 32, 32, str[4-temp_pas[1]])
  164.       @contents_fake.bitmap.font.color = str[6-temp_pas[2]] == "•" ? Color.new(128, 0, 0) : Color.new(0, 128, 0)
  165.       @contents_fake.bitmap.draw_text(x+14, y  , 32, 32, str[6-temp_pas[2]])
  166.       @contents_fake.bitmap.font.color = str[8-temp_pas[3]] == "•" ? Color.new(128, 0, 0) : Color.new(0, 128, 0)
  167.       @contents_fake.bitmap.draw_text(x+6 , y+8, 32, 32, str[8-temp_pas[3]])
  168.     end
  169.     @contents_fake.bitmap.font.bold = false
  170.     @contents_fake.bitmap.font.shadow = true
  171.   end
  172.   def create_tile_A
  173.     @tile_A = Bitmap.new(256, 1024)
  174.     for i in 0..4
  175.       temp_bmp = @tile_bitmaps[i]
  176.       case i
  177.       when 0
  178.         16.times do |j|
  179.           x = j % 8 * 32
  180.           x += 64 if j%8>=2 and j%8<=3
  181.           x -= 64 if j%8>=4 and j%8<=5
  182.           x += 32 if j==1
  183.           x -= 32 if j==4
  184.           y = j / 8 * 32
  185.           bx = j % 4 * 128+64
  186.           by = j / 4 * 96
  187.           if j == 0
  188.             rect = Rect.new(16, 48, 32, 32)
  189.             3.times{|k| @tile_A.blt(x+(k+1)*32, y, temp_bmp, rect)}
  190.           end
  191.           rect = Rect.new(bx, by, 32, 32)
  192.           @tile_A.blt(x, y, temp_bmp, rect)
  193.         end
  194.       when 1
  195.         32.times do |j|
  196.           x = j % 8 * 32
  197.           y = j / 8 * 32
  198.           bx = x * 2
  199.           by = y * 3
  200.           if [0, 3].include?(j%8)
  201.             rect = Rect.new(bx+16, by+48, 32, 32)
  202.             2.times{|k| @tile_A.blt(x+(k+1)*32, y+64, temp_bmp, rect)}
  203.           end
  204.           rect = Rect.new(bx, by, 32, 32)
  205.           @tile_A.blt(x, y+64, temp_bmp, rect)
  206.         end
  207.       when 2
  208.         32.times do |j|
  209.           x = j % 8 * 32
  210.           y = j / 8 * 32
  211.           rect = Rect.new(0, 0, 32, 32)
  212.           @tile_A.blt(x, y+192, get_corners(x*2, y*2, temp_bmp), rect)
  213.         end
  214.       when 3
  215.         48.times do |j|
  216.           x = j % 8 * 32
  217.           y = j / 8 * 32
  218.           bx = x*2
  219.           if (j/8)%2 == 0
  220.             by = j / 8 * 80
  221.             rect = Rect.new(bx, by, 32, 32)
  222.             @tile_A.blt(x, y+320, temp_bmp, rect)
  223.           else
  224.             by = (j/8-1) * 80+96
  225.             rect = Rect.new(0, 0, 32, 32)
  226.             @tile_A.blt(x, y+320, get_corners(bx, by, temp_bmp), rect)
  227.           end
  228.         end
  229.       when 4
  230.         rect = Rect.new(0, 0, 256, 512)
  231.         @tile_A.blt(0, 512, temp_bmp, rect)
  232.       end
  233.     end
  234.     rect = Rect.new(0, 0, 256, 1024)
  235.     self.contents.blt(0, 0, @tile_A, rect)
  236.   end
  237.   def get_corners(bx, by, bmp)
  238.     temp_bmp = Bitmap.new(32, 32)   
  239.     rect = Rect.new(bx, by, 16, 16)
  240.     temp_bmp.blt(0, 0, bmp, rect)   
  241.     rect = Rect.new(bx+48, by, 16, 16)
  242.     temp_bmp.blt(16, 0, bmp, rect)   
  243.     rect = Rect.new(bx, by+48, 16, 16)
  244.     temp_bmp.blt(0, 16, bmp, rect)   
  245.     rect = Rect.new(bx+48, by+48, 16, 16)
  246.     temp_bmp.blt(16, 16, bmp, rect)   
  247.     return temp_bmp
  248.   end
  249.   def cannot_set_tag
  250.     return true if @tile_ltr == "A" and @index == 136
  251.     return true if @tile_ltr == "B" and @index == 0
  252.     return false
  253.   end
  254.   def cannot_set_bush
  255.     return true if @tile_ltr == "A" and [18, 21, 26, 29, 34, 37, 42, 45].include?(@index+1)
  256.     return false
  257.   end
  258.   def cannot_set_counter
  259.     return true if @tile_ltr == "A" and [24, 32, 40, 48].include?(@index+1)
  260.     return false
  261.   end
  262.   def cannot_set_pass(i=@index)
  263.     i += 1 if  @tile_ltr == "A"
  264.     return true if (pass(i) == -100)
  265.     return true if (pass(i) == -0b1111)
  266.     return false
  267.   end
  268.   #--------------------------------------------------------------------------
  269.   # ● 獲取通行
  270.   #--------------------------------------------------------------------------
  271.   def pass(i=@index)
  272.     @pass = eval("@map_id_passage_#{@tile_ltr}")
  273.     return $game_map.get_passage(i, @pass)
  274.   end
  275.   #--------------------------------------------------------------------------
  276.   # ● 设置通行
  277.   #--------------------------------------------------------------------------
  278.   def pass=(pas)
  279.     @pass = eval("@map_id_passage_#{@tile_ltr}")
  280.     $game_map.set_passage(@index, pas, @pass)
  281.   end
  282.   #--------------------------------------------------------------------------
  283.   # ● 獲取地形标记
  284.   #--------------------------------------------------------------------------
  285.   def tags
  286.     return $game_player.get_tag(@index, @tags)
  287.   end
  288.   #--------------------------------------------------------------------------
  289.   # ● 设置地形标记
  290.   #--------------------------------------------------------------------------
  291.   def tags=(tg)
  292.     $game_player.set_tag(@index, tg, @tags)
  293.   end
  294.   def item_rect(index)
  295.     rect = Rect.new(0, 0, 32, 32)
  296.     rect.x = index % @column_max * (rect.width + @spacing)
  297.     rect.y = index / @column_max * 32
  298.     return rect
  299.   end
  300.   def bush
  301.     return @map_bush_tiles
  302.   end
  303.   def bush?(i)
  304.     j = Tile::TILESETS.index(@tile_ltr)
  305.     return @map_bush_tiles[j+1].include?(i)
  306.   end
  307.   def set_bush(i, tf)
  308.     j = Tile::TILESETS.index(@tile_ltr)
  309.     k = (i+(j-1)*256)
  310.     k = i if @tile_ltr == "A"
  311.     a = @map_bush_tiles[j+1].include?(k)
  312.     if tf
  313.       @map_bush_tiles[j+1].push(k)
  314.     else
  315.       @map_bush_tiles[j+1].delete(k)
  316.     end
  317.     @map_bush_tiles[j+1].uniq!
  318.   end
  319.   def counter
  320.     return @map_counter_tiles
  321.   end
  322.   def set_counter(i, tf)
  323.     j = Tile::TILESETS.index(@tile_ltr)
  324.     k = (i+(j-1)*256)
  325.     k = i if @tile_ltr == "A"
  326.     a = @map_counter_tiles[j+1].include?(k)
  327.     if tf
  328.       @map_counter_tiles[j+1].push(k)
  329.     else
  330.       @map_counter_tiles[j+1].delete(k)
  331.     end
  332.     @map_counter_tiles[j+1].uniq!
  333.   end
  334.   def counter?(i)
  335.     j = Tile::TILESETS.index(@tile_ltr)
  336.     return @map_counter_tiles[j+1].include?(i)
  337.   end
  338.   #--------------------------------------------------------------------------
  339.   # ● 獲取首行
  340.   #--------------------------------------------------------------------------
  341.   def top_row
  342.     return self.oy / 32
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # ● 設置首行
  346.   #     row : 顯示在最上的行
  347.   #--------------------------------------------------------------------------
  348.   def top_row=(row)
  349.     row = 0 if row < 0
  350.     row = row_max - 1 if row > row_max - 1
  351.     self.oy = row * 32
  352.   end
  353.   #--------------------------------------------------------------------------
  354.   # ● 獲取一頁能顯示的行數
  355.   #--------------------------------------------------------------------------
  356.   def page_row_max
  357.     return (self.height - 32) / 32
  358.   end
  359.   def load_tilemap
  360.     @tile_bitmaps = Array.new(9)
  361.     @tile_bitmaps[0] = Cache.system("TileA1")
  362.     @tile_bitmaps[1] = Cache.system("TileA2")
  363.     @tile_bitmaps[2] = Cache.system("TileA3")
  364.     @tile_bitmaps[3] = Cache.system("TileA4")
  365.     @tile_bitmaps[4] = Cache.system("TileA5")
  366.     @tile_bitmaps[5] = Cache.system("TileB")
  367.     @tile_bitmaps[6] = Cache.system("TileC")
  368.     @tile_bitmaps[7] = Cache.system("TileD")
  369.     @tile_bitmaps[8] = Cache.system("TileE")
  370.   end
  371.   def output_file
  372.     passage_all_maps_blah = [@map_id_passage_A, @map_id_passage_B,
  373.     @map_id_passage_C, @map_id_passage_D,
  374.     @map_id_passage_E, @map_autotile_passage]
  375.     save_data(passage_all_maps_blah, Tile::PasDir)
  376.    
  377.     tile_terrain_tags = [@tile_A_terrain_tag, @tile_B_terrain_tag,
  378.     @tile_C_terrain_tag, @tile_D_terrain_tag, @tile_E_terrain_tag]
  379.     save_data(tile_terrain_tags, Tile::TagDir)
  380.   end

  381.   def dispose
  382.     super
  383.     @contents_fake.dispose
  384.   end
  385. end
复制代码


编辑器场景部分:
  1. module Tile
  2.   TILESETS = ["A","B","C","D","E"]
  3.   TagDir = "Data/TerrainTags.rvdata"
  4.   PasDir = "Data/Passage.rvdata"
  5. end
  6. class Scene_Tile < Scene_Base
  7.   def start
  8.     @function_window = Window_Command.new(120, ["四方通行","地形标记", "草木繁茂处" ,"柜台属性", "全部储存"])
  9.     @function_window.index = 0
  10.     @function_window.active = true
  11.    
  12.     @tileset_window = Window_Command.new(120, ["A","B","C","D","E"])
  13.     @tileset_window.index = 0
  14.     @tileset_window.active = false
  15.     @tileset_window.y = @function_window.y + @function_window.height
  16.    
  17.     @tile_window = Window_Tile.new
  18.     @tile_window.active = false
  19.    
  20.     @help_window = Window_Base.new(392, -16, 168, 448)
  21.     @help_window.opacity = 0
  22.     @help_window.z = 0
  23.     @help_window.contents.font.size = 14
  24.     @help_window.contents.draw_text(4,  0, 170, 24, "A, S:切换图块")
  25.     @help_window.contents.draw_text(4, 24, 170, 24, "确定键:地形标志+1")
  26.     @help_window.contents.draw_text(4, 48, 170, 24, "取消键:地形标志-1")
  27.     @help_window.contents.draw_text(4, 72, 170, 24, "D 键:输出为文本")
  28.     update_tag
  29.   end
  30.   def update
  31.     @function_window.update
  32.     @tile_window.update
  33.     @tileset_window.update
  34.    
  35.     @function_window.opacity = @function_window.active ? 255 : 128
  36.     @tileset_window.opacity = @tileset_window.active ? 255 : 128
  37.     @tile_window.opacity = @tile_window.active ? 255 : 128
  38.    
  39.     if @function_window.active
  40.       update_function_window
  41.     elsif @tileset_window.active
  42.       update_tileset_window
  43.     elsif @tile_window.active
  44.       update_tile_window
  45.     elsif @tile_direction
  46.       update_tile_window_directions
  47.     end
  48.   end
  49.   def update_function_window
  50.     if Input.trigger?(Input::B)
  51.       $scene = Scene_Map.new
  52.     elsif Input.trigger?(Input::C)
  53.       case @function_window.index
  54.       when 0..3
  55.         @function_window.active = false
  56.         @tileset_window.active = true
  57.       when 4
  58.         @tile_window.output_file        
  59.         $scene = Scene_Map.new
  60.       end
  61.     end
  62.   end
  63.   def update_tileset_window
  64.     if Input.trigger?(Input::B)
  65.       Sound.play_cancel
  66.       @function_window.active = true
  67.       @tileset_window.active = false
  68.     elsif Input.trigger?(Input::C)
  69.       Sound.play_decision
  70.       update_tag
  71.       @tile_window.active = true
  72.       @tileset_window.active = false
  73.       @tile_window.refresh
  74.       case @function_window.index
  75.       when 0
  76.         @tile_window.draw_tile_this("4dir")
  77.       when 1
  78.         @tile_window.draw_tile_this("tags")
  79.       when 2
  80.         @tile_window.draw_tile_this("bush")
  81.       when 3
  82.         @tile_window.draw_tile_this("counter")
  83.       end
  84.     end
  85.     if Input.trigger?(Input::DOWN) or Input.trigger?(Input::UP)
  86.       update_tag
  87.       @tile_window.refresh
  88.     end
  89.   end
  90.   def update_tile_window
  91.     if Input.trigger?(Input::C)
  92.       case @function_window.index
  93.       when 0
  94.         if @tile_window.cannot_set_pass
  95.           Sound.play_buzzer
  96.           return
  97.         else
  98.           Sound.play_decision
  99.           @tile_window.active = false
  100.           @tile_direction = true
  101.         end
  102.       when 2
  103.         if @tile_window.cannot_set_bush
  104.           Sound.play_buzzer
  105.           return
  106.         else
  107.           Sound.play_decision
  108.           i = @tile_window.index
  109.           i += 1 if @tileset_window.index == 0
  110.           @tile_window.set_bush(i, !@tile_window.bush?(i))
  111.           @tile_window.draw_tile_this("bush")
  112.         end
  113.       when 3
  114.         if @tile_window.cannot_set_counter
  115.           Sound.play_buzzer
  116.           return
  117.         else
  118.           Sound.play_decision
  119.           i = @tile_window.index
  120.           i += 1 if @tileset_window.index == 0
  121.           @tile_window.set_counter(i, !@tile_window.counter?(i))
  122.           @tile_window.draw_tile_this("counter")
  123.         end
  124.       end
  125.     end
  126.     if Input.trigger?(Input::B)
  127.       Sound.play_cancel
  128.       @tile_window.active = false
  129.       @tileset_window.active = true
  130.       @tileset_window.refresh
  131.     end
  132.     if (Input.trigger?(Input::X) or Input.trigger?(Input::Y))
  133.       return unless @function_window.index == 1
  134.       if @tile_window.cannot_set_tag
  135.         Sound.play_buzzer
  136.         return
  137.       else
  138.         Sound.play_decision
  139.         @tile_window.tags += 1 if Input.trigger?(Input::Y)
  140.         @tile_window.tags -= 1 if Input.trigger?(Input::X)
  141.         @tile_window.tags %= 8
  142.         @tile_window.draw_tile_this("tags")
  143.       end
  144.     end
  145.   end
  146.   def update_tile_window_directions
  147.     d = Input.dir4
  148.     if Input.trigger?(Input::B)
  149.       Sound.play_cancel
  150.       @tile_window.active = true
  151.       @tile_direction = false
  152.     elsif d != 0
  153.       pass = @tile_window.pass
  154.       d_pass = pass[(d/2)-1]
  155.       case d
  156.       when 2
  157.         @tile_window.pass += d_pass == 0 ? 0b0001 : -0b0001
  158.       when 4
  159.         @tile_window.pass += d_pass == 0 ? 0b0010 : -0b0010
  160.       when 6
  161.         @tile_window.pass += d_pass == 0 ? 0b0100 : -0b0100
  162.       when 8
  163.         @tile_window.pass += d_pass == 0 ? 0b1000 : -0b1000
  164.       end
  165.       x = (@tile_window.index%8) * 32
  166.       y = (@tile_window.index/8) * 32
  167.       @tile_window.draw_tile_4_direction(x, y)
  168.       Graphics.wait(30)
  169.     end
  170.   end
  171.   def output_text
  172.     text_str = ""
  173.     Tile::TILESETS.size.times do |i|
  174.       ltr = Tile::TILESETS[i]
  175.       temp_tag = eval("$tile_#{ltr}_terrain_tag.sort")
  176.       text_str += "
  177. MAP_TILE_#{ltr}=#{temp_tag.inspect}
  178. MAP_TILE_#{ltr}.default = 0
  179. "
  180.     end
  181.     text_file = File.open(Tile::TagDir, "w")
  182.     text_file.write(text_str)
  183.     p "输出完毕"
  184.     exit
  185.   end
  186.   
  187.   def update_tag
  188.     @tile_window.tile_ltr = Tile::TILESETS[@tileset_window.index]
  189.   end
  190.   def terminate
  191.     @function_window.dispose
  192.     @tile_window.dispose
  193.     @tileset_window.dispose
  194.     @help_window.dispose
  195.   end
  196. end
复制代码

作者: Aligatou    时间: 2009-1-31 16:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: 哈根达斯    时间: 2009-1-31 17:44
这个不错,远景再次有望
作者: 紫丞    时间: 2009-1-31 19:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2009-1-31 19:24
脚本更新

加上了范例

范例是完美四方桥
作者: 紫丞    时间: 2009-1-31 19:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2009-2-2 15:41
脚本更新:
    * 2009/2/2
     - 功能增加:自动元件 □ 通行度设定
     - 功能增加:桥元件通行判定
     - 脚本更新:添加了大量默认图块元件的通行度
作者: 木葬枫    时间: 2009-2-2 18:22
果然是求什么来什么- -
作者: 雪流星    时间: 2009-2-2 19:49
以下引用木葬枫于2009-2-2 10:22:26的发言:
果然是求什么来什么- -

http://www.youtube.com/watch?v=Ib0CIfUUcF0

向流星许愿,愿望就会成真 = =!
作者: 沉影不器    时间: 2009-2-5 06:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2009-2-5 10:31
以下引用沉影不器于2009-2-4 22:27:38的发言:
听说vx区有强大的新脚本,八成就是这个了?

不强大不强大
一点也不强大
因为....更强大的在後面{/cy}
作者: smj336521    时间: 2009-2-6 08:52
{/cy}{/cy}都不错 就有一个小问题
步步判断通行度 那个事件里的人物路线图不能自动完成了  必须自己按下走一步
作者: TERENCE    时间: 2009-2-6 09:51
除了有了地形标志以后,
流星姐一直很努力把RM_VX XP化呢。

作者: 雪流星    时间: 2009-2-6 11:19
脚本更新
* 2009/2/5
  - 错误修复:「设置移动路线」会无效的BUG已修复
  - 脚本更新:把 □ 通行度设定为 -0b1111

下次预计更新:编辑器
不过至少要到星期二
未来三天都没空上来了
作者: smj336521    时间: 2009-2-6 11:29
{/cy}{/cy}真是有效率!
作者: 雪流星    时间: 2009-2-13 07:49
脚本更新:
* 2009/2/12
- 功能增加:无法通行处不能触发事件
- 功能增加:加入草木繁茂处、柜台属性的判定跟设定
- 功能增加:通行度等资料存进文件中,设定好了就不会变(除非用编辑器)
- 脚本整合:加入地形标记的设定和判定
- 脚本更新:放出编辑器
作者: cybcaoyibo    时间: 2009-2-14 00:44
那个范例中的桥
从左走到右,再走回左就走不了了,必须先走出桥再回到桥上才能走回去
作者: 雪流星    时间: 2009-2-14 04:34
以下引用cybcaoyibo于2009-2-13 16:44:30的发言:
那个范例中的桥
从左走到右,再走回左就走不了了,必须先走出桥再回到桥上才能走回去

事件设置问题,跟脚本无关
因为只是做个范例而已。所以没有多做判断
作者: ANN244    时间: 2009-8-15 10:58
我在使用新 四方通行脚本 v2.0时已经把「设定部分」的「$重设四方通行文件」 跟 「$重设地形标记文件」改成 true,可是在Data 文件夹里面只生成了TerrainTags.rvdata,没有生成Passage.rvdata、Bush.rvdata、Counter.rvdata...........
作者: zhugoldman    时间: 2010-2-26 11:51
同楼上问……
貌似2.0中重设四方通行文件部分没有执行……




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1