Project1
标题:
【纯脚本+处女作】跨地图寻路导航~
[打印本页]
作者:
fux2
时间:
2010-12-5 13:32
标题:
【纯脚本+处女作】跨地图寻路导航~
本帖最后由 fux2 于 2012-7-1 16:02 编辑
终于独立写出了自己的脚本……
可能有很多BUG,欢迎大家指出.
嘛,有的时候在游戏里走迷宫啊什么的,走错路很蛋疼。
啦啦,这个脚本的通途跟指南针啊,导游啊什么的差不多。
详细说明在脚本的注释里了,看看吧
findwayplus.rar
(216.69 KB, 下载次数: 114)
2012-7-1 16:01 上传
点击文件名下载附件
范例下载3
以下是脚本
# 跨地图寻路 by fux2
# 感谢九夜神尊纠正错误和提供技术支持
# rpg.blue
#
# 喵,说明下用法,在事件脚本里输入:
#
# findway(目标所在地图ID,目标X,目标Y),停止命令stopfindway
#
# 即可出现导航箭头~~照着目标走一般就可以到目的地啦~
# 此脚本只负责找到可以通向目标的地图,途中障碍神马的无法判读(是你懒吧!)
# 还有只能判断常规的事件移动指令,是否需要自动、并行处理事件可以在79行修改
# 需要自动行走的可以自行添加(PIA飞!)
# 箭头图像"Graphics/Arrow/Arrow.png". 197行可以修改
# 喵,欢迎来 http://rpg.blue/?65553 逛逛~
#
#============================================================================
# 当前地图的目标和箭头显示开关
$target = nil
$arrowswitch = false
$getallevent = false
$havefindmapid = [] # 用于记录所有找到的传送事件
#--------------------------------------------------------------------------
# ● 寻找地图类
#--------------------------------------------------------------------------
class SearchMap
#--------------------------------------------------------------------------
# ● 初始化
#--------------------------------------------------------------------------
def initialize
@currentmapid = 1 # 记录当前地图ID
@faildcount = 0 # 寻路失败次数
@realway = [] # 正确的路地图以及事件ID
@havefindmap = [] # realway寻找过的地图
@fakeway = [] # 错误的路地图以及事件ID
@checkways = [] # 用于检查正确的路是否改变
@targetx = 0 # 目标的X坐标
@targety = 0 # 目标的Y坐标
@currrenttargetid = 0 # 记录当前地图的正确传送事件ID
end
#--------------------------------------------------------------------------
# ● 获取当前地图ID
#--------------------------------------------------------------------------
def get_currentmapId
@currentmapid = $game_map.map_id
return @currentmapid
end
#--------------------------------------------------------------------------
# ● 获取最大地图数目
#--------------------------------------------------------------------------
def get_maxmapid
$data_mapinfos = load_data("Data/MapInfos.rxdata")
return $data_mapinfos.size
end
#--------------------------------------------------------------------------
# ● 修改目标地图ID
#--------------------------------------------------------------------------
def targetmapid=(mapid)
@targetmapid = mapid
end
#--------------------------------------------------------------------------
# ● 数组子项是否包含
#--------------------------------------------------------------------------
def included(arr,str)
arr.each do |i|
if i.include?(str)
return true
end
end
return false
end
#--------------------------------------------------------------------------
# ● 找出通行路径与获得传送事件ID
#--------------------------------------------------------------------------
def getway(firsttarget,targetx,targety)
@targetx = targetx
@targety = targety
maxmapid = get_maxmapid
nowmapid = get_currentmapId
target = firsttarget
done = false
while done == false
# 获取全部传送事件
if $getallevent == false
for workcount in 1..maxmapid
temp = load_data(sprintf("Data/Map%03d.rxdata", workcount))
for ev in temp.events.values
for page in ev.pages
for eventline in page.list
# 过滤非传送事件、已寻找过事件、自动、并行处理事件.
if eventline.code == 201 && $havefindmapid.include?([workcount,ev.id,eventline.parameters[1]]) == false && page.trigger != 3 && page.trigger != 4
$havefindmapid.push [workcount,ev.id,eventline.parameters[1]]
end
end
end
end
end
# 打开开关以只搜寻一次所有传送事件
$getallevent = true
else
# 检查所有传送事件是否符合正确的路径
for checkcount in 0..$havefindmapid.size - 1
finded = false
tempcheck = $havefindmapid[checkcount]
tempmapid = target
if tempcheck[2] == tempmapid && @havefindmap.include?(tempcheck[2]) == false && @realway.include?([tempcheck[0],tempcheck[1],tempcheck[2]]) == false && @fakeway.include?([tempcheck[0],tempcheck[1],tempcheck[2]]) == false && finded == false
@realway += [tempcheck]
@havefindmap.push tempcheck[2]
@currrenttargetid = tempcheck[1]
target = tempcheck[0]
finded = true
@faildcount = 0
end
end
# 如果目标就在当前地图(表示找到了~)
if target == nowmapid
done = true
$targetid = @currrenttargetid
$trueway = @realway
$truetarget = @havefindmap
# 如果没有找到目标且真实路径在上一次没有改变
elsif @realway == @checkways
if @faildcount >= 2
done = true
if $tempVariable1 != nil
# 初始化目标
$tempVariable1 = 0
$tempVariable2 = 0
$tempVariable3 = 0
$targetid = nil
$arrowswitch = false
$game_player.move_backward # 为了避免重复对话,后退一步,可以修改
$game_temp.message_text = "目标无法到达."
end
else
# 如果没有找到路径则失败次数加1并且清空目前的正确道路
@faildcount += 1
@fakeway.push @realway[@realway.size - 1]
@realway = []
@havefindmap = []
target = firsttarget
end
else
# 没有找到目标且真实路径改变
@checkways = @realway
end
end
end
end
#--------------------------------------------------------------------------
# ● 当地图更改时更改导航指针
#--------------------------------------------------------------------------
def changeway
check = false
finded = false
nowmapid = get_currentmapId
# 当前地图是否在正确路径列表中
for i in 0..$truetarget.size - 1
if $trueway[i][0] == nowmapid && finded == false
$targetid = $trueway[i][1]
finded = true
end
end
# 如果走出了正确道路则检查是否能返回
if finded == false
for j in 0..$havefindmapid.size - 1
if $havefindmapid[j][0] == nowmapid && included($trueway,$havefindmapid[j][2]) && check == false
$trueway.push $havefindmapid[j]
check = true
end
end
# 如果无法返回则……
if check == false
check = true
Interpreter.new.stopfindway
$game_temp.message_text = "乃偏移了导航并且这里无法返回原来的路."
end
end
end
end
#--------------------------------------------------------------------------
# ● 获取事件内容
#--------------------------------------------------------------------------
class Game_Event < Game_Character
# 获取事件内容
def parameters
return @parameters
end
# 获取运行编号
def code
return @code
end
# 获取触发方式
def trigger
return @trigger
end
end
#--------------------------------------------------------------------------
# ● 在分割定义里增加方法
#--------------------------------------------------------------------------
class Interpreter
# 打开导航
def findway(firsttarget,targetx,targety)
# 如果和上次指定目标一样,则不重新扫描
unless firsttarget == $tempVariable1 or targetx == $tempVariable2 or targety == $tempVariable3
$tempVariable1 = firsttarget
$tempVariable2 = targetx
$tempVariable3 = targety
SearchMap.new.getway($tempVariable1,$tempVariable2,$tempVariable3)
end
$arrowswitch = true
end
# 关闭导航
def stopfindway
$arrowswitch = false
return
end
end
#--------------------------------------------------------------------------
# ● 在地图上描绘箭头的类
#--------------------------------------------------------------------------
class ArrowGuide < Window_Base
def initialize
super(0 , 0, 640, 480)
self.opacity = 0
self.back_opacity = 0
self.contents_opacity = 255
self.contents = Bitmap.new(608, 448)
end
def SetArrow
unless $targetid == nil || $arrowswitch == false || $tempVariable1 == nil
# 获取地图ID以判断地图是否变化
nowmapid = $game_map.map_id
if nowmapid != @id
@id = nowmapid
unless nowmapid == $tempVariable1
SearchMap.new.changeway
end
end
# 开始描绘箭头
self.contents.clear
bitmap = Bitmap.new("Graphics/Arrow/Arrow.png")
src_rect = Rect.new(0, 0, 100, 100)
# 是否在目标位置
unless nowmapid == $tempVariable1 || $game_map.events[$targetid] == nil
x = $game_map.events[$targetid].screen_x
y = $game_map.events[$targetid].screen_y
else
x = ($tempVariable2 * 128 - $game_map.display_x + 3) / 4 + 16
y = ($tempVariable3 * 128 - $game_map.display_y + 3) / 4 + 32
end
# 判断目标位置
if y < 48
sy = 0
elsif y > 464
sy = 416
else
sy = y - 48
end
# 囧
if x < 32
sx = 0
elsif x > 608
sx = 576
else
sx = x - 32
end
self.contents.blt(sx, sy, bitmap, src_rect)
else
self.contents.clear
end
end
end
#--------------------------------------------------------------------------
# ● 在地图上描绘箭头
#--------------------------------------------------------------------------
class Scene_Map
# 不必理解
alias fux2 main
def main
@arrow = ArrowGuide.new
fux2
@arrow.dispose
end
alias fux2update update
def update
@arrow.SetArrow
fux2update
end
end
复制代码
作者:
新坦克君
时间:
2010-12-5 14:30
最后还是在用默认的宝石么
作者:
liqunsz
时间:
2010-12-5 14:39
怪兽君的话…………抢楼先~=v=
作者:
zhixin1997
时间:
2010-12-5 18:05
贵啊…………:L
作者:
px.凤翔九天
时间:
2010-12-6 21:42
哇咧,那个bz推荐不是自己按上去的吧....
而且,啥时候你也开始一句一个“喵”了....
脚本经过我的仔细分析,表示有些地方看不懂,继续修炼去
话说这个真的是你的处女作?你以前干什么去了.....记得你是6r元老级人物之一啊
作者:
逸豫
时间:
2010-12-16 23:16
本帖最后由 逸豫 于 2010-12-16 23:18 编辑
这种搜寻方式……多条道路的话……本来以为要用到最小生成树神马的……
逸豫于2010-12-17 12:37补充以下内容:
TO F2 这样的话不就会造成绕远路么……应该用最小生成树什么的啊喂!
作者:
fux2
时间:
2011-8-24 12:17
传说中的合区后老作品自顶XD
作者:
chd114
时间:
2012-5-19 15:00
好压提示文件损坏
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1