Project1
标题:
如何给雪流星版四方通行脚本加一个开关
[打印本页]
作者:
我的米呀
时间:
2011-11-27 11:42
标题:
如何给雪流星版四方通行脚本加一个开关
脚本如下:
class Game_Map
alias setup_4_passage setup
def setup(map_id)
setup_4_passage(map_id)
#--------------------------------------------------------------------------
# ★ A 图块元件通行设定
#--------------------------------------------------------------------------
@map_id_passage_A = {
0b1011 => [], # 左方不可通行
0b1110 => [], # 上方不可通行
0b1101 => [], # 右方不可通行
0b0111 => [], # 下方不可通行
0b1001 => [134, 135, 142, 143] + (193..208).to_a, # 上下通行
0b0110 => [], # 左右通行
0b1010 => [], # 右下通行
0b1100 => [], # 左下通行
0b0101 => [], # 左上通行
0b0011 => [], # 右上通行
0b1000 => [], # 下方可以通行
0b0010 => [], # 右方可以通行
0b0001 => [], # 上方可以通行
0b0100 => [], # 左方可以通行
# 设定墙壁上方通行度为 □
0b0000 => ((81..88).to_a + (97..104).to_a + (113..120).to_a),
0b1111 => [] # 全部可以通行
}
#--------------------------------------------------------------------------
# ★ B 图块元件通行设定
#--------------------------------------------------------------------------
@map_id_passage_B = {
0b1011 => [], # 左方不可通行
0b1110 => [], # 上方不可通行
0b1101 => [], # 右方不可通行
0b0111 => [], # 下方不可通行
# 上下通行
0b1001 => [],
# 左右通行
0b0110 => [],
0b1010 => [], # 右下通行
0b1100 => [], # 左下通行
0b0101 => [], # 左上通行
0b0011 => [], # 右上通行
0b1000 => [], # 下方可以通行
0b0010 => [], # 右方可以通行
0b0001 => [], # 上方可以通行
0b0100 => [], # 左方可以通行
0b0000 => [], # 全部不可通行
0b1111 => [] # 全部可以通行
}
#--------------------------------------------------------------------------
# ★ C 图块元件通行设定
#--------------------------------------------------------------------------
@map_id_passage_C = {
0b1011 => [], # 左方不可通行
0b1110 => [], # 上方不可通行
0b1101 => [], # 右方不可通行
0b0111 => [], # 下方不可通行
0b1001 => [], # 上下通行
0b0110 => [], # 左右通行
0b1010 => [], # 右下通行
0b1100 => [], # 左下通行
0b0101 => [], # 左上通行
0b0011 => [], # 右上通行
0b1000 => [], # 下方可以通行
0b0010 => [], # 右方可以通行
0b0001 => [], # 上方可以通行
0b0100 => [], # 左方可以通行
0b0000 => [], # 全部不可通行
0b1111 => [] # 全部可以通行
}
#--------------------------------------------------------------------------
# ★ D 图块元件通行设定
#--------------------------------------------------------------------------
@map_id_passage_D = {
0b1011 => [], # 左方不可通行
0b1110 => [], # 上方不可通行
0b1101 => [], # 右方不可通行
0b0111 => (8..11).to_a + (88..92).to_a, # 下方不可通行
0b1001 => [], # 上下通行
0b0110 => [], # 左右通行
0b1010 => [], # 右下通行
0b1100 => [], # 左下通行
0b0101 => [], # 左上通行
0b0011 => [], # 右上通行
0b1000 => [], # 下方可以通行
0b0010 => [], # 右方可以通行
0b0001 => [], # 上方可以通行
0b0100 => [], # 左方可以通行
0b0000 => [], # 全部不可通行
0b1111 => [] # 全部可以通行
}
#--------------------------------------------------------------------------
# ★ E 图块元件通行设定
#--------------------------------------------------------------------------
@map_id_passage_E = {
0b1011 => [], # 左方不可通行
0b1110 => [], # 上方不可通行
0b1101 => [], # 右方不可通行
0b0111 => [], # 下方不可通行
0b1001 => [], # 上下通行
0b0110 => [], # 左右通行
0b1010 => [], # 右下通行
0b1100 => [], # 左下通行
0b0101 => [], # 左上通行
0b0011 => [], # 右上通行
0b1000 => [], # 下方可以通行
0b0010 => [], # 右方可以通行
0b0001 => [], # 上方可以通行
0b0100 => [], # 左方可以通行
0b0000 => [], # 全部不可通行
0b1111 => [] # 全部可以通行
}
#--------------------------------------------------------------------------
# ★ 自动元件通行设定(不可更改)
#--------------------------------------------------------------------------
@map_autotile_passage = {
0b1011 => [0, 1, 2, 3], # 左方不可通行
0b1110 => [4, 5, 6, 7], # 上方不可通行
0b1101 => [8, 9, 10, 11], # 右方不可通行
0b0111 => [12, 13, 14, 15], # 下方不可通行
0b1001 => [16], # 上下通行
0b0110 => [17], # 左右通行
0b1010 => [18, 19], # 右下通行
0b1100 => [20, 21], # 左下通行
0b0101 => [22, 23], # 左上通行
0b0011 => [24, 25], # 右上通行
0b1000 => [26], # 下方可以通行
0b0010 => [27], # 右方可以通行
0b0001 => [28], # 上方可以通行
0b0100 => [29], # 左可以通行
0b0000 => [30], # 全部不可通行
0b1111 => (32..47).entries # 全部可以通行
}
end
end
复制代码
class Game_Map
#--------------------------------------------------------------------------
# ● 获取ID
#--------------------------------------------------------------------------
def get_tile_id(x, y)
a = data[x, y, 0]-2000
map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
map_tile_id_1 = (data[x, y, 1]-2000) / 48
map_tile_id_2 = (data[x, y, 2])
map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
# 图块 ID 矫正
map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0
for event in @events.values
if event.pos?(x, y) and event.tile_id > 0
# 若是事件使用地图元件,使用该地图元件的ID
map_tile_id_2 = event.tile_id
end
end
# 返回 [底层ID, 上层ID]
return [map_tile_id_0, map_tile_id_2]
end
#--------------------------------------------------------------------------
# ● 根据通行设定获取通行度
# value : 数值
# pas : 通行度哈希表
#--------------------------------------------------------------------------
def get_passage(value, pas)
for i in pas.keys
# 找到通行度就返回
return i if pas[i].include?(value)
end
# 找不到设定即返回「全部可以通行」
return 0b1111
end
#--------------------------------------------------------------------------
# ● 四方向通行判断
#--------------------------------------------------------------------------
def passable_dir?(x, y, d)
# 通行判定优先度:
# 事件内设定 > 事件元件 > B层 > A层
return false unless passable?(x, y, 0x01)
id = get_tile_id(x,y)
case id[1]
when 0
# 获取图块A部分的通行度
passage = get_passage(id[0], @map_id_passage_A) if ( (1..256) === id[0])
# 是自动元件且通行设定为 □
if id[0] < 129 and passage == 0b0000
a = data[x, y, 0]
passage = get_passage(a%48, @map_autotile_passage)
end
when 1..255
# 获取图块B部分的通行度
passage = get_passage(id[1], @map_id_passage_B)
when 256..511
# 获取图块C部分的通行度
passage = get_passage(id[1]-256, @map_id_passage_C)
when 511..767
# 获取图块D部分的通行度
passage = get_passage(id[1]-512, @map_id_passage_D)
when 768..1023
# 获取图块E部分的通行度
passage = get_passage(id[1]-768, @map_id_passage_E)
end
# 获取事件內的通行设定
e = $game_map.events_xy(x, y)
unless e.empty?
e.size.times{ |i|
# 一获取通行设定就跳出循环
if e[i].passage
passage = e[i].passage
break
end
}
end
# 判断桥的通行
passage = passable_bridge(id[1], x, y, d, passage) if bridge?(passage)
return (passage[(d/2)-1] == 1)
end
#--------------------------------------------------------------------------
# ● 桥元件通行判断
#--------------------------------------------------------------------------
def passable_bridge(id, x, y, d, pas)
# 不是桥元件就直接返回原通行度
return pas unless bridge?(pas)
# 是自动元件的情况返回原通行度
return pas if get_tile_id(x,y)[0] < 129 and get_tile_id(x,y)[1] == 0
case d
when 0
temp_id = get_tile_id(x,y+1)
return 0b1111 if temp_id.include?(id)
end
return pas
end
def bridge?(pas)
return (pas == 0b1001 or pas == 0b0110)
end
end
class Game_Character
#--------------------------------------------------------------------------
# ● 通行判断
#--------------------------------------------------------------------------
def map_passable?(x, y)
return (map_passable_here?(x, y) and map_passable_there?(x, y, Input.dir4))
end
#--------------------------------------------------------------------------
# ● 本地通行判断
#--------------------------------------------------------------------------
def map_passable_here?(x, y)
return $game_map.passable_dir?(x, y, Input.dir4)
end
#--------------------------------------------------------------------------
# ● 前方通行判断
#--------------------------------------------------------------------------
def map_passable_there?(x, y, d_o)
d = 10 - d_o # 反向判断
# 修正座标
case d
when 2; y += 1
when 4; x -= 1
when 6; x += 1
when 8; y -= 1
end
x = $game_map.round_x(x) # 横向循环校正
y = $game_map.round_y(y) # 纵向循环校正
return $game_map.passable_dir?(x, y, d)
end
end
class Game_Event < Game_Character
def passage
return false if @list[0].code != 108 # 第一个指令不是「注释」时返回 false
pas = @list[0].parameters[0]
return false if pas !~ /0b\d{4}/ # 如果不是設定通行度就返回 false
return pas.to_i(2)
end
end
class Game_Player < Game_Character
#--------------------------------------------------------------------------
# ● 通行判断
#--------------------------------------------------------------------------
alias passage_4_dir_map_passable? map_passable?
def map_passable?(x, y)
# 在交通工具中的話,使用默认脚本
in_vehicle? ? passage_4_dir_map_passable?(x, y) : super
end
#--------------------------------------------------------------------------
# ● 判斷行走通行度
#--------------------------------------------------------------------------
def can_walk?(x, y)
last_vehicle_type = @vehicle_type # 移除交通工具類型
@vehicle_type = -1 # 暫時設置為行走
result = passage_4_dir_map_passable?(x, y) # 判斷是否可以通行
@vehicle_type = last_vehicle_type # 回復交通工具類型
return result
end
end
复制代码
我用了重力系统,发现两个共用时人物在跳的时候会有明显的BUG(如停在空中)。移除四方通行脚本就不会有这个BUG了。但是因为地图的原因不能移除这个脚本,所以想给四方通行加个开关,当打开时这个脚本才生效。请问可以实现吗?谢谢! dsu_plus_rewardpost_czw
作者:
小白玩家
时间:
2011-11-27 12:45
本帖最后由 小白玩家 于 2011-11-27 13:06 编辑
事件里的开关,还是按键开关,比如按SHIFT显示小地图?
作者:
皮卡星
时间:
2011-11-27 14:57
变量:
if $game_variables[ID] == 1
开关:
if $game_switches[ID]
ID就是ID编号,话说谁能告诉我这脚本是干啥的TAT
作者:
我的米呀
时间:
2011-11-27 18:02
皮卡星 发表于 2011-11-27 14:57
变量:
if $game_variables == 1
开关:
= =额,抱歉,我脚本知识实在有限。请问这句加在哪里?另外应该不止这个吧,是不是还要加return什么的……
作者:
小白玩家
时间:
2011-11-27 19:13
我翻遍了加开关的帖子哦,发现开关语句要配合脚本改的,(每个帖子都不一样,囧
对脚本无力,你等脚本大侠帮你吧
作者:
我的米呀
时间:
2011-11-27 20:52
= =翻了几个脚本后,我试了下自己加开关。
在第二个脚本前面加了
module SIFANG
FOURWAY=20
def permit_fourway(enabled = true)
$game_switches[SIFANG::FOURWAY_SWITCH]= enabled
end
def fourway_enable?
return $game_switches[SIFANG::FOURWAY_SWITCH]
end
复制代码
然后最后加上end
结果悲剧了,通行脚本直接无效了,即使我把20号开关打开它还是不鸟我啊悲剧……
作者:
空の翼
时间:
2011-11-27 21:25
话说这个脚本好像还不错,能告诉在下用法吗,做山路和多层地图应该很有用呢。{:nm_4:}
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1