Project1

标题: XP八方向移动+自动绕开障碍整合脚本 [打印本页]

作者: 7408    时间: 2013-7-11 21:51
标题: XP八方向移动+自动绕开障碍整合脚本
本帖最后由 7408 于 2013-7-20 00:24 编辑

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

把这个做成了成品整合了一个绕开障碍的功能,发上来吧。我相信肯定会有人在找这个东东....
  1. #==============================================================================
  2. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  3. #==============================================================================
  4. #==============================================================================
  5. #
  6. # XP版八方向移动及遇到障碍自动转向脚本整合 by 7408,使用和转载请保留此信息
  7. # 效果:实现手感加强的八方向移动,遇到障碍自动绕开
  8. # 使用:将此脚本插入到Main前即可,面对事件不进行自动转向,
  9. #      对于个别需要自动转向的事件,在该事件的第一页
  10. #      第一行写一句注释"not_npc"(不含引号),
  11. #      如不需要自动转向功能请删掉354行到593行的内容(就是保留最后一个end)
  12. #
  13. #==============================================================================
  14. class Game_Player < Game_Character
  15.   #--------------------------------------------------------------------------
  16.   # ● 画面更新
  17.   #--------------------------------------------------------------------------
  18.   def update
  19.     # 本地变量记录移动信息
  20.     last_moving = moving?
  21.     # 移动中、事件执行中、强制移动路线中、
  22.     # 信息窗口一个也不显示的时候
  23.     unless moving? or $game_system.map_interpreter.running? or
  24.            @move_route_forcing or $game_temp.message_window_showing
  25.       # 如果方向键被按下、主角就朝那个方向移动
  26.       case Input.dir8
  27.       when 1
  28.         move_lower_left
  29.       when 2
  30.         move_down
  31.       when 3
  32.         move_lower_right
  33.       when 4
  34.         move_left
  35.       when 6
  36.         move_right
  37.       when 7
  38.         move_upper_left
  39.       when 8
  40.         move_up
  41.       when 9
  42.         move_upper_right
  43.       end

  44.     end
  45.     # 本地变量记忆坐标
  46.     last_real_x = @real_x
  47.     last_real_y = @real_y
  48.     super
  49.     # 角色向下移动、画面上的位置在中央下方的情况下
  50.     if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  51.       # 画面向下卷动
  52.       $game_map.scroll_down(@real_y - last_real_y)
  53.     end
  54.     # 角色向左移动、画面上的位置在中央左方的情况下
  55.     if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  56.       # 画面向左卷动
  57.       $game_map.scroll_left(last_real_x - @real_x)
  58.     end
  59.     # 角色向右移动、画面上的位置在中央右方的情况下
  60.     if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  61.       # 画面向右卷动
  62.       $game_map.scroll_right(@real_x - last_real_x)
  63.     end
  64.     # 角色向上移动、画面上的位置在中央上方的情况下
  65.     if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  66.       # 画面向上卷动
  67.       $game_map.scroll_up(last_real_y - @real_y)
  68.     end
  69.     # 不在移动中的情况下
  70.     unless moving?
  71.       # 上次主角移动中的情况
  72.       if last_moving
  73.         # 与同位置的事件接触就判定为事件启动
  74.         result = check_event_trigger_here([1,2])
  75.         # 没有可以启动的事件的情况下
  76.         if result == false
  77.           # 调试模式为 ON 并且按下 CTRL 键的情况下除外
  78.           unless $DEBUG and Input.press?(Input::CTRL)
  79.             # 遇敌计数下降
  80.             if @encounter_count > 0
  81.               @encounter_count -= 1
  82.             end
  83.           end
  84.         end
  85.       end
  86.       # 按下 C 键的情况下
  87.       if Input.trigger?(Input::C)
  88.         # 判定为同位置以及正面的事件启动
  89.         check_event_trigger_here([0])
  90.         check_event_trigger_there([0,1,2])
  91.       end
  92.     end
  93.   end
  94. end
  95. class Game_Character
  96.   #--------------------------------------------------------------------------
  97.   # ● 向左下移动
  98.   #--------------------------------------------------------------------------
  99.   def move_lower_left
  100.     # 没有固定面向的场合
  101.     unless @direction_fix
  102.       # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  103.       @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
  104.     end
  105.     # 下→左、左→下 的通道可以通行的情况下
  106.     if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
  107.        (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
  108.       # 更新坐标
  109.       @x -= 1
  110.       @y += 1
  111.       # 增加步数
  112.       increase_steps
  113.     # 下→左能够通行的情况下
  114.     elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4))
  115.       # 向下移动后向左移动
  116.       move_down
  117.       move_left
  118.     # 左→下能够通行的情况下
  119.     elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
  120.       # 向左移动后向下移动
  121.       move_left
  122.       move_down
  123.     # 如果移动的对象是角色且非强制移动
  124.     elsif self.is_a?(Game_Player) and not @move_route_forcing
  125.       # 面向左时
  126.       if @direction = 4
  127.         # 左方可以通行时
  128.         if passable?(@x, @y, 4)
  129.           # 向左移动
  130.           move_left
  131.         # 不能通行时
  132.         else
  133.           # 左面接触事件启动
  134.           result = check_event_trigger_touch(@x-1, @y)
  135.           # 没有事件的情况下
  136.           unless result
  137.             # 向下移动
  138.             move_down
  139.           end
  140.         end
  141.       # 不面向左时
  142.       else
  143.         # 下方可以通行时
  144.         if passable?(@x, @y, 2)
  145.           # 向下移动
  146.           move_down
  147.         # 不能通行时
  148.         else
  149.           # 下面接触事件启动
  150.           result = check_event_trigger_touch(@x, @y+1)
  151.           # 没有事件的情况下
  152.           unless result
  153.             # 向左移动
  154.             move_left
  155.           end
  156.         end
  157.       end
  158.     end
  159.   end
  160.   #--------------------------------------------------------------------------
  161.   # ● 向右下移动
  162.   #--------------------------------------------------------------------------
  163.   def move_lower_right
  164.     # 没有固定面向的场合
  165.     unless @direction_fix
  166.       # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  167.       @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
  168.     end
  169.     # 下→右、右→下 的通道可以通行的情况下
  170.     if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or
  171.        (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))
  172.       # 更新坐标
  173.       @x += 1
  174.       @y += 1
  175.       # 增加步数
  176.       increase_steps
  177.     # 下→右能够通行的情况下
  178.     elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6))
  179.       # 向下移动后向右移动
  180.       move_down
  181.       move_right
  182.     # 右→下能够通行的情况下
  183.     elsif (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))
  184.       # 向右移动后向下移动
  185.       move_right
  186.       move_down
  187.     # 如果移动的对象是角色且非强制移动
  188.     elsif self.is_a?(Game_Player) and not @move_route_forcing
  189.       # 面向右时
  190.       if @direction = 6
  191.         # 右方可以通行时
  192.         if passable?(@x, @y, 6)
  193.           # 向右移动
  194.           move_right
  195.         # 不能通行时
  196.         else
  197.           # 右面接触事件启动
  198.           result = check_event_trigger_touch(@x+1, @y)
  199.           # 没有事件的情况下
  200.           unless result
  201.             # 向下移动
  202.             move_down
  203.           end
  204.         end
  205.       # 不面向右时
  206.       else
  207.         # 下方可以通行时
  208.         if passable?(@x, @y, 2)
  209.           # 向下移动
  210.           move_down
  211.         # 不能通行时
  212.         else
  213.           # 下面接触事件启动
  214.           result = check_event_trigger_touch(@x, @y+1)
  215.           # 没有事件的情况下
  216.           unless result
  217.             # 向右移动
  218.             move_right
  219.           end
  220.         end
  221.       end
  222.     end
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ● 向左上移动
  226.   #--------------------------------------------------------------------------
  227.   def move_upper_left
  228.     # 没有固定面向的场合
  229.     unless @direction_fix
  230.       # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  231.       @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
  232.     end
  233.     # 上→左、左→上 的通道可以通行的情况下
  234.     if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or
  235.        (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))
  236.       # 更新坐标
  237.       @x -= 1
  238.       @y -= 1
  239.       # 增加步数
  240.       increase_steps
  241.     # 上→左能够通行的情况下
  242.     elsif (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4))
  243.       # 向上移动后向左移动
  244.       move_up
  245.       move_left
  246.     # 左→上能够通行的情况下
  247.     elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))
  248.       # 向左移动后向上移动
  249.       move_left
  250.       move_up
  251.     # 如果移动的对象是角色且非强制移动
  252.     elsif self.is_a?(Game_Player) and not @move_route_forcing
  253.       # 面向左时
  254.       if @direction = 4
  255.         # 左方可以通行时
  256.         if passable?(@x, @y, 4)
  257.           # 向左移动
  258.           move_left
  259.         # 不能通行时
  260.         else
  261.           # 左面接触事件启动
  262.           result = check_event_trigger_touch(@x-1, @y)
  263.           # 没有事件的情况下
  264.           unless result
  265.             # 向上移动
  266.             move_up
  267.           end
  268.         end
  269.       # 不面向左时
  270.       else
  271.         # 上方可以通行时
  272.         if passable?(@x, @y, 8)
  273.           # 向上移动
  274.           move_up
  275.         # 不能通行时
  276.         else
  277.           # 上面接触事件启动
  278.           result = check_event_trigger_touch(@x, @y-1)
  279.           # 没有事件的情况下
  280.           unless result
  281.             # 向左移动
  282.             move_left
  283.           end
  284.         end
  285.       end
  286.     end
  287.   end
  288.   #--------------------------------------------------------------------------
  289.   # ● 向右上移动
  290.   #--------------------------------------------------------------------------
  291.   def move_upper_right
  292.     # 没有固定面向的场合
  293.     unless @direction_fix
  294.       # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  295.       @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
  296.     end
  297.     # 上→右、右→上 的通道可以通行的情况下
  298.     if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or
  299.        (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))
  300.       # 更新坐标
  301.       @x += 1
  302.       @y -= 1
  303.       # 增加步数
  304.       increase_steps
  305.     # 上→右能够通行的情况下
  306.     elsif (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6))
  307.       # 向上移动后向右移动
  308.       move_up
  309.       move_right
  310.     # 右→上能够通行的情况下
  311.     elsif (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))
  312.       # 向右移动后向上移动
  313.       move_right
  314.       move_up
  315.     # 如果移动的对象是角色且非强制移动
  316.     elsif self.is_a?(Game_Player) and not @move_route_forcing
  317.       # 面向右时
  318.       if @direction = 6
  319.         # 右方可以通行时
  320.         if passable?(@x, @y, 6)
  321.           # 向右移动
  322.           move_right
  323.         # 不能通行时
  324.         else
  325.           # 右面接触事件启动
  326.           result = check_event_trigger_touch(@x+1, @y)
  327.           # 没有事件的情况下
  328.           unless result
  329.             # 向上移动
  330.             move_up
  331.           end
  332.         end
  333.       # 不面向右时
  334.       else
  335.         # 上方可以通行时
  336.         if passable?(@x, @y, 8)
  337.           # 向上移动
  338.           move_up
  339.         # 不能通行时
  340.         else
  341.           # 上面接触事件启动
  342.           result = check_event_trigger_touch(@x, @y-1)
  343.           # 没有事件的情况下
  344.           unless result
  345.             # 向右移动
  346.             move_right
  347.           end
  348.         end
  349.       end
  350.     end
  351.   end
  352.   #--------------------------------------------------------------------------
  353.   # ● 可以通行判定
  354.   #     x : X 坐标
  355.   #     y : Y 坐标
  356.   #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  357.   #--------------------------------------------------------------------------   
  358.   def passable?(x, y, d)
  359.     #---------------------------
  360.     $isnpc = true
  361.     #---------------------------
  362.     # 求得新的坐标
  363.     new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  364.     new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  365.     # 坐标在地图以外的情况
  366.     unless $game_map.valid?(new_x, new_y)
  367.       # 不能通行
  368.       return false
  369.     end
  370.     # 穿透是 ON 的情况下
  371.     if @through
  372.       # 可以通行
  373.       return true
  374.     end
  375.     # 移动者的元件无法来到指定方向的情况下
  376.     unless $game_map.passable?(x, y, d, self)
  377.       # 通行不可
  378.       return false
  379.     end
  380.     # 从指定方向不能进入到移动处的元件的情况下
  381.     unless $game_map.passable?(new_x, new_y, 10 - d)
  382.       # 不能通行
  383.       return false
  384.     end
  385.     # 循环全部事件
  386.     for event in $game_map.events.values
  387.       # 事件坐标于移动目标坐标一致的情况下
  388.       if event.x == new_x and event.y == new_y
  389.         # 穿透为 ON
  390.         unless event.through
  391.           # 自己就是事件的情况下
  392.           if self != $game_player
  393.             # 不能通行
  394.             #---------------------------
  395.             $isnpc = false if event.list[0].parameters[0] != "not_npc"
  396.             #---------------------------
  397.             return false
  398.           end
  399.           # 自己是主角、对方的图形是角色的情况下
  400.           if event.character_name != ""
  401.             # 不能通行
  402.             #---------------------------
  403.             $isnpc = false if event.list[0].parameters[0] != "not_npc"
  404.             #---------------------------
  405.             return false
  406.           end
  407.         end
  408.       end
  409.     end
  410.     # 主角的坐标与移动目标坐标一致的情况下
  411.     if $game_player.x == new_x and $game_player.y == new_y
  412.       # 穿透为 ON
  413.       unless $game_player.through
  414.         # 自己的图形是角色的情况下
  415.         if @character_name != ""
  416.           # 不能通行
  417.           return false
  418.         end
  419.       end
  420.     end
  421.     # 可以通行
  422.     return true
  423.   end
  424.    
  425.   #--------------------------------------------------------------------------
  426.   # ● 向下移动
  427.   #     turn_enabled : 本场地位置更改许可标志
  428.   #--------------------------------------------------------------------------
  429.   def move_down(turn_enabled = true)
  430.     #---------------------------
  431.     direct = @direction
  432.     #---------------------------
  433.     # 面向下
  434.     if turn_enabled
  435.       turn_down
  436.     end
  437.     # 可以通行的场合
  438.     if passable?(@x, @y, 2)
  439.       # 面向下
  440.       turn_down
  441.       # 更新坐标
  442.       @y += 1
  443.       # 增加步数
  444.       increase_steps
  445.     # 不能通行的情况下
  446.     else
  447.       
  448.      #---------------------------  
  449.     if $isnpc
  450.       if passable?(@x, @y, 6) and passable?(@x+1, @y, 2) and passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
  451.         move_left if direct == 4
  452.         move_right if direct == 6
  453.         if direct == 2 or direct == 8
  454.           randtra = rand(2)
  455.           randtra == 0 ? move_left : move_right
  456.         end
  457.       else
  458.         move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
  459.         move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 2)
  460.       end
  461.     end
  462.     #---------------------------
  463.       # 接触事件的启动判定
  464.       check_event_trigger_touch(@x, @y+1)
  465.     end
  466.   end
  467.   #--------------------------------------------------------------------------
  468.   # ● 向左移动
  469.   #     turn_enabled : 本场地位置更改许可标志
  470.   #--------------------------------------------------------------------------
  471.   def move_left(turn_enabled = true)
  472.     #---------------------------
  473.     direct = @direction
  474.     #---------------------------
  475.     # 面向左
  476.     if turn_enabled
  477.       turn_left
  478.     end
  479.     # 可以通行的情况下
  480.     if passable?(@x, @y, 4)
  481.       # 面向左
  482.       turn_left
  483.       # 更新坐标
  484.       @x -= 1
  485.       # 增加步数
  486.       increase_steps
  487.     # 不能通行的情况下
  488.     else
  489.       
  490.       #---------------------------
  491.       if $isnpc
  492.       if passable?(@x, @y, 8) and passable?(@x, @y-1, 4) and passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
  493.         move_up if direct == 8
  494.         move_down if direct == 2
  495.         if direct == 4 or direct == 6
  496.           randtra = rand(2)
  497.           randtra == 0 ? move_up : move_down
  498.         end
  499.       else
  500.         move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 4)
  501.         move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
  502.       end
  503.       end
  504.       #---------------------------
  505.       
  506.       # 接触事件的启动判定
  507.       check_event_trigger_touch(@x-1, @y)
  508.     end
  509.   end
  510.   #--------------------------------------------------------------------------
  511.   # ● 向右移动
  512.   #     turn_enabled : 本场地位置更改许可标志
  513.   #--------------------------------------------------------------------------
  514.   def move_right(turn_enabled = true)
  515.     #---------------------------
  516.     direct = @direction
  517.     #---------------------------
  518.     # 面向右
  519.     if turn_enabled
  520.       turn_right
  521.     end
  522.     # 可以通行的场合
  523.     if passable?(@x, @y, 6)
  524.       # 面向右
  525.       turn_right
  526.       # 更新坐标
  527.       @x += 1
  528.       # 增加部数
  529.       increase_steps
  530.     # 不能通行的情况下
  531.     else
  532.       #---------------------------
  533.       if $isnpc
  534.       if passable?(@x, @y, 8) and passable?(@x, @y-1, 6) and passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
  535.         move_up if direct == 8
  536.         move_down if direct == 2
  537.         if direct == 4 or direct == 6
  538.           randtra = rand(2)
  539.           randtra == 0 ? move_up : move_down
  540.         end
  541.       else
  542.         move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 6)
  543.         move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
  544.       end
  545.       end
  546.       #---------------------------
  547.       # 接触事件的启动判定
  548.       check_event_trigger_touch(@x+1, @y)
  549.     end
  550.   end
  551.   #--------------------------------------------------------------------------
  552.   # ● 向上移动
  553.   #     turn_enabled : 本场地位置更改许可标志
  554.   #--------------------------------------------------------------------------
  555.   def move_up(turn_enabled = true)
  556.     #---------------------------
  557.     direct = @direction
  558.     #---------------------------
  559.     # 面向上
  560.     if turn_enabled
  561.       turn_up
  562.     end
  563.     # 可以通行的情况下
  564.     if passable?(@x, @y, 8)
  565.       # 面向上
  566.       turn_up
  567.       # 更新坐标
  568.       @y -= 1
  569.       # 歩数増加
  570.       increase_steps
  571.     # 不能通行的情况下
  572.     else
  573.       #---------------------------
  574.       if $isnpc
  575.       if passable?(@x, @y, 6) and passable?(@x+1, @y, 8) and passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
  576.         move_left if direct == 4
  577.         move_right if direct == 6
  578.         if direct == 2 or direct == 8
  579.           randtra = rand(2)
  580.           randtra == 0 ? move_left : move_right
  581.         end
  582.       else
  583.         move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
  584.         move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 8)
  585.       end
  586.       end
  587.       #---------------------------
  588.       # 接触事件的启动判定
  589.       check_event_trigger_touch(@x, @y-1)
  590.     end
  591.   end
  592. end
复制代码
貌似复制这个会有数字标号?...给个链接: 八方向 绕开障碍.zip (3.15 KB, 下载次数: 269)

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

范例 范例.zip (203.15 KB, 下载次数: 437)
作者: 你最珍贵    时间: 2013-7-17 15:37
求个范例~
作者: 7408    时间: 2013-7-20 00:25
你最珍贵 发表于 2013-7-17 15:37
求个范例~

好吧...又做了一个范例...
作者: wutou    时间: 2013-8-2 16:47
正是我想要的,感谢啦
作者: 7408    时间: 2013-8-3 11:11
wutou 发表于 2013-8-2 16:47
正是我想要的,感谢啦

不客气啊 - -b
作者: wgr273    时间: 2013-11-3 12:10
感谢楼主,一直在找!,还有就是能不能增加一个鼠标操作的功能!!!
作者: 我在孤岛等你    时间: 2013-11-3 22:46
无图无真相
作者: 龙夫三拳tan    时间: 2017-12-22 20:56
很棒~虽然也大大增加了误操作几率。。。
可惜事件似乎不受用
作者: 黑白无双    时间: 2018-3-10 03:09
感谢楼主分享。
作者: 仙芋    时间: 2019-8-12 00:40
本帖最后由 仙芋 于 2019-8-12 01:30 编辑

剛試了一會, 與人物跟随腳本有衝突, 就是遇到障碍自动绕开之後, 後面跟随的角色會移位了, 跳出隊列 :(


很有用喔 感激!! 之前我還手動自己在地圖弄事件來實現這效果




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1