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

Project1

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

[已经过期] 如何给雪流星版四方通行脚本加一个开关

[复制链接]

Lv2.观梦者

梦石
0
星屑
628
在线时间
2656 小时
注册时间
2010-6-28
帖子
1361

开拓者

跳转到指定楼层
1
发表于 2011-11-27 11:42:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
脚本如下:
  1. class Game_Map
  2.   alias setup_4_passage setup
  3.   def setup(map_id)
  4.     setup_4_passage(map_id)
  5.     #--------------------------------------------------------------------------
  6.     # ★ A 图块元件通行设定
  7.     #--------------------------------------------------------------------------
  8.     @map_id_passage_A = {
  9.       0b1011 => [],      # 左方不可通行
  10.       0b1110 => [],      # 上方不可通行
  11.       0b1101 => [],      # 右方不可通行
  12.       0b0111 => [],      # 下方不可通行

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

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

  23.       # 设定墙壁上方通行度为 □
  24.       0b0000 => ((81..88).to_a + (97..104).to_a + (113..120).to_a),
  25.       0b1111 => []       # 全部可以通行
  26.     }

  27.     #--------------------------------------------------------------------------
  28.     # ★ B 图块元件通行设定
  29.     #--------------------------------------------------------------------------
  30.     @map_id_passage_B = {
  31.       0b1011 => [],      # 左方不可通行
  32.       0b1110 => [],      # 上方不可通行
  33.       0b1101 => [],      # 右方不可通行
  34.       0b0111 => [],      # 下方不可通行

  35.       # 上下通行
  36.       0b1001 => [],
  37.       # 左右通行
  38.       0b0110 => [],
  39.       
  40.       0b1010 => [],      # 右下通行
  41.       0b1100 => [],      # 左下通行
  42.       0b0101 => [],      # 左上通行
  43.       0b0011 => [],      # 右上通行

  44.       0b1000 => [],      # 下方可以通行
  45.       0b0010 => [],      # 右方可以通行
  46.       0b0001 => [],      # 上方可以通行
  47.       0b0100 => [],      # 左方可以通行

  48.       0b0000 => [],      # 全部不可通行
  49.       0b1111 => []       # 全部可以通行
  50.     }
  51.    
  52.     #--------------------------------------------------------------------------
  53.     # ★ C 图块元件通行设定
  54.     #--------------------------------------------------------------------------
  55.     @map_id_passage_C = {
  56.       0b1011 => [],      # 左方不可通行
  57.       0b1110 => [],      # 上方不可通行
  58.       0b1101 => [],      # 右方不可通行
  59.       0b0111 => [],      # 下方不可通行

  60.       0b1001 => [],      # 上下通行
  61.       0b0110 => [],      # 左右通行
  62.       0b1010 => [],      # 右下通行
  63.       0b1100 => [],      # 左下通行
  64.       0b0101 => [],      # 左上通行
  65.       0b0011 => [],      # 右上通行

  66.       0b1000 => [],      # 下方可以通行
  67.       0b0010 => [],      # 右方可以通行
  68.       0b0001 => [],      # 上方可以通行
  69.       0b0100 => [],      # 左方可以通行

  70.       0b0000 => [],      # 全部不可通行
  71.       0b1111 => []       # 全部可以通行
  72.     }
  73.    
  74.     #--------------------------------------------------------------------------
  75.     # ★ D 图块元件通行设定
  76.     #--------------------------------------------------------------------------
  77.     @map_id_passage_D = {
  78.       0b1011 => [],      # 左方不可通行
  79.       0b1110 => [],      # 上方不可通行
  80.       0b1101 => [],      # 右方不可通行
  81.       0b0111 => (8..11).to_a + (88..92).to_a,      # 下方不可通行

  82.       0b1001 => [],      # 上下通行
  83.       0b0110 => [],      # 左右通行
  84.       0b1010 => [],      # 右下通行
  85.       0b1100 => [],      # 左下通行
  86.       0b0101 => [],      # 左上通行
  87.       0b0011 => [],      # 右上通行

  88.       0b1000 => [],      # 下方可以通行
  89.       0b0010 => [],      # 右方可以通行
  90.       0b0001 => [],      # 上方可以通行
  91.       0b0100 => [],      # 左方可以通行

  92.       0b0000 => [],      # 全部不可通行
  93.       0b1111 => []       # 全部可以通行
  94.     }
  95.    
  96.     #--------------------------------------------------------------------------
  97.     # ★ E 图块元件通行设定
  98.     #--------------------------------------------------------------------------
  99.     @map_id_passage_E = {
  100.       0b1011 => [],      # 左方不可通行
  101.       0b1110 => [],      # 上方不可通行
  102.       0b1101 => [],      # 右方不可通行
  103.       0b0111 => [],      # 下方不可通行

  104.       0b1001 => [],      # 上下通行
  105.       0b0110 => [],      # 左右通行
  106.       0b1010 => [],      # 右下通行
  107.       0b1100 => [],      # 左下通行
  108.       0b0101 => [],      # 左上通行
  109.       0b0011 => [],      # 右上通行

  110.       0b1000 => [],      # 下方可以通行
  111.       0b0010 => [],      # 右方可以通行
  112.       0b0001 => [],      # 上方可以通行
  113.       0b0100 => [],      # 左方可以通行

  114.       0b0000 => [],      # 全部不可通行
  115.       0b1111 => []       # 全部可以通行
  116.     }
  117.    
  118.     #--------------------------------------------------------------------------
  119.     # ★ 自动元件通行设定(不可更改)
  120.     #--------------------------------------------------------------------------
  121.     @map_autotile_passage = {
  122.       0b1011 => [0, 1, 2, 3],      # 左方不可通行
  123.       0b1110 => [4, 5, 6, 7],      # 上方不可通行
  124.       0b1101 => [8, 9, 10, 11],    # 右方不可通行
  125.       0b0111 => [12, 13, 14, 15],  # 下方不可通行

  126.       0b1001 => [16],              # 上下通行
  127.       0b0110 => [17],              # 左右通行
  128.       0b1010 => [18, 19],          # 右下通行
  129.       0b1100 => [20, 21],          # 左下通行
  130.       0b0101 => [22, 23],          # 左上通行
  131.       0b0011 => [24, 25],          # 右上通行

  132.       0b1000 => [26],              # 下方可以通行
  133.       0b0010 => [27],              # 右方可以通行
  134.       0b0001 => [28],              # 上方可以通行
  135.       0b0100 => [29],              # 左可以通行

  136.       0b0000 => [30],              # 全部不可通行
  137.       0b1111 => (32..47).entries   # 全部可以通行
  138.     }
  139.   end
  140. end
复制代码
  1. class Game_Map
  2.   #--------------------------------------------------------------------------
  3.   # ● 获取ID
  4.   #--------------------------------------------------------------------------
  5.   def get_tile_id(x, y)
  6.     a = data[x, y, 0]-2000
  7.     map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
  8.     map_tile_id_1 = (data[x, y, 1]-2000) / 48
  9.     map_tile_id_2 = (data[x, y, 2])
  10.          
  11.     map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
  12.     map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
  13.     map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
  14.    
  15.     # 图块 ID 矫正
  16.     map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0
  17.     for event in @events.values
  18.       if event.pos?(x, y) and event.tile_id > 0
  19.         # 若是事件使用地图元件,使用该地图元件的ID
  20.         map_tile_id_2 = event.tile_id
  21.       end
  22.     end
  23.     # 返回 [底层ID, 上层ID]
  24.     return [map_tile_id_0, map_tile_id_2]
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 根据通行设定获取通行度
  28.   #     value : 数值
  29.   #     pas   : 通行度哈希表
  30.   #--------------------------------------------------------------------------
  31.   def get_passage(value, pas)
  32.     for i in pas.keys
  33.       # 找到通行度就返回
  34.       return i if pas[i].include?(value)
  35.     end
  36.     # 找不到设定即返回「全部可以通行」
  37.     return 0b1111
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   # ● 四方向通行判断
  41.   #--------------------------------------------------------------------------
  42.   def passable_dir?(x, y, d)
  43.     # 通行判定优先度:
  44.     #   事件内设定 > 事件元件 > B层 > A层
  45.    
  46.     return false unless passable?(x, y, 0x01)
  47.     id = get_tile_id(x,y)
  48.     case id[1]
  49.     when 0
  50.       # 获取图块A部分的通行度
  51.       passage = get_passage(id[0], @map_id_passage_A) if ( (1..256) === id[0])
  52.       # 是自动元件且通行设定为 □
  53.       if id[0] < 129 and passage == 0b0000
  54.         a = data[x, y, 0]
  55.         passage = get_passage(a%48, @map_autotile_passage)
  56.       end
  57.     when 1..255
  58.       # 获取图块B部分的通行度
  59.       passage = get_passage(id[1], @map_id_passage_B)
  60.     when 256..511
  61.       # 获取图块C部分的通行度
  62.       passage = get_passage(id[1]-256, @map_id_passage_C)
  63.     when 511..767
  64.       # 获取图块D部分的通行度
  65.       passage = get_passage(id[1]-512, @map_id_passage_D)
  66.     when 768..1023
  67.       # 获取图块E部分的通行度
  68.       passage = get_passage(id[1]-768, @map_id_passage_E)
  69.     end
  70.     # 获取事件內的通行设定
  71.     e = $game_map.events_xy(x, y)
  72.     unless e.empty?
  73.       e.size.times{ |i|
  74.         # 一获取通行设定就跳出循环
  75.         if e[i].passage
  76.           passage = e[i].passage
  77.           break
  78.         end
  79.       }
  80.     end
  81.     # 判断桥的通行
  82.     passage = passable_bridge(id[1], x, y, d, passage) if bridge?(passage)
  83.     return (passage[(d/2)-1] == 1)
  84.   end
  85.   #--------------------------------------------------------------------------
  86.   # ● 桥元件通行判断
  87.   #--------------------------------------------------------------------------
  88.   def passable_bridge(id, x, y, d, pas)
  89.     # 不是桥元件就直接返回原通行度
  90.     return pas unless bridge?(pas)
  91.     # 是自动元件的情况返回原通行度
  92.     return pas if get_tile_id(x,y)[0] < 129 and get_tile_id(x,y)[1] == 0
  93.     case d
  94.     when 0
  95.       temp_id = get_tile_id(x,y+1)
  96.       return 0b1111 if temp_id.include?(id)
  97.     end
  98.     return pas
  99.   end
  100.   def bridge?(pas)
  101.     return (pas == 0b1001 or pas == 0b0110)
  102.   end
  103. end

  104. class Game_Character
  105.   #--------------------------------------------------------------------------
  106.   # ● 通行判断
  107.   #--------------------------------------------------------------------------
  108.   def map_passable?(x, y)
  109.     return (map_passable_here?(x, y) and map_passable_there?(x, y, Input.dir4))
  110.   end
  111.   #--------------------------------------------------------------------------
  112.   # ● 本地通行判断
  113.   #--------------------------------------------------------------------------
  114.   def map_passable_here?(x, y)
  115.     return $game_map.passable_dir?(x, y, Input.dir4)
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● 前方通行判断
  119.   #--------------------------------------------------------------------------
  120.   def map_passable_there?(x, y, d_o)
  121.     d = 10 - d_o             # 反向判断
  122.     # 修正座标
  123.     case d
  124.     when 2; y += 1
  125.     when 4; x -= 1
  126.     when 6; x += 1
  127.     when 8; y -= 1
  128.     end
  129.     x = $game_map.round_x(x) # 横向循环校正
  130.     y = $game_map.round_y(y) # 纵向循环校正
  131.     return $game_map.passable_dir?(x, y, d)
  132.   end
  133. end
  134. class Game_Event < Game_Character
  135.   def passage
  136.     return false if @list[0].code != 108 # 第一个指令不是「注释」时返回 false
  137.     pas = @list[0].parameters[0]
  138.     return false if pas !~ /0b\d{4}/     # 如果不是設定通行度就返回 false
  139.     return pas.to_i(2)
  140.   end
  141. end
  142. class Game_Player < Game_Character
  143.   #--------------------------------------------------------------------------
  144.   # ● 通行判断
  145.   #--------------------------------------------------------------------------
  146.   alias passage_4_dir_map_passable? map_passable?
  147.   def map_passable?(x, y)
  148.     # 在交通工具中的話,使用默认脚本
  149.     in_vehicle? ? passage_4_dir_map_passable?(x, y) : super
  150.   end
  151.   #--------------------------------------------------------------------------
  152.   # ● 判斷行走通行度
  153.   #--------------------------------------------------------------------------
  154.   def can_walk?(x, y)
  155.     last_vehicle_type = @vehicle_type   # 移除交通工具類型
  156.     @vehicle_type = -1                  # 暫時設置為行走
  157.     result = passage_4_dir_map_passable?(x, y) # 判斷是否可以通行
  158.     @vehicle_type = last_vehicle_type   # 回復交通工具類型
  159.     return result
  160.   end
  161. end
复制代码
我用了重力系统,发现两个共用时人物在跳的时候会有明显的BUG(如停在空中)。移除四方通行脚本就不会有这个BUG了。但是因为地图的原因不能移除这个脚本,所以想给四方通行加个开关,当打开时这个脚本才生效。请问可以实现吗?谢谢!

                 无从有中来,有从无中生。

Lv2.观梦者

梦石
0
星屑
448
在线时间
628 小时
注册时间
2011-9-27
帖子
3996
2
发表于 2011-11-27 12:45:15 | 只看该作者
本帖最后由 小白玩家 于 2011-11-27 13:06 编辑

事件里的开关,还是按键开关,比如按SHIFT显示小地图?

点评

事件,就是事件里运行某脚本它才起作用。  发表于 2011-11-27 12:54
回复

使用道具 举报

Lv1.梦旅人

星君

梦石
0
星屑
83
在线时间
2980 小时
注册时间
2011-10-9
帖子
2317

贵宾短篇七萝莉正太组冠军

3
发表于 2011-11-27 14:57:27 | 只看该作者
变量:
if $game_variables[ID] == 1
开关:
if $game_switches[ID]
ID就是ID编号,话说谁能告诉我这脚本是干啥的TAT

点评

= =加了end,于是这回测试效果跟没加这段脚本一样了……  发表于 2011-11-27 20:58
T T好吧,thank you all the same.  发表于 2011-11-27 18:30
如果没有这个脚本的话,在VX中人物会直接从山上掉下去……  发表于 2011-11-27 17:58
所谓的四方通行度就是让通行度不再是简单的可以通行或者不可通行,而是比如可以向左通行,或是向右通行等。我用这个主要是用来做山路的。  发表于 2011-11-27 17:57

回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
628
在线时间
2656 小时
注册时间
2010-6-28
帖子
1361

开拓者

4
 楼主| 发表于 2011-11-27 18:02:12 | 只看该作者
皮卡星 发表于 2011-11-27 14:57
变量:
if $game_variables == 1
开关:

= =额,抱歉,我脚本知识实在有限。请问这句加在哪里?另外应该不止这个吧,是不是还要加return什么的……

点评

刚才给的是条件分歧,就是当1号开关打开时的场合,不需要Return 至于加在哪里我也不知道TAT,这脚本看不懂TAT  发表于 2011-11-27 18:11

                 无从有中来,有从无中生。
回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
448
在线时间
628 小时
注册时间
2011-9-27
帖子
3996
5
发表于 2011-11-27 19:13:53 | 只看该作者
我翻遍了加开关的帖子哦,发现开关语句要配合脚本改的,(每个帖子都不一样,囧
对脚本无力,你等脚本大侠帮你吧
回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
628
在线时间
2656 小时
注册时间
2010-6-28
帖子
1361

开拓者

6
 楼主| 发表于 2011-11-27 20:52:16 | 只看该作者
= =翻了几个脚本后,我试了下自己加开关。
在第二个脚本前面加了
  1. module SIFANG
  2. FOURWAY=20
  3. def permit_fourway(enabled = true)
  4.     $game_switches[SIFANG::FOURWAY_SWITCH]= enabled
  5.   end
  6. def fourway_enable?
  7.     return $game_switches[SIFANG::FOURWAY_SWITCH]
  8. end
复制代码
然后最后加上end
结果悲剧了,通行脚本直接无效了,即使我把20号开关打开它还是不鸟我啊悲剧……

点评

FOURWAY=20的这行的下面应该是end吧?毕竟module了……  发表于 2011-11-27 20:55

                 无从有中来,有从无中生。
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
190 小时
注册时间
2011-2-19
帖子
147
7
发表于 2011-11-27 21:25:29 | 只看该作者
话说这个脚本好像还不错,能告诉在下用法吗,做山路和多层地图应该很有用呢。{:nm_4:}

点评

= =请看原贴地址,我不是太会改这个脚本。 http://bbs.66rpg.com/forum.php?mod=viewthread&tid=117072&highlight=%E5%9B%9B%E6%96%B9%E9%80%9A%E8%A1%8C  发表于 2011-11-27 23:04
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-25 10:35

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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