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

Project1

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

[原创发布] 【纯脚本+处女作】跨地图寻路导航~

[复制链接]

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42339
在线时间
7598 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

跳转到指定楼层
1
发表于 2010-12-5 13:32:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 fux2 于 2012-7-1 16:02 编辑

终于独立写出了自己的脚本……
可能有很多BUG,欢迎大家指出.

嘛,有的时候在游戏里走迷宫啊什么的,走错路很蛋疼。
啦啦,这个脚本的通途跟指南针啊,导游啊什么的差不多。
详细说明在脚本的注释里了,看看吧
findwayplus.rar (216.69 KB, 下载次数: 114)
范例下载3
以下是脚本
  1. # 跨地图寻路 by fux2
  2. # 感谢九夜神尊纠正错误和提供技术支持
  3. # rpg.blue
  4. #
  5. # 喵,说明下用法,在事件脚本里输入:
  6. #
  7. # findway(目标所在地图ID,目标X,目标Y),停止命令stopfindway
  8. #
  9. # 即可出现导航箭头~~照着目标走一般就可以到目的地啦~
  10. # 此脚本只负责找到可以通向目标的地图,途中障碍神马的无法判读(是你懒吧!)
  11. # 还有只能判断常规的事件移动指令,是否需要自动、并行处理事件可以在79行修改
  12. # 需要自动行走的可以自行添加(PIA飞!)
  13. # 箭头图像"Graphics/Arrow/Arrow.png".  197行可以修改
  14. # 喵,欢迎来 http://rpg.blue/?65553 逛逛~
  15. #
  16. #============================================================================

  17. # 当前地图的目标和箭头显示开关
  18. $target = nil   
  19. $arrowswitch = false
  20. $getallevent = false
  21. $havefindmapid = []                 # 用于记录所有找到的传送事件
  22.   #--------------------------------------------------------------------------
  23.   # ● 寻找地图类
  24.   #--------------------------------------------------------------------------
  25. class SearchMap
  26.   #--------------------------------------------------------------------------
  27.   # ● 初始化
  28.   #--------------------------------------------------------------------------
  29.   def initialize
  30.     @currentmapid = 1                   # 记录当前地图ID
  31.     @faildcount = 0                     # 寻路失败次数
  32.     @realway = []                       # 正确的路地图以及事件ID
  33.     @havefindmap = []                   # realway寻找过的地图
  34.     @fakeway = []                       # 错误的路地图以及事件ID
  35.     @checkways = []                     # 用于检查正确的路是否改变
  36.     @targetx = 0                        # 目标的X坐标
  37.     @targety = 0                        # 目标的Y坐标
  38.     @currrenttargetid = 0               # 记录当前地图的正确传送事件ID
  39.   end
  40.   #--------------------------------------------------------------------------
  41.   # ● 获取当前地图ID
  42.   #--------------------------------------------------------------------------
  43.   def get_currentmapId
  44.     @currentmapid = $game_map.map_id
  45.     return @currentmapid
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 获取最大地图数目
  49.   #--------------------------------------------------------------------------
  50.   def get_maxmapid
  51.     $data_mapinfos = load_data("Data/MapInfos.rxdata")
  52.     return $data_mapinfos.size
  53.   end
  54.   #--------------------------------------------------------------------------
  55.   # ● 修改目标地图ID
  56.   #--------------------------------------------------------------------------
  57.   def targetmapid=(mapid)
  58.     @targetmapid = mapid
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ● 数组子项是否包含
  62.   #--------------------------------------------------------------------------
  63.   def included(arr,str)
  64.     arr.each do |i|
  65.       if i.include?(str)
  66.         return true
  67.       end
  68.     end
  69.     return false
  70.   end
  71.   #--------------------------------------------------------------------------
  72.   # ● 找出通行路径与获得传送事件ID
  73.   #--------------------------------------------------------------------------
  74.   def getway(firsttarget,targetx,targety)
  75.     @targetx = targetx
  76.     @targety = targety
  77.     maxmapid = get_maxmapid
  78.     nowmapid = get_currentmapId
  79.     target = firsttarget
  80.     done = false
  81.     while done == false
  82.     # 获取全部传送事件
  83.       if $getallevent == false
  84.         for workcount in 1..maxmapid
  85.           temp = load_data(sprintf("Data/Map%03d.rxdata", workcount))
  86.           for ev in temp.events.values
  87.             for page in ev.pages
  88.               for eventline in page.list
  89.                 # 过滤非传送事件、已寻找过事件、自动、并行处理事件.
  90.                 if eventline.code == 201 && $havefindmapid.include?([workcount,ev.id,eventline.parameters[1]]) == false && page.trigger != 3 && page.trigger != 4
  91.                   $havefindmapid.push [workcount,ev.id,eventline.parameters[1]]
  92.                 end
  93.               end
  94.             end
  95.           end
  96.         end
  97.         # 打开开关以只搜寻一次所有传送事件
  98.         $getallevent = true
  99.       else
  100.         # 检查所有传送事件是否符合正确的路径
  101.         for checkcount in 0..$havefindmapid.size - 1
  102.           finded = false
  103.           tempcheck = $havefindmapid[checkcount]
  104.           tempmapid = target
  105.           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
  106.             @realway += [tempcheck]
  107.             @havefindmap.push tempcheck[2]
  108.             @currrenttargetid = tempcheck[1]
  109.             target = tempcheck[0]
  110.             finded = true
  111.             @faildcount = 0
  112.           end
  113.         end
  114.         # 如果目标就在当前地图(表示找到了~)
  115.         if target == nowmapid
  116.           done = true
  117.           $targetid = @currrenttargetid
  118.           $trueway = @realway
  119.           $truetarget = @havefindmap
  120.         # 如果没有找到目标且真实路径在上一次没有改变
  121.         elsif @realway == @checkways
  122.           if @faildcount >= 2
  123.             done = true
  124.             if $tempVariable1 != nil
  125.               # 初始化目标
  126.               $tempVariable1 = 0
  127.               $tempVariable2 = 0
  128.               $tempVariable3 = 0
  129.               $targetid = nil
  130.               $arrowswitch = false
  131.               $game_player.move_backward    # 为了避免重复对话,后退一步,可以修改
  132.               $game_temp.message_text = "目标无法到达."
  133.             end
  134.           else
  135.             # 如果没有找到路径则失败次数加1并且清空目前的正确道路
  136.             @faildcount += 1
  137.             @fakeway.push @realway[@realway.size - 1]
  138.             @realway = []
  139.             @havefindmap = []
  140.             target = firsttarget
  141.           end
  142.         else
  143.         # 没有找到目标且真实路径改变
  144.           @checkways = @realway
  145.         end
  146.       end
  147.     end
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # ● 当地图更改时更改导航指针
  151.   #--------------------------------------------------------------------------
  152.   def changeway
  153.     check = false
  154.     finded = false
  155.     nowmapid = get_currentmapId
  156.     # 当前地图是否在正确路径列表中
  157.     for i in 0..$truetarget.size - 1
  158.       if $trueway[i][0] == nowmapid && finded == false
  159.         $targetid = $trueway[i][1]
  160.         finded = true
  161.       end
  162.     end
  163.     # 如果走出了正确道路则检查是否能返回
  164.     if finded == false
  165.       for j in 0..$havefindmapid.size - 1
  166.         if $havefindmapid[j][0] == nowmapid && included($trueway,$havefindmapid[j][2]) && check == false
  167.           $trueway.push $havefindmapid[j]
  168.           check = true
  169.         end
  170.       end
  171.       # 如果无法返回则……
  172.       if check == false
  173.         check = true
  174.         Interpreter.new.stopfindway
  175.         $game_temp.message_text = "乃偏移了导航并且这里无法返回原来的路."
  176.       end
  177.     end
  178.   end

  179. end
  180.   #--------------------------------------------------------------------------
  181.   # ● 获取事件内容
  182.   #--------------------------------------------------------------------------
  183. class Game_Event < Game_Character
  184.   # 获取事件内容
  185.   def parameters
  186.     return @parameters
  187.   end
  188.   # 获取运行编号
  189.   def code
  190.     return @code
  191.   end
  192.   # 获取触发方式
  193.   def trigger
  194.     return @trigger
  195.   end
  196. end
  197.   #--------------------------------------------------------------------------
  198.   # ● 在分割定义里增加方法
  199.   #--------------------------------------------------------------------------
  200. class Interpreter
  201.   # 打开导航
  202.   def findway(firsttarget,targetx,targety)
  203.     # 如果和上次指定目标一样,则不重新扫描
  204.     unless firsttarget == $tempVariable1 or targetx == $tempVariable2 or targety == $tempVariable3
  205.       $tempVariable1 = firsttarget
  206.       $tempVariable2 = targetx
  207.       $tempVariable3 = targety
  208.       SearchMap.new.getway($tempVariable1,$tempVariable2,$tempVariable3)
  209.     end
  210.     $arrowswitch = true
  211.   end
  212.   
  213.   # 关闭导航
  214.   def stopfindway
  215.     $arrowswitch = false
  216.     return
  217.   end
  218. end


  219.   #--------------------------------------------------------------------------
  220.   # ● 在地图上描绘箭头的类
  221.   #--------------------------------------------------------------------------
  222. class ArrowGuide < Window_Base
  223.   def initialize
  224.   super(0 , 0, 640, 480)
  225.     self.opacity = 0
  226.     self.back_opacity = 0
  227.     self.contents_opacity = 255
  228.     self.contents = Bitmap.new(608, 448)
  229.   end
  230.   
  231.   def SetArrow   
  232.     unless $targetid == nil || $arrowswitch == false || $tempVariable1 == nil
  233.       # 获取地图ID以判断地图是否变化
  234.       nowmapid = $game_map.map_id
  235.       if nowmapid != @id
  236.         @id = nowmapid
  237.         unless nowmapid == $tempVariable1
  238.           SearchMap.new.changeway
  239.         end
  240.       end      
  241.       # 开始描绘箭头
  242.       self.contents.clear
  243.       bitmap = Bitmap.new("Graphics/Arrow/Arrow.png")
  244.       src_rect = Rect.new(0, 0, 100, 100)
  245.       # 是否在目标位置
  246.       unless nowmapid == $tempVariable1 || $game_map.events[$targetid] == nil
  247.         x = $game_map.events[$targetid].screen_x
  248.         y = $game_map.events[$targetid].screen_y
  249.       else
  250.         x = ($tempVariable2 * 128 - $game_map.display_x + 3) / 4 + 16
  251.         y = ($tempVariable3 * 128 - $game_map.display_y + 3) / 4 + 32
  252.       end
  253.         # 判断目标位置
  254.         if y < 48
  255.           sy = 0
  256.         elsif y > 464
  257.           sy = 416
  258.         else
  259.           sy = y - 48
  260.         end
  261.         # 囧
  262.         if x < 32
  263.           sx = 0
  264.         elsif x > 608
  265.           sx = 576
  266.         else
  267.           sx = x - 32
  268.         end
  269.       self.contents.blt(sx, sy, bitmap, src_rect)
  270.     else
  271.       self.contents.clear
  272.     end
  273.   end
  274. end

  275.   #--------------------------------------------------------------------------
  276.   # ● 在地图上描绘箭头
  277.   #--------------------------------------------------------------------------
  278. class Scene_Map
  279.   # 不必理解
  280.   alias fux2 main
  281.   def main
  282.     @arrow = ArrowGuide.new
  283.     fux2
  284.     @arrow.dispose
  285.   end
  286.   
  287.   alias fux2update update
  288.   def update
  289.     @arrow.SetArrow
  290.     fux2update
  291.   end
  292. end
复制代码

点评

265行怎么回事!  发表于 2011-4-16 11:22
事实上我也是脚本无能= =于是开始观摩~  发表于 2010-12-11 21:00
为啥我下载不能T_T  发表于 2010-12-5 18:12
已修复  发表于 2010-12-5 14:32
为什么我只能下载个error.php- -  发表于 2010-12-5 13:40

评分

参与人数 5星屑 +758 收起 理由
冰舞蝶恋 + 40 下载不能....= =不过咱不用XP 哈。.
烁灵 + 6 哇套了好多for 0.0
后知后觉 + 700 辛苦你了
874609281 + 6 韩星的怪物会脚本...顶
px.凤翔九天 + 6 不错,微薄之力支持一下

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托

Lv1.梦旅人

掉在

梦石
0
星屑
49
在线时间
158 小时
注册时间
2010-8-16
帖子
549
2
发表于 2010-12-5 14:30:00 | 只看该作者
最后还是在用默认的宝石么

点评

囧啊个囧,美工无能啊  发表于 2010-12-5 14:37
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
398
在线时间
972 小时
注册时间
2007-12-31
帖子
2137
3
发表于 2010-12-5 14:39:45 | 只看该作者
怪兽君的话…………抢楼先~=v=

点评

跨省什么的最欢乐了~  发表于 2010-12-6 15:20
“天上闪耀着你的死兆星”  发表于 2010-12-5 14:45
怪兽君最喜欢了~!LS的那个最讨厌了~!  发表于 2010-12-5 14:43
^3^ 空格君~  发表于 2010-12-5 14:42
回复 支持 反对

使用道具 举报

Lv1.梦旅人

反伸手党斗士

梦石
0
星屑
91
在线时间
1128 小时
注册时间
2009-9-10
帖子
2513

贵宾

4
发表于 2010-12-5 18:05:21 | 只看该作者
贵啊…………:L

点评

。。。。。。。。。。 说酱油贵吗....  发表于 2010-12-6 21:40
回复 支持 反对

使用道具 举报

Lv2.观梦者

铃铃塔的守护者

梦石
0
星屑
626
在线时间
961 小时
注册时间
2010-10-24
帖子
2768

贵宾

5
发表于 2010-12-6 21:42:54 | 只看该作者
哇咧,那个bz推荐不是自己按上去的吧....
而且,啥时候你也开始一句一个“喵”了....
脚本经过我的仔细分析,表示有些地方看不懂,继续修炼去
话说这个真的是你的处女作?你以前干什么去了.....记得你是6r元老级人物之一啊

点评

不是吗..一直当做元老来崇拜的...  发表于 2010-12-6 22:25
???韩星人何时变元老了?  发表于 2010-12-6 22:17

魔法麻将独立游戏制作中,欢迎热情的测试员与UI设计师合作开发~
回复 支持 反对

使用道具 举报

Lv3.寻梦者

宛若

梦石
0
星屑
1568
在线时间
526 小时
注册时间
2007-8-19
帖子
1493

极短24参与开拓者

6
发表于 2010-12-16 23:16:58 | 只看该作者
本帖最后由 逸豫 于 2010-12-16 23:18 编辑

这种搜寻方式……多条道路的话……本来以为要用到最小生成树神马的……


逸豫于2010-12-17 12:37补充以下内容:
TO F2 这样的话不就会造成绕远路么……应该用最小生成树什么的啊喂!

点评

为了节省资源于是没有继续搜寻所有可以道路了。XD  发表于 2010-12-17 10:19
[url=http://rpg.blue/thread-219730-1-1.html]http://unhero.sinaapp.com/wi.php[/url]
[color=Red]如你所见这是个死坑,没错这就是打我的脸用的[/color]
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42339
在线时间
7598 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

7
 楼主| 发表于 2011-8-24 12:17:22 | 只看该作者
传说中的合区后老作品自顶XD
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

8
发表于 2012-5-19 15:00:52 | 只看该作者
好压提示文件损坏
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-14 15:01

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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