Project1

标题: --增强手感--遇障碍自动转向--3.22更新不对NPC转向 [打印本页]

作者: 幻の飞鱼    时间: 2007-3-4 21:42
标题: --增强手感--遇障碍自动转向--3.22更新不对NPC转向
尽量把判定做的完善了一点
但是面队两边都可完全通行的障碍,比如一个分叉的尖顶处,我还是没有想到最好的办法
,用了随机方向,不知道怎么判定具体走那边会更完善

基本功能已经实现


---------------3月22日更新,对NPC不进行转向,对于个别需要自动转向的事件,第一行写一句注释“not_npc”即可,见范例

http://rpg.blue/upload_program/files/自动转向修正版.rar

直接使用脚本
  1. #==============================================================================
  2. # 使用方法:
  3. # 1.直接插在MAIN前即可使用
  4. # 2.面对事件不进行自动转向
  5. # 3.对于个别需要自动转向的事件,在该事件的第一页第一行写一句注释"not_npc"(不含引号)
  6. #
  7. #------------------------------------------------------------------------------
  8. class Game_Character
  9.   #--------------------------------------------------------------------------
  10.   # ● 可以通行判定
  11.   #     x : X 坐标
  12.   #     y : Y 坐标
  13.   #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  14.   #--------------------------------------------------------------------------  
  15.   def passable?(x, y, d)
  16.     #---------------------------
  17.     $isnpc = true
  18.     #---------------------------
  19.     # 求得新的坐标
  20.     new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  21.     new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  22.     # 坐标在地图以外的情况
  23.     unless $game_map.valid?(new_x, new_y)
  24.       # 不能通行
  25.       return false
  26.     end
  27.     # 穿透是 ON 的情况下
  28.     if @through
  29.       # 可以通行
  30.       return true
  31.     end
  32.     # 移动者的元件无法来到指定方向的情况下
  33.     unless $game_map.passable?(x, y, d, self)
  34.       # 通行不可
  35.       return false
  36.     end
  37.     # 从指定方向不能进入到移动处的元件的情况下
  38.     unless $game_map.passable?(new_x, new_y, 10 - d)
  39.       # 不能通行
  40.       return false
  41.     end
  42.     # 循环全部事件
  43.     for event in $game_map.events.values
  44.       # 事件坐标于移动目标坐标一致的情况下
  45.       if event.x == new_x and event.y == new_y
  46.         # 穿透为 ON
  47.         unless event.through
  48.           # 自己就是事件的情况下
  49.           if self != $game_player
  50.             # 不能通行
  51.             #---------------------------
  52.             $isnpc = false if event.list[0].parameters[0] != "not_npc"
  53.             #---------------------------
  54.             return false
  55.           end
  56.           # 自己是主角、对方的图形是角色的情况下
  57.           if event.character_name != ""
  58.             # 不能通行
  59.             #---------------------------
  60.             $isnpc = false if event.list[0].parameters[0] != "not_npc"
  61.             #---------------------------
  62.             return false
  63.           end
  64.         end
  65.       end
  66.     end
  67.     # 主角的坐标与移动目标坐标一致的情况下
  68.     if $game_player.x == new_x and $game_player.y == new_y
  69.       # 穿透为 ON
  70.       unless $game_player.through
  71.         # 自己的图形是角色的情况下
  72.         if @character_name != ""
  73.           # 不能通行
  74.           return false
  75.         end
  76.       end
  77.     end
  78.     # 可以通行
  79.     return true
  80.   end
  81.   
  82.   #--------------------------------------------------------------------------
  83.   # ● 向下移动
  84.   #     turn_enabled : 本场地位置更改许可标志
  85.   #--------------------------------------------------------------------------
  86.   def move_down(turn_enabled = true)
  87.     #---------------------------
  88.     direct = @direction
  89.     #---------------------------
  90.     # 面向下
  91.     if turn_enabled
  92.       turn_down
  93.     end
  94.     # 可以通行的场合
  95.     if passable?(@x, @y, 2)
  96.       # 面向下
  97.       turn_down
  98.       # 更新坐标
  99.       @y += 1
  100.       # 增加步数
  101.       increase_steps
  102.     # 不能通行的情况下
  103.     else
  104.       
  105.      #---------------------------
  106.     if $isnpc
  107.       if passable?(@x, @y, 6) and passable?(@x+1, @y, 2) and passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
  108.         move_left if direct == 4
  109.         move_right if direct == 6
  110.         if direct == 2 or direct == 8
  111.           randtra = rand(2)
  112.           randtra == 0 ? move_left : move_right
  113.         end
  114.       else
  115.         move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
  116.         move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 2)
  117.       end
  118.     end
  119.     #---------------------------

  120.       # 接触事件的启动判定
  121.       check_event_trigger_touch(@x, @y+1)
  122.     end
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # ● 向左移动
  126.   #     turn_enabled : 本场地位置更改许可标志
  127.   #--------------------------------------------------------------------------
  128.   def move_left(turn_enabled = true)
  129.     #---------------------------
  130.     direct = @direction
  131.     #---------------------------
  132.     # 面向左
  133.     if turn_enabled
  134.       turn_left
  135.     end
  136.     # 可以通行的情况下
  137.     if passable?(@x, @y, 4)
  138.       # 面向左
  139.       turn_left
  140.       # 更新坐标
  141.       @x -= 1
  142.       # 增加步数
  143.       increase_steps
  144.     # 不能通行的情况下
  145.     else
  146.       
  147.       #---------------------------
  148.       if $isnpc
  149.       if passable?(@x, @y, 8) and passable?(@x, @y-1, 4) and passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
  150.         move_up if direct == 8
  151.         move_down if direct == 2
  152.         if direct == 4 or direct == 6
  153.           randtra = rand(2)
  154.           randtra == 0 ? move_up : move_down
  155.         end
  156.       else
  157.         move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 4)
  158.         move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
  159.       end
  160.       end
  161.       #---------------------------
  162.       
  163.       # 接触事件的启动判定
  164.       check_event_trigger_touch(@x-1, @y)
  165.     end
  166.   end
  167.   #--------------------------------------------------------------------------
  168.   # ● 向右移动
  169.   #     turn_enabled : 本场地位置更改许可标志
  170.   #--------------------------------------------------------------------------
  171.   def move_right(turn_enabled = true)
  172.     #---------------------------
  173.     direct = @direction
  174.     #---------------------------
  175.     # 面向右
  176.     if turn_enabled
  177.       turn_right
  178.     end
  179.     # 可以通行的场合
  180.     if passable?(@x, @y, 6)
  181.       # 面向右
  182.       turn_right
  183.       # 更新坐标
  184.       @x += 1
  185.       # 增加部数
  186.       increase_steps
  187.     # 不能通行的情况下
  188.     else
  189.       #---------------------------
  190.       if $isnpc
  191.       if passable?(@x, @y, 8) and passable?(@x, @y-1, 6) and passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
  192.         move_up if direct == 8
  193.         move_down if direct == 2
  194.         if direct == 4 or direct == 6
  195.           randtra = rand(2)
  196.           randtra == 0 ? move_up : move_down
  197.         end
  198.       else
  199.         move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 6)
  200.         move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
  201.       end
  202.       end
  203.       #---------------------------
  204.       # 接触事件的启动判定
  205.       check_event_trigger_touch(@x+1, @y)
  206.     end
  207.   end
  208.   #--------------------------------------------------------------------------
  209.   # ● 向上移动
  210.   #     turn_enabled : 本场地位置更改许可标志
  211.   #--------------------------------------------------------------------------
  212.   def move_up(turn_enabled = true)
  213.     #---------------------------
  214.     direct = @direction
  215.     #---------------------------
  216.     # 面向上
  217.     if turn_enabled
  218.       turn_up
  219.     end
  220.     # 可以通行的情况下
  221.     if passable?(@x, @y, 8)
  222.       # 面向上
  223.       turn_up
  224.       # 更新坐标
  225.       @y -= 1
  226.       # 歩数増加
  227.       increase_steps
  228.     # 不能通行的情况下
  229.     else
  230.       #---------------------------
  231.       if $isnpc
  232.       if passable?(@x, @y, 6) and passable?(@x+1, @y, 8) and passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
  233.         move_left if direct == 4
  234.         move_right if direct == 6
  235.         if direct == 2 or direct == 8
  236.           randtra = rand(2)
  237.           randtra == 0 ? move_left : move_right
  238.         end
  239.       else
  240.         move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
  241.         move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 8)
  242.       end
  243.       end
  244.       #---------------------------
  245.       # 接触事件的启动判定
  246.       check_event_trigger_touch(@x, @y-1)
  247.     end
  248.   end
  249. end
复制代码

作者: 幻の飞鱼    时间: 2007-3-4 21:42
标题: --增强手感--遇障碍自动转向--3.22更新不对NPC转向
尽量把判定做的完善了一点
但是面队两边都可完全通行的障碍,比如一个分叉的尖顶处,我还是没有想到最好的办法
,用了随机方向,不知道怎么判定具体走那边会更完善

基本功能已经实现


---------------3月22日更新,对NPC不进行转向,对于个别需要自动转向的事件,第一行写一句注释“not_npc”即可,见范例

http://rpg.blue/upload_program/files/自动转向修正版.rar

直接使用脚本
  1. #==============================================================================
  2. # 使用方法:
  3. # 1.直接插在MAIN前即可使用
  4. # 2.面对事件不进行自动转向
  5. # 3.对于个别需要自动转向的事件,在该事件的第一页第一行写一句注释"not_npc"(不含引号)
  6. #
  7. #------------------------------------------------------------------------------
  8. class Game_Character
  9.   #--------------------------------------------------------------------------
  10.   # ● 可以通行判定
  11.   #     x : X 坐标
  12.   #     y : Y 坐标
  13.   #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  14.   #--------------------------------------------------------------------------  
  15.   def passable?(x, y, d)
  16.     #---------------------------
  17.     $isnpc = true
  18.     #---------------------------
  19.     # 求得新的坐标
  20.     new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  21.     new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  22.     # 坐标在地图以外的情况
  23.     unless $game_map.valid?(new_x, new_y)
  24.       # 不能通行
  25.       return false
  26.     end
  27.     # 穿透是 ON 的情况下
  28.     if @through
  29.       # 可以通行
  30.       return true
  31.     end
  32.     # 移动者的元件无法来到指定方向的情况下
  33.     unless $game_map.passable?(x, y, d, self)
  34.       # 通行不可
  35.       return false
  36.     end
  37.     # 从指定方向不能进入到移动处的元件的情况下
  38.     unless $game_map.passable?(new_x, new_y, 10 - d)
  39.       # 不能通行
  40.       return false
  41.     end
  42.     # 循环全部事件
  43.     for event in $game_map.events.values
  44.       # 事件坐标于移动目标坐标一致的情况下
  45.       if event.x == new_x and event.y == new_y
  46.         # 穿透为 ON
  47.         unless event.through
  48.           # 自己就是事件的情况下
  49.           if self != $game_player
  50.             # 不能通行
  51.             #---------------------------
  52.             $isnpc = false if event.list[0].parameters[0] != "not_npc"
  53.             #---------------------------
  54.             return false
  55.           end
  56.           # 自己是主角、对方的图形是角色的情况下
  57.           if event.character_name != ""
  58.             # 不能通行
  59.             #---------------------------
  60.             $isnpc = false if event.list[0].parameters[0] != "not_npc"
  61.             #---------------------------
  62.             return false
  63.           end
  64.         end
  65.       end
  66.     end
  67.     # 主角的坐标与移动目标坐标一致的情况下
  68.     if $game_player.x == new_x and $game_player.y == new_y
  69.       # 穿透为 ON
  70.       unless $game_player.through
  71.         # 自己的图形是角色的情况下
  72.         if @character_name != ""
  73.           # 不能通行
  74.           return false
  75.         end
  76.       end
  77.     end
  78.     # 可以通行
  79.     return true
  80.   end
  81.   
  82.   #--------------------------------------------------------------------------
  83.   # ● 向下移动
  84.   #     turn_enabled : 本场地位置更改许可标志
  85.   #--------------------------------------------------------------------------
  86.   def move_down(turn_enabled = true)
  87.     #---------------------------
  88.     direct = @direction
  89.     #---------------------------
  90.     # 面向下
  91.     if turn_enabled
  92.       turn_down
  93.     end
  94.     # 可以通行的场合
  95.     if passable?(@x, @y, 2)
  96.       # 面向下
  97.       turn_down
  98.       # 更新坐标
  99.       @y += 1
  100.       # 增加步数
  101.       increase_steps
  102.     # 不能通行的情况下
  103.     else
  104.       
  105.      #---------------------------
  106.     if $isnpc
  107.       if passable?(@x, @y, 6) and passable?(@x+1, @y, 2) and passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
  108.         move_left if direct == 4
  109.         move_right if direct == 6
  110.         if direct == 2 or direct == 8
  111.           randtra = rand(2)
  112.           randtra == 0 ? move_left : move_right
  113.         end
  114.       else
  115.         move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
  116.         move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 2)
  117.       end
  118.     end
  119.     #---------------------------

  120.       # 接触事件的启动判定
  121.       check_event_trigger_touch(@x, @y+1)
  122.     end
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # ● 向左移动
  126.   #     turn_enabled : 本场地位置更改许可标志
  127.   #--------------------------------------------------------------------------
  128.   def move_left(turn_enabled = true)
  129.     #---------------------------
  130.     direct = @direction
  131.     #---------------------------
  132.     # 面向左
  133.     if turn_enabled
  134.       turn_left
  135.     end
  136.     # 可以通行的情况下
  137.     if passable?(@x, @y, 4)
  138.       # 面向左
  139.       turn_left
  140.       # 更新坐标
  141.       @x -= 1
  142.       # 增加步数
  143.       increase_steps
  144.     # 不能通行的情况下
  145.     else
  146.       
  147.       #---------------------------
  148.       if $isnpc
  149.       if passable?(@x, @y, 8) and passable?(@x, @y-1, 4) and passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
  150.         move_up if direct == 8
  151.         move_down if direct == 2
  152.         if direct == 4 or direct == 6
  153.           randtra = rand(2)
  154.           randtra == 0 ? move_up : move_down
  155.         end
  156.       else
  157.         move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 4)
  158.         move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
  159.       end
  160.       end
  161.       #---------------------------
  162.       
  163.       # 接触事件的启动判定
  164.       check_event_trigger_touch(@x-1, @y)
  165.     end
  166.   end
  167.   #--------------------------------------------------------------------------
  168.   # ● 向右移动
  169.   #     turn_enabled : 本场地位置更改许可标志
  170.   #--------------------------------------------------------------------------
  171.   def move_right(turn_enabled = true)
  172.     #---------------------------
  173.     direct = @direction
  174.     #---------------------------
  175.     # 面向右
  176.     if turn_enabled
  177.       turn_right
  178.     end
  179.     # 可以通行的场合
  180.     if passable?(@x, @y, 6)
  181.       # 面向右
  182.       turn_right
  183.       # 更新坐标
  184.       @x += 1
  185.       # 增加部数
  186.       increase_steps
  187.     # 不能通行的情况下
  188.     else
  189.       #---------------------------
  190.       if $isnpc
  191.       if passable?(@x, @y, 8) and passable?(@x, @y-1, 6) and passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
  192.         move_up if direct == 8
  193.         move_down if direct == 2
  194.         if direct == 4 or direct == 6
  195.           randtra = rand(2)
  196.           randtra == 0 ? move_up : move_down
  197.         end
  198.       else
  199.         move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 6)
  200.         move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
  201.       end
  202.       end
  203.       #---------------------------
  204.       # 接触事件的启动判定
  205.       check_event_trigger_touch(@x+1, @y)
  206.     end
  207.   end
  208.   #--------------------------------------------------------------------------
  209.   # ● 向上移动
  210.   #     turn_enabled : 本场地位置更改许可标志
  211.   #--------------------------------------------------------------------------
  212.   def move_up(turn_enabled = true)
  213.     #---------------------------
  214.     direct = @direction
  215.     #---------------------------
  216.     # 面向上
  217.     if turn_enabled
  218.       turn_up
  219.     end
  220.     # 可以通行的情况下
  221.     if passable?(@x, @y, 8)
  222.       # 面向上
  223.       turn_up
  224.       # 更新坐标
  225.       @y -= 1
  226.       # 歩数増加
  227.       increase_steps
  228.     # 不能通行的情况下
  229.     else
  230.       #---------------------------
  231.       if $isnpc
  232.       if passable?(@x, @y, 6) and passable?(@x+1, @y, 8) and passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
  233.         move_left if direct == 4
  234.         move_right if direct == 6
  235.         if direct == 2 or direct == 8
  236.           randtra = rand(2)
  237.           randtra == 0 ? move_left : move_right
  238.         end
  239.       else
  240.         move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
  241.         move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 8)
  242.       end
  243.       end
  244.       #---------------------------
  245.       # 接触事件的启动判定
  246.       check_event_trigger_touch(@x, @y-1)
  247.     end
  248.   end
  249. end
复制代码

作者: 秋弦月    时间: 2007-3-20 05:51
{/se}好东东啊!!

和KKME之前做的事件比起来方便的要多。
KKME的那个范例:
http://rpg.blue/viewthread.php?tid=39702&ntime=2007%2D3%2D19+21%3A50%3A01
作者: 秋弦月    时间: 2007-3-20 21:40
{/fd}但是有个缺点……
碰到事件它也会走开。这个……找NPC说话都得累死。。。。{/gg}
作者: 幻の飞鱼    时间: 2007-3-22 23:16
额,忽略了这个问题,偶都忘了这个贴了,偶来改改
作者: 洋娃娃    时间: 2007-3-22 23:47
是非常好的东西,以后不需要写事件转向了,是否支持8方向行走时转向?
作者: 洋娃娃    时间: 2007-3-22 23:50
SailCat 以前研究过,参考下 http://rpg.blue/web/htm/news219.htm
作者: 洋娃娃    时间: 2007-3-22 23:54
试走了一下,到处都是滑溜溜的感觉有点恶心……不过也想不出更好的意见……
作者: 柳柳    时间: 2007-3-23 00:17
这个功能好像一般是用在键盘以外的控制器下的……

比如鼠标,点鼠标走路,不停转向比较麻烦;手柄,最好也不要老转;手机,这个功能是必须的,否则手都按疼了。
作者: gpra8764    时间: 2007-3-24 17:40
提示: 作者被禁止或删除 内容自动屏蔽




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