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

Project1

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

[已经过期] 追逐战所需的A寻路脚本的问题

[复制链接]

Lv4.逐梦者

梦石
0
星屑
5340
在线时间
1258 小时
注册时间
2017-11-13
帖子
84
跳转到指定楼层
1
发表于 2019-6-3 21:28:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 喵了个咪、叽 于 2019-6-3 21:37 编辑

请问如何使用A寻路脚本做出   敌人接近主角   速度一致的情况下   敌人每过几帧就加速前进一小步 的紧迫感
                                                                       事件更改速度 或则 前进一小步 都试过了会卡停

RUBY 代码复制
  1. =begin
  2. ■移動ルート機能ぱわーあっぷ RGSS2 DAIpage■ v0.6
  3.  
  4. ●機能と使い方●
  5.  移動ルートの設定に
  6.   ・最短距離移動(障害物も考慮)
  7.   ・指定エリア内ランダム移動(マップ機能のエリアを使用)
  8.  などを追加します。
  9.  また、移動タイプが「ランダム」でトリガーが「決定ボタン」、プライオリティが
  10.  「通常キャラと同じ」のイベントがプレイヤーに押されていると、
  11.  押された方向に動きます。町中など、狭いところでプレイヤーの通行を邪魔している
  12.  場合などに使えます。
  13.  
  14.  移動ルートの設定、または自律移動の「カスタム」内のスクリプトで指定します。
  15.  
  16. 【指定位置に向けて最短移動ルートで一歩移動】
  17.  ※ x, yに目標座標を指定。
  18.  
  19.   target_p_move_auto(x, y)
  20.  
  21. 【指定エリア内ランダム移動】お前ここから出てくるなって時に。
  22.  ※ idでエリアを指定。
  23.  
  24.   move_type_area_random(id)
  25.  
  26. 【指定キャラクターに近づく】
  27.  ※ idに目標キャラクターIDを指定。0でプレイヤー。
  28.  
  29.   target_c_move_auto(id)
  30.  
  31.  
  32. 【通行可能な限り前進、通行不可でランダムに方向転換】
  33.  
  34.   search_front
  35.  
  36.  
  37. ●再定義している箇所●
  38.   Game_Character、Game_Playerをエイリアス。
  39.  
  40.  ※同じ箇所を変更するスクリプトと併用した場合は競合する可能性があります。
  41.  
  42. ●参考●
  43. このスクリプトの一部の機能は以下のサイト様のものを参考にVX用に再構築しております。
  44.  
  45. RPGツクールシステム研究室
  46. [url]http://suppy1632.hp.infoseek.co.jp/[/url]
  47.  
  48. =end
  49. #============================================================================
  50. # カスタマイズポイント
  51. #============================================================================
  52. module DAI_Move
  53.  
  54.   # 指定位置へ最短距離移動時の再計算間隔歩数。
  55.   # 少ないほど精度は高いが重くなる。
  56.   P = 2
  57.  
  58.   # ランダム移動イベントがプレイヤーから遠ざかる機能を使用。
  59.   E = true
  60.  
  61. end
  62.  
  63. #==============================================================================
  64. # ■ Game_Character
  65. #==============================================================================
  66. class Game_Character
  67.   #--------------------------------------------------------------------------
  68.   # ● 公開インスタンス変数
  69.   #--------------------------------------------------------------------------
  70.   attr_reader   :move_type
  71.   attr_reader   :stop_count
  72.   attr_reader   :move_frequency
  73.   #--------------------------------------------------------------------------
  74.   # ● 目的地までの最短経路を作成
  75.   #--------------------------------------------------------------------------
  76.   def search_route(target_x, target_y, type = 0)
  77.     @route_count = 0
  78.     @target_route = []
  79.     return false if target_x == @x and target_y == @y
  80.     @openlist = [@x * 1000 + @y, target_x * 1000 + target_y]
  81.     @closelist = {@x * 1000 + @y=>0, target_x * 1000 + target_y=>1}
  82.     @lootlist = [[],[]]
  83.     @pointer = 0
  84.     while @pointer < @openlist.length
  85.       for i in 1..4
  86.         a = way(i)
  87.         b = @openlist[@pointer]
  88.         c = @lootlist[@pointer]
  89.         if @closelist.include?(a)
  90.           if @closelist[a] != @closelist[b]
  91.             if @closelist[a] == 0
  92.               half_route = c
  93.               half_route.push 5 - i
  94.               perfect_route = @lootlist[@openlist.index(a)]
  95.             else
  96.               half_route = @lootlist[@openlist.index(a)]
  97.               perfect_route = c
  98.               perfect_route.push i
  99.             end
  100.             half_route.reverse!
  101.             perfect_route += half_route
  102.             @target_route = perfect_route
  103.             return @target_route
  104.           end
  105.         else
  106.           if type == 0
  107.             newloot(a, b, c, i) if dir_passable?(b / 1000, b % 1000, i * 2)
  108.           else
  109.             newloot(a, b, c, i) if dir_e_passable?(b / 1000, b % 1000, i * 2)
  110.           end
  111.         end
  112.       end
  113.       @pointer += 1
  114.     end
  115.     return false
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● 座標変換
  119.   #--------------------------------------------------------------------------
  120.   def way(i)
  121.     case i
  122.     when 1 ; a = @openlist[@pointer] + 1
  123.     when 2 ; a = @openlist[@pointer] - 1000
  124.     when 3 ; a = @openlist[@pointer] + 1000
  125.     when 4 ; a = @openlist[@pointer] - 1
  126.     end
  127.     return a
  128.   end
  129.   #--------------------------------------------------------------------------
  130.   # ● 経路追加
  131.   #--------------------------------------------------------------------------
  132.   def newloot(a, b, c, i)
  133.     @openlist.push a
  134.     @closelist[a] = @closelist[b]
  135.     loot = c.dup
  136.     if @closelist[a] == 0
  137.       loot.push i
  138.     else
  139.       loot.push 5 - i
  140.     end
  141.     @lootlist.push loot
  142.   end
  143.   #--------------------------------------------------------------------------
  144.   # ● 指定座標から指定方向への通行可能判定
  145.   #--------------------------------------------------------------------------
  146.   def dir_passable?(x, y, d)
  147.     case d
  148.     when 2 ; a = m_passable?(x, y + 1, d)
  149.     when 4 ; a = m_passable?(x - 1, y, d)
  150.     when 6 ; a = m_passable?(x + 1, y, d)
  151.     when 8 ; a = m_passable?(x, y - 1, d)
  152.     end
  153.     return a
  154.   end
  155.   #--------------------------------------------------------------------------
  156.   # ● キャラクターとの衝突を考えない指定方向への通行可能判定
  157.   #--------------------------------------------------------------------------
  158.   def dir_e_passable?(x, y, d)
  159.     case d
  160.     when 2 ; a = e_passable?(x, y + 1, d)
  161.     when 4 ; a = e_passable?(x - 1, y, d)
  162.     when 6 ; a = e_passable?(x + 1, y, d)
  163.     when 8 ; a = e_passable?(x, y - 1, d)
  164.     end
  165.     return a
  166.   end
  167.   #--------------------------------------------------------------------------
  168.   # ● 通行可能判定
  169.   #     x : X 座標
  170.   #     y : Y 座標
  171.   #--------------------------------------------------------------------------
  172.  
  173.   def m_passable?(x, y, d)
  174.     x = $game_map.round_x(x)                        # 横方向ループ補正
  175.     y = $game_map.round_y(y)                        # 縦方向ループ補正
  176.     org_x = x
  177.     org_y = y
  178.     case d
  179.     when 2 ; org_y -= 1
  180.     when 4 ; org_x +=1
  181.     when 6 ; org_x -= 1
  182.     when 8 ; org_y += 1
  183.     end   
  184.     return false unless $game_map.valid?(x, y)      # マップ外?
  185.     return true if @through or debug_through?       # すり抜け ON?
  186.     return false unless map_passable?(x, y, d)         # マップが通行不能?
  187.     return false if collide_with_characters?(x, y)  # キャラクターに衝突?
  188.     return true                                     # 通行可
  189.   end
  190.   #--------------------------------------------------------------------------
  191.   # ● キャラクターとの衝突を考えない通行可能判定
  192.   #--------------------------------------------------------------------------
  193.   def e_passable?(x, y, d)
  194.     x = $game_map.round_x(x)
  195.     y = $game_map.round_y(y)   
  196.     org_x = x
  197.     org_y = y
  198.     case d
  199.     when 2 ; org_y -= 1
  200.     when 4 ; org_x +=1
  201.     when 6 ; org_x -= 1
  202.     when 8 ; org_y += 1
  203.     end
  204.     return false unless $game_map.valid?(x, y)
  205.     return true if @through or debug_through?
  206.     return false unless map_passable?(x, y, d)
  207.     return true
  208.   end
  209.   #--------------------------------------------------------------------------
  210.   # ● 最短移動ルートの配列に従い移動(イベントコマンド:スクリプト専用)
  211.   #--------------------------------------------------------------------------
  212.   def target_route_move(x, y)
  213.     if search_route(x, y, 0) == false
  214.       search_route(x, y, 1)
  215.     else
  216.       search_route(x, y)
  217.     end
  218.     move_route = RPG::MoveRoute.new
  219.     for i in 0...@target_route.length
  220.       move_route.list[i] = RPG::MoveCommand.new
  221.       move_route.list[i].code = @target_route[i]
  222.       move_route.wait = true
  223.     end
  224.     force_move_route(move_route)
  225.     @target_route = []
  226.     return
  227.   end
  228.   #--------------------------------------------------------------------------
  229.   # ● 最短移動ルートの配列に従い一歩だけ移動(移動ルートの指定専用)
  230.   #--------------------------------------------------------------------------
  231.   def target_p_move_auto(x, y)
  232.     if @route_count == DAI_Move::P or @target_route == nil
  233.       if search_route(x, y, 0) == false
  234.         search_route(x, y, 1)
  235.       else
  236.         search_route(x, y)
  237.       end
  238.     end
  239.     move_straight(@target_route[@route_count] * 2) if @target_route[@route_count]
  240.     @route_count += 1
  241.     return
  242.   end
  243.   #--------------------------------------------------------------------------
  244.   # ● 指定キャラクターに近づく(移動ルートの指定専用)
  245.   #--------------------------------------------------------------------------
  246.   def target_c_move_auto(id)
  247.     if id == 0
  248.       target = $game_player
  249.     else
  250.       target = $game_map.events[id]
  251.     end
  252.     return if target == nil
  253.     target_p_move_auto(target.x, target.y)
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # ● 通行可能な限り前進、通行不可でランダムに方向転換
  257.   #--------------------------------------------------------------------------
  258.   def search_front
  259.     unless moving?
  260.       if dir_passable?(@x, @y, @direction)
  261.         move_forward
  262.       else
  263.         turn_random
  264.       end
  265.     end
  266.   end
  267.   #--------------------------------------------------------------------------
  268.   # ● 移動タイプ : エリア内ランダム
  269.   #--------------------------------------------------------------------------
  270.   def move_type_area_random(id)
  271.     case rand(6)
  272.     when 0..1;  move_area_random(id)
  273.     when 2..4;  move_forward if dir_passable_in_area?(@direction, id)
  274.     when 5;     @stop_count = 0
  275.     end
  276.   end
  277.   #--------------------------------------------------------------------------
  278.   # ● エリア内をランダムに移動
  279.   #--------------------------------------------------------------------------
  280.   def move_area_random(id)
  281.     a = in_area_passable?(id)
  282.     return if a.empty?
  283.     b = rand(a.size)
  284.     move_straight(a[b])
  285.   end
  286.   #--------------------------------------------------------------------------
  287.   # ● エリア内の通行可能な方向を取得
  288.   #--------------------------------------------------------------------------
  289.   def in_area_passable?(id)
  290.     a = []
  291.     a.push 2 if dir_passable_in_area?(2, id)
  292.     a.push 4 if dir_passable_in_area?(4, id)
  293.     a.push 6 if dir_passable_in_area?(6, id)
  294.     a.push 8 if dir_passable_in_area?(8, id)
  295.     return a
  296.   end
  297.   #--------------------------------------------------------------------------
  298.   # ● 指定方向がエリア内で通行可能か?
  299.   #--------------------------------------------------------------------------
  300.   def dir_passable_in_area?(d, id)
  301.     case d
  302.     when 2
  303.       return $game_map.in_area?(id, @x, @y + 1) && dir_passable?(@x, @y, 2)
  304.     when 4
  305.       return $game_map.in_area?(id, @x - 1, @y) && dir_passable?(@x, @y, 4)
  306.     when 6
  307.       return $game_map.in_area?(id, @x + 1, @y) && dir_passable?(@x, @y, 4)
  308.     when 8
  309.       return $game_map.in_area?(id, @x, @y - 1) && dir_passable?(@x, @y, 8)
  310.     end
  311.   end
  312. end
  313. class Game_Event < Game_Character
  314.   #--------------------------------------------------------------------------
  315.   # ● 移動タイプ : カスタム
  316.   #--------------------------------------------------------------------------
  317.   alias dai_custom_move_move_type_custom move_type_custom
  318.   def move_type_custom
  319.     return if @move_route.list[@move_route_index] == nil
  320.     dai_custom_move_move_type_custom
  321.   end
  322. end
  323. #==============================================================================
  324. # ■ Game_Player
  325. #==============================================================================
  326. class Game_Player < Game_Character
  327.   #--------------------------------------------------------------------------
  328.   # ● 接触イベントの起動判定
  329.   #--------------------------------------------------------------------------
  330.   alias dai_custom_move_check_event_trigger_touch check_event_trigger_touch
  331.   def check_event_trigger_touch(x, y)
  332.     for event in $game_map.events_xy(x, y)
  333.       if event.trigger == 0 && event.priority_type == 1 && DAI_Move::E &&
  334.       event.move_type == 1 && event.stop_count > 30 * (4 - event.move_frequency)
  335.         event.move_away_from_player
  336.       end
  337.     end
  338.     dai_custom_move_check_event_trigger_touch(x, y)
  339.   end
  340. end
  341. #==============================================================================
  342. # ■ Game_Map
  343. #==============================================================================
  344. class Game_Map
  345.   #--------------------------------------------------------------------------
  346.   # ● エリア内判定
  347.   #--------------------------------------------------------------------------
  348.   def in_area?(id, x, y)
  349.     area = $data_areas[id]
  350.     return false if area == nil
  351.     return false if $game_map.map_id != area.map_id
  352.     return false if x < area.rect.x
  353.     return false if y < area.rect.y
  354.     return false if x >= area.rect.x + area.rect.width
  355.     return false if y >= area.rect.y + area.rect.height
  356.     return true
  357.   end
  358. end
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-11-16 18:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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