じ☆ve冰风 发表于 2024-4-20 01:07:04

XP八方向移动+自动绕开障碍整合脚本

为什么在主站上找了半天也找不到XP的有手感的八方向脚本,只找到了这个教程...http://www.66rpg.com/articles/3126
而且把那一段完成的放到工程上一走就报错....

把这个做成了成品整合了一个绕开障碍的功能,发上来吧。我相信肯定会有人在找这个东东....#============================================================================== # 本脚本来自www.66RPG.com,使用和转载请保留此信息 #============================================================================== #============================================================================== ## XP版八方向移动及遇到障碍自动转向脚本整合 by 7408,使用和转载请保留此信息 # 效果:实现手感加强的八方向移动,遇到障碍自动绕开# 使用:将此脚本插入到Main前即可,面对事件不进行自动转向,#      对于个别需要自动转向的事件,在该事件的第一页#      第一行写一句注释"not_npc"(不含引号),#      如不需要自动转向功能请删掉354行到593行的内容(就是保留最后一个end)##============================================================================== class Game_Player < Game_Character#--------------------------------------------------------------------------# ● 画面更新#--------------------------------------------------------------------------def update    # 本地变量记录移动信息    last_moving = moving?    # 移动中、事件执行中、强制移动路线中、    # 信息窗口一个也不显示的时候    unless moving? or $game_system.map_interpreter.running? or         @move_route_forcing or $game_temp.message_window_showing      # 如果方向键被按下、主角就朝那个方向移动      case Input.dir8      when 1      move_lower_left      when 2      move_down      when 3      move_lower_right      when 4      move_left      when 6      move_right      when 7      move_upper_left      when 8      move_up      when 9      move_upper_right      end    end    # 本地变量记忆坐标    last_real_x = @real_x    last_real_y = @real_y    super    # 角色向下移动、画面上的位置在中央下方的情况下    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y      # 画面向下卷动      $game_map.scroll_down(@real_y - last_real_y)    end    # 角色向左移动、画面上的位置在中央左方的情况下    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X      # 画面向左卷动      $game_map.scroll_left(last_real_x - @real_x)    end    # 角色向右移动、画面上的位置在中央右方的情况下    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X      # 画面向右卷动      $game_map.scroll_right(@real_x - last_real_x)    end    # 角色向上移动、画面上的位置在中央上方的情况下    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y      # 画面向上卷动      $game_map.scroll_up(last_real_y - @real_y)    end    # 不在移动中的情况下    unless moving?      # 上次主角移动中的情况      if last_moving      # 与同位置的事件接触就判定为事件启动      result = check_event_trigger_here()      # 没有可以启动的事件的情况下      if result == false          # 调试模式为 ON 并且按下 CTRL 键的情况下除外          unless $DEBUG and Input.press?(Input::CTRL)            # 遇敌计数下降            if @encounter_count > 0            @encounter_count -= 1            end          end      end      end      # 按下 C 键的情况下      if Input.trigger?(Input::C)      # 判定为同位置以及正面的事件启动      check_event_trigger_here()      check_event_trigger_there()      end    endendendclass Game_Character#--------------------------------------------------------------------------# ● 向左下移动#--------------------------------------------------------------------------def move_lower_left    # 没有固定面向的场合    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)    end    # 下→左、左→下 的通道可以通行的情况下    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))      # 更新坐标      @x -= 1      @y += 1      # 增加步数      increase_steps    # 下→左能够通行的情况下    elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4))      # 向下移动后向左移动      move_down      move_left    # 左→下能够通行的情况下    elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))      # 向左移动后向下移动      move_left      move_down    # 如果移动的对象是角色且非强制移动    elsif self.is_a?(Game_Player) and not @move_route_forcing      # 面向左时      if @direction = 4      # 左方可以通行时      if passable?(@x, @y, 4)          # 向左移动          move_left      # 不能通行时      else          # 左面接触事件启动          result = check_event_trigger_touch(@x-1, @y)          # 没有事件的情况下          unless result            # 向下移动            move_down          end      end      # 不面向左时      else      # 下方可以通行时      if passable?(@x, @y, 2)          # 向下移动          move_down      # 不能通行时      else          # 下面接触事件启动          result = check_event_trigger_touch(@x, @y+1)          # 没有事件的情况下          unless result            # 向左移动            move_left          end      end      end    endend#--------------------------------------------------------------------------# ● 向右下移动#--------------------------------------------------------------------------def move_lower_right    # 没有固定面向的场合    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面      @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)    end    # 下→右、右→下 的通道可以通行的情况下    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or       (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))      # 更新坐标      @x += 1      @y += 1      # 增加步数      increase_steps    # 下→右能够通行的情况下    elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6))      # 向下移动后向右移动      move_down      move_right    # 右→下能够通行的情况下    elsif (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))      # 向右移动后向下移动      move_right      move_down    # 如果移动的对象是角色且非强制移动    elsif self.is_a?(Game_Player) and not @move_route_forcing      # 面向右时      if @direction = 6      # 右方可以通行时      if passable?(@x, @y, 6)          # 向右移动          move_right      # 不能通行时      else          # 右面接触事件启动          result = check_event_trigger_touch(@x+1, @y)          # 没有事件的情况下          unless result            # 向下移动            move_down          end      end      # 不面向右时      else      # 下方可以通行时      if passable?(@x, @y, 2)          # 向下移动          move_down      # 不能通行时      else          # 下面接触事件启动          result = check_event_trigger_touch(@x, @y+1)          # 没有事件的情况下          unless result            # 向右移动            move_right          end      end      end    endend#--------------------------------------------------------------------------# ● 向左上移动#--------------------------------------------------------------------------def move_upper_left    # 没有固定面向的场合    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面      @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)    end    # 上→左、左→上 的通道可以通行的情况下    if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))      # 更新坐标      @x -= 1      @y -= 1      # 增加步数      increase_steps    # 上→左能够通行的情况下    elsif (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4))      # 向上移动后向左移动      move_up      move_left    # 左→上能够通行的情况下    elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))      # 向左移动后向上移动      move_left      move_up    # 如果移动的对象是角色且非强制移动    elsif self.is_a?(Game_Player) and not @move_route_forcing      # 面向左时      if @direction = 4      # 左方可以通行时      if passable?(@x, @y, 4)          # 向左移动          move_left      # 不能通行时      else          # 左面接触事件启动          result = check_event_trigger_touch(@x-1, @y)          # 没有事件的情况下          unless result            # 向上移动            move_up          end      end      # 不面向左时      else      # 上方可以通行时      if passable?(@x, @y, 8)          # 向上移动          move_up      # 不能通行时      else          # 上面接触事件启动          result = check_event_trigger_touch(@x, @y-1)          # 没有事件的情况下          unless result            # 向左移动            move_left          end      end      end    endend#--------------------------------------------------------------------------# ● 向右上移动#--------------------------------------------------------------------------def move_upper_right    # 没有固定面向的场合    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面      @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)    end    # 上→右、右→上 的通道可以通行的情况下    if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or       (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))      # 更新坐标      @x += 1      @y -= 1      # 增加步数      increase_steps    # 上→右能够通行的情况下    elsif (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6))      # 向上移动后向右移动      move_up      move_right    # 右→上能够通行的情况下    elsif (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))      # 向右移动后向上移动      move_right      move_up    # 如果移动的对象是角色且非强制移动    elsif self.is_a?(Game_Player) and not @move_route_forcing      # 面向右时      if @direction = 6      # 右方可以通行时      if passable?(@x, @y, 6)          # 向右移动          move_right      # 不能通行时      else          # 右面接触事件启动          result = check_event_trigger_touch(@x+1, @y)          # 没有事件的情况下          unless result            # 向上移动            move_up          end      end      # 不面向右时      else      # 上方可以通行时      if passable?(@x, @y, 8)          # 向上移动          move_up      # 不能通行时      else          # 上面接触事件启动          result = check_event_trigger_touch(@x, @y-1)          # 没有事件的情况下          unless result            # 向右移动            move_right          end      end      end    endend#--------------------------------------------------------------------------   # ● 可以通行判定   #   x : X 坐标   #   y : Y 坐标   #   d : 方向 (0,2,4,6,8)※ 0 = 全方向不能通行的情况判定 (跳跃用)   #--------------------------------------------------------------------------   def passable?(x, y, d)   #---------------------------   $isnpc = true   #---------------------------   # 求得新的坐标   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 的情况下   if @through       # 可以通行       return true   end   # 移动者的元件无法来到指定方向的情况下   unless $game_map.passable?(x, y, d, self)       # 通行不可       return false   end   # 从指定方向不能进入到移动处的元件的情况下   unless $game_map.passable?(new_x, new_y, 10 - d)       # 不能通行       return false   end   # 循环全部事件   for event in $game_map.events.values       # 事件坐标于移动目标坐标一致的情况下       if event.x == new_x and event.y == new_y         # 穿透为 ON         unless event.through         # 自己就是事件的情况下         if self != $game_player             # 不能通行             #---------------------------             $isnpc = false if event.list.parameters != "not_npc"             #---------------------------             return false         end         # 自己是主角、对方的图形是角色的情况下         if event.character_name != ""             # 不能通行             #---------------------------             $isnpc = false if event.list.parameters != "not_npc"             #---------------------------             return false         end         end       end   end   # 主角的坐标与移动目标坐标一致的情况下   if $game_player.x == new_x and $game_player.y == new_y       # 穿透为 ON       unless $game_player.through         # 自己的图形是角色的情况下         if @character_name != ""         # 不能通行         return false         end       end   end   # 可以通行   return true   end      #--------------------------------------------------------------------------   # ● 向下移动   #   turn_enabled : 本场地位置更改许可标志   #--------------------------------------------------------------------------   def move_down(turn_enabled = true)   #---------------------------   direct = @direction   #---------------------------   # 面向下   if turn_enabled       turn_down   end   # 可以通行的场合   if passable?(@x, @y, 2)       # 面向下       turn_down       # 更新坐标       @y += 1       # 增加步数       increase_steps   # 不能通行的情况下   else             #---------------------------      if $isnpc       if passable?(@x, @y, 6) and passable?(@x+1, @y, 2) and passable?(@x, @y, 4) and passable?(@x-1, @y, 2)         move_left if direct == 4         move_right if direct == 6         if direct == 2 or direct == 8         randtra = rand(2)         randtra == 0 ? move_left : move_right         end       else         move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 2)         move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 2)       end   end   #---------------------------       # 接触事件的启动判定       check_event_trigger_touch(@x, @y+1)   end   end   #--------------------------------------------------------------------------   # ● 向左移动   #   turn_enabled : 本场地位置更改许可标志   #--------------------------------------------------------------------------   def move_left(turn_enabled = true)   #---------------------------   direct = @direction   #---------------------------   # 面向左   if turn_enabled       turn_left   end   # 可以通行的情况下   if passable?(@x, @y, 4)       # 面向左       turn_left       # 更新坐标       @x -= 1       # 增加步数       increase_steps   # 不能通行的情况下   else            #---------------------------       if $isnpc       if passable?(@x, @y, 8) and passable?(@x, @y-1, 4) and passable?(@x, @y, 2) and passable?(@x, @y+1, 4)         move_up if direct == 8         move_down if direct == 2         if direct == 4 or direct == 6         randtra = rand(2)         randtra == 0 ? move_up : move_down         end       else         move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 4)         move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 4)       end       end       #---------------------------            # 接触事件的启动判定       check_event_trigger_touch(@x-1, @y)   end   end   #--------------------------------------------------------------------------   # ● 向右移动   #   turn_enabled : 本场地位置更改许可标志   #--------------------------------------------------------------------------   def move_right(turn_enabled = true)   #---------------------------   direct = @direction   #---------------------------   # 面向右   if turn_enabled       turn_right   end   # 可以通行的场合   if passable?(@x, @y, 6)       # 面向右       turn_right       # 更新坐标       @x += 1       # 增加部数       increase_steps   # 不能通行的情况下   else       #---------------------------       if $isnpc       if passable?(@x, @y, 8) and passable?(@x, @y-1, 6) and passable?(@x, @y, 2) and passable?(@x, @y+1, 6)         move_up if direct == 8         move_down if direct == 2         if direct == 4 or direct == 6         randtra = rand(2)         randtra == 0 ? move_up : move_down         end       else         move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 6)         move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 6)       end       end       #---------------------------       # 接触事件的启动判定       check_event_trigger_touch(@x+1, @y)   end   end   #--------------------------------------------------------------------------   # ● 向上移动   #   turn_enabled : 本场地位置更改许可标志   #--------------------------------------------------------------------------   def move_up(turn_enabled = true)   #---------------------------   direct = @direction   #---------------------------   # 面向上   if turn_enabled       turn_up   end   # 可以通行的情况下   if passable?(@x, @y, 8)       # 面向上       turn_up       # 更新坐标       @y -= 1       # 歩数増加       increase_steps   # 不能通行的情况下   else       #---------------------------       if $isnpc       if passable?(@x, @y, 6) and passable?(@x+1, @y, 8) and passable?(@x, @y, 4) and passable?(@x-1, @y, 8)         move_left if direct == 4         move_right if direct == 6         if direct == 2 or direct == 8         randtra = rand(2)         randtra == 0 ? move_left : move_right         end       else         move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 8)         move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 8)       end       end       #---------------------------       # 接触事件的启动判定       check_event_trigger_touch(@x, @y-1)   end   end end复制代码貌似复制这个会有数字标号?...给个链接:

百度网盘的链接 http://pan.baidu.com/share/link?shareid=2037218928&uk=4247755149

范例
            本帖来自P1论坛作者7408,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=320265若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: XP八方向移动+自动绕开障碍整合脚本