搜索附件  

范例.zip

 

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

把这个做成了成品整合了一个绕开障碍的功能,发上来吧。我相信肯定会有人在找这个东东....
  1. #============================================================================== # 本脚本来自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([1,2])        # 没有可以启动的事件的情况下        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([0])        check_event_trigger_there([0,1,2])      end    end  endendclass 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    end  end  #--------------------------------------------------------------------------  # ● 向右下移动  #--------------------------------------------------------------------------  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    end  end  #--------------------------------------------------------------------------  # ● 向左上移动  #--------------------------------------------------------------------------  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    end  end  #--------------------------------------------------------------------------  # ● 向右上移动  #--------------------------------------------------------------------------  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    end  end  #--------------------------------------------------------------------------   # ● 可以通行判定   #     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[0].parameters[0] != "not_npc"             #---------------------------             return false           end           # 自己是主角、对方的图形是角色的情况下           if event.character_name != ""             # 不能通行             #---------------------------             $isnpc = false if event.list[0].parameters[0] != "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在线咨询功能删除,谢谢。

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

GMT+8, 2024-9-21 08:48 , Processed in 0.038600 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部