Project1
标题: 事件寻路脚本 通行度判断问题 [打印本页]
作者: sky40 时间: 2014-7-8 20:27
标题: 事件寻路脚本 通行度判断问题
本帖最后由 sky40 于 2014-7-8 20:42 编辑
基于八方寻路脚本的 事件寻路功能: 指定事件,从最近节点开始,依次走过目标(x,y)。
第20行的 通行判断应该怎么写(目的是 防止节点上有事件 造成卡死)
# 使用方法 直接调用脚本
# $goto_id = 事件id
# $goto_xy = [[目标x,目标y],[目标x,目标y],[目标x,目标y]...]
# Reset_goto.new
class Reset_goto
def initialize
x = $game_map.events[$goto_id].x
y = $game_map.events[$goto_id].y
@path = []
#移除不可通行的节点
a =[]
for i in 0...$goto_xy.size
xx = $goto_xy[i][0]
yy = $goto_xy[i][1]
if !$game_player.passable?(xx, yy, 4)
a.push $goto_xy[i]
end
end
$goto_xy -= a
if $goto_xy != []
#寻找最近节点
j = (x-$goto_xy[0][0]).abs + (y-$goto_xy[0][1]).abs
k = 0
for i in 1...$goto_xy.size
if j >= (x-$goto_xy[i][0]).abs + (y-$goto_xy[i][1]).abs or j == 0
j = (x-$goto_xy[i][0]).abs + (y-$goto_xy[i][1]).abs
k = i
end
end
#计算预设路线
if j != 0
@path += Find_Path.new.find_short_path(x,y,$goto_xy[k][0],$goto_xy[k][1])
for i in k...$goto_xy.size-1
@path += Find_Path.new.find_short_path($goto_xy[i][0],$goto_xy[i][1],$goto_xy[i+1][0],$goto_xy[i+1][1])
end
end
end
if @path != []
move
end
end
#开始预设路径行走
def move
turns = [nil,5,1,6,2,nil,3,7,4,8]
m = RPG::MoveRoute.new
m.list[0].code = turns[@path[0]]
for i in [email]1...@path.size[/email]
j = turns[@path[i]]
m.list.push(RPG::MoveCommand.new(j))
end
m.list.push(RPG::MoveCommand.new(0))
m.repeat = false
$game_map.events[$goto_id].force_move_route(m)
end
end
# 使用方法 直接调用脚本
# $goto_id = 事件id
# $goto_xy = [[目标x,目标y],[目标x,目标y],[目标x,目标y]...]
# Reset_goto.new
class Reset_goto
def initialize
x = $game_map.events[$goto_id].x
y = $game_map.events[$goto_id].y
@path = []
#移除不可通行的节点
a =[]
for i in 0...$goto_xy.size
xx = $goto_xy[i][0]
yy = $goto_xy[i][1]
if !$game_player.passable?(xx, yy, 4)
a.push $goto_xy[i]
end
end
$goto_xy -= a
if $goto_xy != []
#寻找最近节点
j = (x-$goto_xy[0][0]).abs + (y-$goto_xy[0][1]).abs
k = 0
for i in 1...$goto_xy.size
if j >= (x-$goto_xy[i][0]).abs + (y-$goto_xy[i][1]).abs or j == 0
j = (x-$goto_xy[i][0]).abs + (y-$goto_xy[i][1]).abs
k = i
end
end
#计算预设路线
if j != 0
@path += Find_Path.new.find_short_path(x,y,$goto_xy[k][0],$goto_xy[k][1])
for i in k...$goto_xy.size-1
@path += Find_Path.new.find_short_path($goto_xy[i][0],$goto_xy[i][1],$goto_xy[i+1][0],$goto_xy[i+1][1])
end
end
end
if @path != []
move
end
end
#开始预设路径行走
def move
turns = [nil,5,1,6,2,nil,3,7,4,8]
m = RPG::MoveRoute.new
m.list[0].code = turns[@path[0]]
for i in [email]1...@path.size[/email]
j = turns[@path[i]]
m.list.push(RPG::MoveCommand.new(j))
end
m.list.push(RPG::MoveCommand.new(0))
m.repeat = false
$game_map.events[$goto_id].force_move_route(m)
end
end
作者: batfjtn 时间: 2014-7-8 21:29
本帖最后由 batfjtn 于 2014-7-8 21:33 编辑
在Game_Player`!!
#--------------------------------------------------------------------------
# ● 可以通行判定
# x : X 坐标
# y : Y 坐标
# d : 方向 (0,2,4,6,8) ※ 0 = 全方向不能通行的情况判定 (跳跃用)
#--------------------------------------------------------------------------
def passable?(x, y, d)
# 求得新的坐标
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
# 坐标在地图外的情况下
unless $game_map.valid?(new_x, new_y)
# 不能通行
return false
end
# 调试模式为 ON 并且 按下 CTRL 键的情况下
if $DEBUG and Input.press?(Input::CTRL)
# 可以通行
return true
end
super
end
#--------------------------------------------------------------------------
# ● 可以通行判定
# x : X 坐标
# y : Y 坐标
# d : 方向 (0,2,4,6,8) ※ 0 = 全方向不能通行的情况判定 (跳跃用)
#--------------------------------------------------------------------------
def passable?(x, y, d)
# 求得新的坐标
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
# 坐标在地图外的情况下
unless $game_map.valid?(new_x, new_y)
# 不能通行
return false
end
# 调试模式为 ON 并且 按下 CTRL 键的情况下
if $DEBUG and Input.press?(Input::CTRL)
# 可以通行
return true
end
super
end
这里还有一个判断~~!!!
#--------------------------------------------------------------------------
# ● 越过目标判定 (不能将相同位置作为启动条件)
#--------------------------------------------------------------------------
def over_trigger?
# 图形是角色、没有开启穿透的情况下
if @character_name != "" and not @through
# 启动判定是正面
return false
end
# 地图上的这个位置不能通行的情况下
unless $game_map.passable?(@x, @y, 0)
# 启动判定是正面
return false
end
# 启动判定在同位置
return true
end
#--------------------------------------------------------------------------
# ● 越过目标判定 (不能将相同位置作为启动条件)
#--------------------------------------------------------------------------
def over_trigger?
# 图形是角色、没有开启穿透的情况下
if @character_name != "" and not @through
# 启动判定是正面
return false
end
# 地图上的这个位置不能通行的情况下
unless $game_map.passable?(@x, @y, 0)
# 启动判定是正面
return false
end
# 启动判定在同位置
return true
end
作者: sky40 时间: 2014-7-8 22:01
本帖最后由 sky40 于 2014-7-8 22:40 编辑
batfjtn 发表于 2014-7-8 21:29
在Game_Player`!!
#--------------------------------------------------------------------------
对不起 问题没有描述清楚,主要是两个问题
1, 被其他 “路过的事件” 或者 “主角” 挡住 目标xy的话
那个 八方寻路脚本 就会卡死,所以要移除那个点
2,还有就是 那个目标xy 被事件/主角 围成死路 这时候 八方寻路也会卡死
想要判断 大概一屏幕内 是否 形成死路 这时候也要,移除那个点
按下面的改法,会绕开 能穿透的事件,目标xy被 事件/主角 围死的问题解决不了。
20行改为
再添加
#判断是否存在事件或主角
def passable?(x, y)
if $game_player.x == x and $game_player.y == y
return false
end
for event in $game_map.events.values
if event.x == x and event.y == y
return false
end
end
return true
end
#判断是否存在事件或主角
def passable?(x, y)
if $game_player.x == x and $game_player.y == y
return false
end
for event in $game_map.events.values
if event.x == x and event.y == y
return false
end
end
return true
end
作者: batfjtn 时间: 2014-7-9 00:56
sky40 发表于 2014-7-8 22:01
对不起 问题没有描述清楚,主要是两个问题
1, 被其他 “路过的事件” 或者 “主角” 挡住 目标xy的话
那 ...
直通车:http://rpg.blue/forum.php?mod=viewthread&tid=158088
你可以引用这里的方法~~!!
他是自己创建了个通行判定~~!!
代码:- def fp_passable?(x, y, d, tr_x = -2, tr_y = -2) #开始判定通行
- #return false if (tr_x == @unable_xa or
- ## tr_x == @unable_xb or
- # tr_y == @unable_ya or
- # tr_y == @unable_yb)
- if @character.passable?(x, y, d)
- return true
- else
- return false
- end
- end #结束判定通行
复制代码 添加了判定角色还有事件~~
然后就可以添加了~~!!
可以去参考下~~~!!
作者: batfjtn 时间: 2014-7-9 17:19
@sky40 你思路跑到死角去了~!!
一直想着系统的判断方式~!!
你都在做新的寻路了~
怎么就不自己再重新写一个判断方式~!!
昨天本来是想测试下的~~!!
可惜连你的工程都没有~~!!
想了解都没办法~~!!!
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |