搜索附件  
同能RPG制作大师 附件中心 同能RM技术讨论区 RPG Maker XP 讨论区 【纯脚本+处女作】跨地图寻路导航~: d1.gif

【纯脚本+处女作】跨地图寻路导航~: d1.gif

 

【纯脚本+处女作】跨地图寻路导航~:
终于独立写出了自己的脚本……
可能有很多BUG,欢迎大家指出.

嘛,有的时候在游戏里走迷宫啊什么的,走错路很蛋疼。
啦啦,这个脚本的通途跟指南针啊,导游啊什么的差不多。
详细说明在脚本的注释里了,看看吧

范例下载3
以下是脚本
  1. # 跨地图寻路 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  endend  #--------------------------------------------------------------------------  # ● 获取事件内容  #--------------------------------------------------------------------------class Game_Event < Game_Character  # 获取事件内容  def parameters    return @parameters  end  # 获取运行编号  def code    return @code  end  # 获取触发方式  def trigger    return @trigger  endend  #--------------------------------------------------------------------------  # ● 在分割定义里增加方法  #--------------------------------------------------------------------------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  endend  #--------------------------------------------------------------------------  # ● 在地图上描绘箭头的类  #--------------------------------------------------------------------------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  endend  #--------------------------------------------------------------------------  # ● 在地图上描绘箭头  #--------------------------------------------------------------------------class Scene_Map  # 不必理解  alias fux2 main  def main    @arrow = ArrowGuide.new    fux2    @arrow.dispose  end    alias fux2update update  def update    @arrow.SetArrow    fux2update  endend复制代码
复制代码
             本帖来自P1论坛作者新坦克君,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=162496  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
【纯脚本+处女作】跨地图寻路导航~: d1.gif

QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

GMT+8, 2024-9-21 16:31 , Processed in 0.040400 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部