Project1

标题: 有关事件自寻路的脚本 [打印本页]

作者: 樱花の眼泪    时间: 2014-7-28 17:48
标题: 有关事件自寻路的脚本
我想问下,RPG vx 怎样做追人的事件?就是像魔女之家那种boss会追人的事件,不会乱乱跑而是对准主角的位置追来
我爬了文,下载来看看,可是都开不到,出现这个对话框

有没有大大可以发个较新的档案借我参考参考啊?(偶不是故意要当伸手党的→_→)

谢谢了~

155922rgynry444yy7t82t.jpg (16.43 KB, 下载次数: 23)

155922rgynry444yy7t82t.jpg

作者: 白鬼    时间: 2014-7-28 18:43
虽然我用XP的
但是事件设置中,难道没有一个是 靠近角色 的移动方式吗?
作者: 宸小紫    时间: 2014-7-28 20:24
本帖最后由 宸小紫 于 2014-7-28 20:36 编辑

翻译的时候有用到谷歌翻译。。。所以你就将就一下吧。。。
  1. =begin
  2. ■移动路线强化功能 RGSS2 DAIpage■ v0.6
  3. 脚本来源:魔女之家   汉化:宸小紫

  4. ●如何使用功能●
  5.  移动路线的设置
  6.   ・最短距离移动(考虑障碍物)
  7.   ・指定区域内随机移动(使用地图的区域功能)
  8.  额外功能的追加。
  9.  还可以使用在,移动类型“随机”,触发按钮为“确定键”,优先级
  10.   “与普通角色相同”的事件,受到玩家阻挡,或改变方向移动。街道
  11.   等狭窄的地方,通行受玩家的干扰的时候使用。
  12.   
  13.   移动路线的设定可以通过在移动路线的“自定义”中通过脚本设定

  14. 【以最短移动路线的顺序移动一步】
  15.  ※ 指定目标坐标x,y。

  16.   target_p_move_auto(x, y)
  17.   
  18. 【指定区域内随机移动】当你离开区域的时候。
  19.  ※ id为指定区域id。

  20.   move_type_area_random(id)
  21.   
  22. 【接近指定事件】
  23.  ※ 指定id为目标事件的ID。玩家为0。

  24.   target_c_move_auto(id)

  25.   
  26. 【可以通行的情况下前进,否则向随机方向转换】

  27.   search_front

  28.   
  29. ●重新定义的地方●
  30.   设定Game_Player为Game_Character的别名。

  31.  ※可能会和改变相同位置的脚本冲突

  32. ●参考●
  33. 这个脚本的一些功能,参考以下网址并重新编写
  34. RPGツクールシステム研究室
  35. http://suppy1632.hp.infoseek.co.jp/

  36. =end
  37. #============================================================================
  38. # 自定义点
  39. #============================================================================
  40. module DAI_Move
  41.   
  42.   # 以最短距离移动到指定位置再次计算的间隔歩数。
  43.   # 数字越大精确度越低。
  44.   P = 2
  45.   
  46.   # 随机移动的事件向玩家远离的功能。
  47.   E = true
  48.   
  49. end

  50. #==============================================================================
  51. # ■ Game_Character
  52. #==============================================================================
  53. class Game_Character
  54.   #--------------------------------------------------------------------------
  55.   # ● 公共实例变量
  56.   #--------------------------------------------------------------------------
  57.   attr_reader   :move_type
  58.   attr_reader   :stop_count
  59.   attr_reader   :move_frequency
  60.   #--------------------------------------------------------------------------
  61.   # ● 创建到目的地的最短路线
  62.   #--------------------------------------------------------------------------
  63.   def search_route(target_x, target_y, type = 0)
  64.     @route_count = 0
  65.     @target_route = []
  66.     return false if target_x == @x and target_y == @y
  67.     @openlist = [@x * 1000 + @y, target_x * 1000 + target_y]
  68.     @closelist = {@x * 1000 + @y=>0, target_x * 1000 + target_y=>1}
  69.     @lootlist = [[],[]]
  70.     [url=home.php?mod=space&uid=83309]@pointer[/url] = 0
  71.     while [url=home.php?mod=space&uid=83309]@pointer[/url] < @openlist.length
  72.       for i in 1..4
  73.         a = way(i)
  74.         b = @openlist[@pointer]
  75.         c = @lootlist[@pointer]
  76.         if @closelist.include?(a)
  77.           if @closelist[a] != @closelist[b]
  78.             if @closelist[a] == 0
  79.               half_route = c
  80.               half_route.push 5 - i
  81.               perfect_route = @lootlist[@openlist.index(a)]
  82.             else
  83.               half_route = @lootlist[@openlist.index(a)]
  84.               perfect_route = c
  85.               perfect_route.push i
  86.             end
  87.             half_route.reverse!
  88.             perfect_route += half_route
  89.             @target_route = perfect_route
  90.             return @target_route
  91.           end
  92.         else
  93.           if type == 0
  94.             newloot(a, b, c, i) if dir_passable?(b / 1000, b % 1000, i * 2)
  95.           else
  96.             newloot(a, b, c, i) if dir_e_passable?(b / 1000, b % 1000, i * 2)
  97.           end
  98.         end
  99.       end
  100.       @pointer += 1
  101.     end
  102.     return false
  103.   end
  104.   #--------------------------------------------------------------------------
  105.   # ● 坐标变换
  106.   #--------------------------------------------------------------------------
  107.   def way(i)
  108.     case i
  109.     when 1 ; a = @openlist[@pointer] + 1
  110.     when 2 ; a = @openlist[@pointer] - 1000
  111.     when 3 ; a = @openlist[@pointer] + 1000
  112.     when 4 ; a = @openlist[@pointer] - 1
  113.     end
  114.     return a
  115.   end
  116.   #--------------------------------------------------------------------------
  117.   # ● 新增路线
  118.   #--------------------------------------------------------------------------
  119.   def newloot(a, b, c, i)
  120.     @openlist.push a
  121.     @closelist[a] = @closelist[b]
  122.     loot = c.dup
  123.     if @closelist[a] == 0
  124.       loot.push i
  125.     else
  126.       loot.push 5 - i
  127.     end
  128.     @lootlist.push loot
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 判断能否从指定坐标向指定方向通行
  132.   #--------------------------------------------------------------------------
  133.   def dir_passable?(x, y, d)
  134.     case d
  135.     when 2 ; a = passable?(x, y + 1)
  136.     when 4 ; a = passable?(x - 1, y)
  137.     when 6 ; a = passable?(x + 1, y)
  138.     when 8 ; a = passable?(x, y - 1)
  139.     end
  140.     return a
  141.   end
  142.   #--------------------------------------------------------------------------
  143.   # ● 不考虑单位碰撞时指定方向通行可能的判定
  144.   #--------------------------------------------------------------------------
  145.   def dir_e_passable?(x, y, d)
  146.     case d
  147.     when 2 ; a = e_passable?(x, y + 1)
  148.     when 4 ; a = e_passable?(x - 1, y)
  149.     when 6 ; a = e_passable?(x + 1, y)
  150.     when 8 ; a = e_passable?(x, y - 1)
  151.     end
  152.     return a
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # ● 不考虑单位碰撞时通行可能的判定
  156.   #--------------------------------------------------------------------------
  157.   def e_passable?(x, y)
  158.     x = $game_map.round_x(x)
  159.     y = $game_map.round_y(y)
  160.     return false unless $game_map.valid?(x, y)
  161.     return true if @through or debug_through?
  162.     return false unless map_passable?(x, y)
  163.     return true
  164.   end
  165.   #--------------------------------------------------------------------------
  166.   # ● 根据最短移动路线的顺序移动(事件命令:仅限脚本)
  167.   #--------------------------------------------------------------------------
  168.   def target_route_move(x, y)
  169.     if search_route(x, y, 0) == false
  170.       search_route(x, y, 1)
  171.     else
  172.       search_route(x, y)
  173.     end
  174.     move_route = RPG::MoveRoute.new
  175.     for i in 0...@target_route.length
  176.       move_route.list[i] = RPG::MoveCommand.new
  177.       move_route.list[i].code = @target_route[i]
  178.     end
  179.     force_move_route(move_route)
  180.     @target_route = []
  181.     return
  182.   end
  183.   #--------------------------------------------------------------------------
  184.   # ● 以最短移动路线的顺序移动一步(指定移动路线专用)
  185.   #--------------------------------------------------------------------------
  186.   def target_p_move_auto(x, y)
  187.     if @route_count == DAI_Move::P or @target_route == nil
  188.       if search_route(x, y, 0) == false
  189.         search_route(x, y, 1)
  190.       else
  191.         search_route(x, y)
  192.       end
  193.     end
  194.     case @target_route[@route_count]
  195.     when 1 ; move_down
  196.     when 2 ; move_left
  197.     when 3 ; move_right
  198.     when 4 ; move_up
  199.     end
  200.     @route_count += 1
  201.     return
  202.   end
  203.   #--------------------------------------------------------------------------
  204.   # ● 接近指定人物(指定移动路线专用)
  205.   #--------------------------------------------------------------------------
  206.   def target_c_move_auto(id)
  207.     if id == 0
  208.       target = $game_player
  209.     else
  210.       target = $game_map.events[id]
  211.     end
  212.     return if target == nil
  213.     target_p_move_auto(target.x, target.y)
  214.   end
  215.   #--------------------------------------------------------------------------
  216.   # ● 可以通行的情况下前进,否则向随机方向转换
  217.   #--------------------------------------------------------------------------
  218.   def search_front
  219.     unless moving?
  220.       if dir_passable?(@x, @y, @direction)
  221.         move_forward
  222.       else
  223.         turn_random
  224.       end
  225.     end
  226.   end
  227.   #--------------------------------------------------------------------------
  228.   # ● 移动类型 : 随机
  229.   #--------------------------------------------------------------------------
  230.   def move_type_area_random(id)
  231.     case rand(6)
  232.     when 0..1;  move_area_random(id)
  233.     when 2..4;  move_forward if dir_passable_in_area?(@direction, id)
  234.     when 5;     @stop_count = 0
  235.     end
  236.   end
  237.   #--------------------------------------------------------------------------
  238.   # ● 区域内随机移动
  239.   #--------------------------------------------------------------------------
  240.   def move_area_random(id)
  241.     a = in_area_passable?(id)
  242.     return if a.empty?
  243.     b = rand(a.size)
  244.     case a[b]
  245.     when 2 ; move_down(false)
  246.     when 4 ; move_left(false)
  247.     when 6 ; move_right(false)
  248.     when 8 ; move_up(false)
  249.     end
  250.   end
  251.   #--------------------------------------------------------------------------
  252.   # ● 取得区域内可以通行的方向
  253.   #--------------------------------------------------------------------------
  254.   def in_area_passable?(id)
  255.     a = []
  256.     a.push 2 if dir_passable_in_area?(2, id)
  257.     a.push 4 if dir_passable_in_area?(4, id)
  258.     a.push 6 if dir_passable_in_area?(6, id)
  259.     a.push 8 if dir_passable_in_area?(8, id)
  260.     return a
  261.   end
  262.   #--------------------------------------------------------------------------
  263.   # ● 指定方向的区域内可以通行吗?
  264.   #--------------------------------------------------------------------------
  265.   def dir_passable_in_area?(d, id)
  266.     case d
  267.     when 2
  268.       return $game_map.in_area?(id, @x, @y + 1) && dir_passable?(@x, @y, 2)
  269.     when 4
  270.       return $game_map.in_area?(id, @x - 1, @y) && dir_passable?(@x, @y, 4)
  271.     when 6
  272.       return $game_map.in_area?(id, @x + 1, @y) && dir_passable?(@x, @y, 4)
  273.     when 8
  274.       return $game_map.in_area?(id, @x, @y - 1) && dir_passable?(@x, @y, 8)
  275.     end
  276.   end
  277.   #--------------------------------------------------------------------------
  278.   # ● 移动类型 : 自定义
  279.   #--------------------------------------------------------------------------
  280.   alias dai_custom_move_move_type_custom move_type_custom
  281.   def move_type_custom
  282.     return if @move_route.list[@move_route_index] == nil
  283.     dai_custom_move_move_type_custom
  284.   end
  285. end
  286. #==============================================================================
  287. # ■ Game_Player
  288. #==============================================================================
  289. class Game_Player < Game_Character
  290.   #--------------------------------------------------------------------------
  291.   # ● 接触事件的执行判定
  292.   #--------------------------------------------------------------------------
  293.   alias dai_custom_move_check_event_trigger_touch check_event_trigger_touch
  294.   def check_event_trigger_touch(x, y)
  295.     for event in $game_map.events_xy(x, y)
  296.       if event.trigger == 0 && event.priority_type == 1 && DAI_Move::E &&
  297.       event.move_type == 1 && event.stop_count > 30 * (4 - event.move_frequency)
  298.         event.move_away_from_player
  299.       end
  300.     end
  301.     dai_custom_move_check_event_trigger_touch(x, y)
  302.   end
  303. end
  304. #==============================================================================
  305. # ■ Game_Map
  306. #==============================================================================
  307. class Game_Map
  308.   #--------------------------------------------------------------------------
  309.   # ● 区域确定
  310.   #--------------------------------------------------------------------------
  311.   def in_area?(id, x, y)
  312.     area = $data_areas[id]
  313.     return false if area == nil
  314.     return false if $game_map.map_id != area.map_id
  315.     return false if x < area.rect.x
  316.     return false if y < area.rect.y
  317.     return false if x >= area.rect.x + area.rect.width
  318.     return false if y >= area.rect.y + area.rect.height
  319.     return true
  320.   end
  321. end
复制代码

作者: 正太君    时间: 2014-7-28 20:42
选择Game.rvproj文件,右键,打开方式,选择用记事本打开,把里面的内容改成RPGVX 1.01,不行的话就改成RPGVX 1.00,保存退出,就可以顺利打开了呢...




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