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

Project1

 找回密码
 注册会员
搜索
查看: 8161|回复: 17

[RMVX发布] 双击方向键,绕过障碍自动行走

 关闭 [复制链接]

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

发表于 2008-4-5 00:46:43 | 显示全部楼层 |阅读模式

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

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

x
绕过障碍自动行走 by 沉影不器

功能描述: ① 双击方向键,角色自动行走(确切地说是前进)
             自动行走中,您仍可通过方向键改变行走方向
          ② 遇障碍时,如果存在唯一选择就自动绕过(即左通行 异或 右通行 成立)
          ③ 结束"自动行走"的办法是:按住当前前进方向的反方向键
          ④ 在地图上遇到事件时,除去"自动执行"和"并行处理"的事件,如果执行内容
             不为空,该事件就被认为是NPC,"自动行走"就会解除.(自动识别NPC)

使用方法: ① 复制脚本插入到Main之前,包括"按键双击"的插件
          ② $game_player.always_forward 可以设定受阻后是否保持自动前进的状态
             $game_player.forward 可以手工设定是否自动前进


迷宫行走测试


自动识别NPC


NPC测试







自动行走主脚本

  1. #==============================================================================
  2. # 绕过障碍自动行走 by 沉影不器
  3. # =============================================================================
  4. # 功能描述: ① 双击方向键,角色自动行走(确切地说是前进)
  5. #              自动行走中,您仍可通过方向键改变行走方向
  6. #           ② 遇障碍时,如果存在唯一选择就自动绕过(即左通行 异或 右通行 成立)
  7. #           ③ 结束"自动行走"的办法是:按住当前前进方向的反方向键
  8. #           ④ 在地图上遇到事件时,除去"自动执行"和"并行处理"的事件,如果执行内容
  9. #              不为空,该事件就被认为是NPC,"自动行走"就会解除.
  10. # -----------------------------------------------------------------------------
  11. # 使用方法: ① 复制脚本插入到Main之前,包括"按键双击"的插件
  12. #           ② $game_player.always_forward 可以设定受阻后是否保持自动前进的状态
  13. #              $game_player.forward 可以手工设定是否自动前进
  14. #==============================================================================
  15. class Game_Character
  16.   #--------------------------------------------------------------------------
  17.   # ● 定义实例变量
  18.   #--------------------------------------------------------------------------
  19.   attr_accessor :always_forward             # 受阻后是否保持自动前进
  20.   #--------------------------------------------------------------------------
  21.   # ● 参数设定
  22.   #--------------------------------------------------------------------------
  23.   alias forward_ini initialize unless method_defined?(:forward_ini)
  24.   def initialize
  25.     forward_ini
  26.     @always_forward = false                 # 受阻后是否保持自动前进
  27.     @forward = false                        # 自动前进标记
  28.   end
  29. end

  30. #==============================================================================
  31. class Game_Player < Game_Character
  32.   #--------------------------------------------------------------------------
  33.   # ● 行走判断
  34.   #--------------------------------------------------------------------------
  35.   def turn_round(x, y, d)
  36.     left_passable = true
  37.     right_passable = true
  38.     case d
  39.     when 2
  40.       # 左判断
  41.       for i in 0..1
  42.         if !passable?(x + 1, y + i)
  43.           left_passable = false
  44.           break
  45.         end
  46.       end
  47.       # 右判断
  48.       for i in 0..1
  49.         if !passable?(x - 1, y + i)
  50.           right_passable = false
  51.           break
  52.         end
  53.       end
  54.     when 4
  55.       # 左判断
  56.       for i in 0..1
  57.         if !passable?(x - i, y + 1)
  58.           left_passable = false
  59.           break
  60.         end
  61.       end
  62.       # 右判断
  63.       for i in 0..1
  64.         if !passable?(x - i, y - 1)
  65.           right_passable = false
  66.           break
  67.         end
  68.       end
  69.     when 6
  70.       # 左判断
  71.       for i in 0..1
  72.         if !passable?(x + i, y - 1)
  73.           left_passable = false
  74.           break
  75.         end
  76.       end
  77.       # 右判断
  78.       for i in 0..1
  79.         if !passable?(x + i, y + 1)
  80.           right_passable = false
  81.           break
  82.         end
  83.       end
  84.     when 8
  85.       # 左判断
  86.       for i in 0..1
  87.         if !passable?(x - 1, y - i)
  88.           left_passable = false
  89.           break
  90.         end
  91.       end
  92.       # 右判断
  93.       for i in 0..1
  94.         if !passable?(x + 1, y - i)
  95.           right_passable = false
  96.           break
  97.         end
  98.       end
  99.     end
  100.     if left_passable^right_passable == false
  101.       @forward = false unless @always_forward
  102.       return 0
  103.     else
  104.       return 1 if left_passable == true
  105.       return 2 if left_passable == false
  106.     end
  107.   end
  108.   #--------------------------------------------------------------------------
  109.   # ● 自动行走
  110.   #     type : 行走形式
  111.   #--------------------------------------------------------------------------
  112.   def auto_turn(type = 0)
  113.     move_route = RPG::MoveRoute.new
  114.     # 在此吃了苦头,为何默认repeat = true?
  115.     move_route.repeat = false
  116.     move_route.skippable = true
  117.     case type
  118.     when 1 # 左转
  119.       move_route.list.unshift(RPG::MoveCommand.new(20))
  120.       move_route.list.unshift(RPG::MoveCommand.new(12))
  121.       move_route.list.unshift(RPG::MoveCommand.new(21))
  122.     when 2 # 右转
  123.       move_route.list.unshift(RPG::MoveCommand.new(21))
  124.       move_route.list.unshift(RPG::MoveCommand.new(12))
  125.       move_route.list.unshift(RPG::MoveCommand.new(20))
  126.     end
  127.     # 强制行动
  128.     self.force_move_route(move_route)
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 还原
  132.   #--------------------------------------------------------------------------
  133.   def reset
  134.     @forward = false
  135.     @move_route_forcing = false
  136.     # 还原保存的移动路线
  137.     @move_route = @original_move_route
  138.     @move_route_index = @original_move_route_index
  139.     @original_move_route = nil
  140.     @stop_count = 0
  141.   end
  142.   #--------------------------------------------------------------------------
  143.   # ● 是否npc判断
  144.   #--------------------------------------------------------------------------
  145.   def npc?(triggers)
  146.     # 事件正在执行,直接返回
  147.     return false if $game_map.interpreter.running?
  148.     npc = false
  149.     front_x = $game_map.x_with_direction(@x, @direction)
  150.     front_y = $game_map.y_with_direction(@y, @direction)
  151.     # 处理交通工具
  152.     for vehicle in $game_map.vehicles
  153.       return true if vehicle.pos?(front_x, front_y)
  154.     end
  155.     # 处理事件
  156.     for event in $game_map.events_xy(front_x, front_y)
  157.       if triggers.include?(event.trigger) and event.priority_type == 1
  158.         npc = true if event.list.size > 1
  159.         npc = false if event.list.size == 2 and event.list[0].code == 108
  160.       end
  161.     end
  162.     # 处理柜台
  163.     if npc == false and $game_map.counter?(front_x, front_y)
  164.       front_x = $game_map.x_with_direction(front_x, @direction)
  165.       front_y = $game_map.y_with_direction(front_y, @direction)
  166.       for event in $game_map.events_xy(front_x, front_y)
  167.         if triggers.include?(event.trigger) and event.priority_type == 1
  168.           npc = true if event.list.size > 1
  169.           npc = false if event.list[0].code == 108
  170.         end
  171.       end
  172.     end
  173.     return npc
  174.   end
  175.   #--------------------------------------------------------------------------
  176.   # ● 向下移动
  177.   #     turn_ok : 此地可以更改朝向
  178.   #--------------------------------------------------------------------------
  179.   def move_down(turn_ok = true)
  180.     if passable?(@x, @y+1)                  # 可以通过
  181.       turn_down
  182.       @y = $game_map.round_y(@y+1)
  183.       @real_y = (@y-1)*256
  184.       increase_steps
  185.       @move_failed = false
  186.     else                                    # 不可以通过
  187.       turn_down if turn_ok
  188.       unless @move_route_forcing or npc?([0,1,2])
  189.         auto_turn turn_round(@x, @y, 2)
  190.       else
  191.         @forward = false
  192.       end
  193.       check_event_trigger_touch(@x, @y+1)   # 判断接触的事件启动
  194.       @move_failed = true
  195.     end
  196.   end
  197.   #--------------------------------------------------------------------------
  198.   # ● 向左移动
  199.   #     turn_ok : 此地可以更改朝向
  200.   #--------------------------------------------------------------------------
  201.   def move_left(turn_ok = true)
  202.     if passable?(@x-1, @y)                  # 可以通过
  203.       turn_left
  204.       @x = $game_map.round_x(@x-1)
  205.       @real_x = (@x+1)*256
  206.       increase_steps
  207.       @move_failed = false
  208.     else                                    # 不可以通过
  209.       turn_left if turn_ok
  210.       unless @move_route_forcing or npc?([0,1,2])
  211.         auto_turn turn_round(@x, @y, 4)
  212.       else
  213.         @forward = false
  214.       end
  215.       check_event_trigger_touch(@x-1, @y)   # 判断接触的事件启动
  216.       @move_failed = true
  217.     end
  218.   end
  219.   #--------------------------------------------------------------------------
  220.   # ● 向右移动
  221.   #     turn_ok : 此地可以更改朝向
  222.   #--------------------------------------------------------------------------
  223.   def move_right(turn_ok = true)
  224.     if passable?(@x+1, @y)                  # 可以通过
  225.       turn_right
  226.       @x = $game_map.round_x(@x+1)
  227.       @real_x = (@x-1)*256
  228.       increase_steps
  229.       @move_failed = false
  230.     else                                    # 不可以通过
  231.       turn_right if turn_ok
  232.       unless @move_route_forcing or npc?([0,1,2])
  233.         auto_turn turn_round(@x, @y, 6)
  234.       else
  235.         @forward = false
  236.       end
  237.       check_event_trigger_touch(@x+1, @y)   # 判断接触的事件启动
  238.       @move_failed = true
  239.     end
  240.   end
  241.   #--------------------------------------------------------------------------
  242.   # ● 向上移动
  243.   #     turn_ok : 此地可以更改朝向
  244.   #--------------------------------------------------------------------------
  245.   def move_up(turn_ok = true)
  246.     if passable?(@x, @y-1)                  # 可以通过
  247.       turn_up
  248.       @y = $game_map.round_y(@y-1)
  249.       @real_y = (@y+1)*256
  250.       increase_steps
  251.       @move_failed = false
  252.     else                                    # 不可以通过
  253.       turn_up if turn_ok
  254.       unless @move_route_forcing or npc?([0,1,2])
  255.         auto_turn turn_round(@x, @y, 8)
  256.       else
  257.         @forward = false
  258.       end
  259.       check_event_trigger_touch(@x, @y-1)   # 判断接触的事件启动
  260.       @move_failed = true
  261.     end
  262.   end
  263.   #--------------------------------------------------------------------------
  264.   # ● 处理自动移动
  265.   #--------------------------------------------------------------------------
  266.   def move_auto
  267.     # 双击方向键,启动自动行走
  268.     if Input.double_press?(Input.dir4)
  269.       @forward = true
  270.       return
  271.     end
  272.     unless $game_map.interpreter.running? or moving? or @move_route_forcing
  273.       move_forward if @forward              # 自动行走
  274.     end
  275.   end
  276.   #--------------------------------------------------------------------------
  277.   # ● 处理取消自动移动
  278.   #--------------------------------------------------------------------------
  279.   def move_auto_cancel
  280.     # 按下反方向键时关闭自动行走,还原设定
  281.     case @direction
  282.     when 2
  283.       reset if Input.press?(8)
  284.     when 4
  285.       reset if Input.press?(6)
  286.     when 6
  287.       reset if Input.press?(4)
  288.     when 8
  289.       reset if Input.press?(2)
  290.     end
  291.   end
  292.   #--------------------------------------------------------------------------
  293.   # ● 处理取消自动移动
  294.   #--------------------------------------------------------------------------
  295.   def direction_change
  296.     return unless @forward and $game_map.interpreter.running?
  297.     case Input.dir4
  298.       when 2; turn_down
  299.       when 4; turn_left
  300.       when 6; turn_right
  301.       when 8; turn_up
  302.     end
  303.   end
  304.   #--------------------------------------------------------------------------
  305.   # ● 处理输入方向键后的移动
  306.   #--------------------------------------------------------------------------
  307.   def move_by_input
  308.     return unless movable?
  309.     return if $game_map.interpreter.running?
  310.     return if @move_route_forcing
  311.     case Input.dir4
  312.     when 2;  move_down
  313.     when 4;  move_left
  314.     when 6;  move_right
  315.     when 8;  move_up
  316.     end
  317.   end
  318.   #--------------------------------------------------------------------------
  319.   # ● 刷新画面
  320.   #--------------------------------------------------------------------------
  321.   def update
  322.     move_auto_cancel
  323.     direction_change
  324.     last_real_x = @real_x
  325.     last_real_y = @real_y
  326.     last_moving = moving?
  327.     move_by_input
  328.     move_auto
  329.     super
  330.     update_scroll(last_real_x, last_real_y)
  331.     update_vehicle
  332.     update_nonmoving(last_moving)
  333.   end
  334. end
复制代码


插件(Input.按键双击判断)
  1. #==============================================================================
  2. # 按键双击判断 by 沉影不器
  3. #==============================================================================
  4. module Input
  5.   def self.double_press?(key)
  6.     if self.trigger?(key)
  7.       @key !=key ? (@key = key; return false) : (@key = nil; return true)
  8.     end
  9.   end
  10.   @dp_update = method('update') if @dp_update == nil
  11.   def self.update
  12.     @wait = 0 if @wait == nil
  13.     @wait += 1 if @key != nil
  14.     (@key = nil; @wait = 0) if @wait > 16 # 双击时间
  15.     @dp_update.call
  16.   end
  17. end
复制代码


>>点击此处下载范例工程<<

---------------------------------------------------------
2008-04-14 更新

① 增加自动识别交通工具的功能
② 在事件中,注释不作为可执行的内容来判断

阿桑奇不是一个偶像;阿桑奇是一种思想

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

 楼主| 发表于 2008-4-5 00:48:06 | 显示全部楼层
发错了
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

 楼主| 发表于 2008-4-5 03:48:41 | 显示全部楼层
麻烦哪位大人顺手帮移

阿桑奇不是一个偶像;阿桑奇是一种思想

回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
12 小时
注册时间
2006-5-21
帖子
773
发表于 2008-4-5 04:08:26 | 显示全部楼层
是vx区没错啊
我在想这个脚本放在哪里有用。。
MadniMStudio|Beside
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

天仙

梦石
0
星屑
55
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

发表于 2008-4-5 04:14:59 | 显示全部楼层
转技术区
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

 楼主| 发表于 2008-4-5 06:18:07 | 显示全部楼层
以下引用Beside于2008-4-4 20:08:26的发言:

是vx区没错啊
我在想这个脚本放在哪里有用。。

普通RPG都能用,地图大的就更好了,属于人性化设计这样

阿桑奇不是一个偶像;阿桑奇是一种思想

回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2008-4-1
帖子
60
发表于 2008-4-5 07:05:25 | 显示全部楼层
这个是XP那个吗?
两用的??
还是分开?{/hx}
你知道什么叫做長江7號吗?
很简单, 它只是一个很平凡的外星太空狗,
也是一个很简单的伸手党员
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

天仙

梦石
0
星屑
55
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

发表于 2008-4-5 09:20:33 | 显示全部楼层
结束"自动行走"的办法是:按住当前前进方向的反方向键


何不改成:结束"自动行走"的办法是:按住当前前进方向以外的方向键

VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

 楼主| 发表于 2008-4-5 15:25:54 | 显示全部楼层
以下引用長江7號于2008-4-4 23:05:25的发言:
这个是XP那个吗?
两用的??
还是分开?

我自己的脚本vx化,vx有些判断字改了,先测试一下

以下引用snstar2006于2008-4-5 1:20:33的发言:
结束"自动行走"的办法是:按住当前前进方向的反方向键

何不改成:结束"自动行走"的办法是:按住当前前进方向以外的方向键

跟当前前进方向垂直的两个方向键用来改变自动行走的前进方向

阿桑奇不是一个偶像;阿桑奇是一种思想

回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

风雪夜不归人

梦石
0
星屑
50
在线时间
276 小时
注册时间
2006-3-7
帖子
6721

贵宾

发表于 2008-4-6 05:57:37 | 显示全部楼层
期待正式版本!!!
有些人,到了七八月份就会诈尸。
宫斗,是女生永远的爱。
冷门,是本人不变的欲。
作弊,是玩家自由的痛。
练级,是橙光割舍的情。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-8-19 02:00

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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