Project1

标题: 当遇到不可通行地图元件时 [打印本页]

作者: cinderelmini    时间: 2008-10-26 18:43
标题: 当遇到不可通行地图元件时
    当遇到不可通行地图元件时,角色自行绕路走,用过一些脚本,但是效果不是太好,只是在一些树之类的会绕过,当“撞墙”时就粘在那里不动了。
    总归来说,有没有办法改进一下这个脚本,使角色撞到左右墙时自动随机上下走,
撞到上下墙时自动随机左右走,这样。
#==============================================================================
# 使用方法:
# 1.直接插在MAIN前即可使用
# 2.面对事件不进行自动转向
# 3.对于个别需要自动转向的事件,在该事件的第一页第一行写一句注释"not_npc"(不含引号)
#
#------------------------------------------------------------------------------
class Game_Character
  #--------------------------------------------------------------------------
  # ● 可以通行判定
  #     x : X 坐标
  #     y : Y 坐标
  #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  #--------------------------------------------------------------------------  
  def passable?(x, y, d)
    #---------------------------
    $isnpc = true
    #---------------------------
    # 求得新的坐标
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    # 坐标在地图以外的情况
    unless $game_map.valid?(new_x, new_y)
      # 不能通行
      return false
    end
    # 穿透是 ON 的情况下
    if @through
      # 可以通行
      return true
    end
    # 移动者的元件无法来到指定方向的情况下
    unless $game_map.passable?(x, y, d, self)
      # 通行不可
      return false
    end
    # 从指定方向不能进入到移动处的元件的情况下
    unless $game_map.passable?(new_x, new_y, 10 - d)
      # 不能通行
      return false
    end
    # 循环全部事件
    for event in $game_map.events.values
      # 事件坐标于移动目标坐标一致的情况下
      if event.x == new_x and event.y == new_y
        # 穿透为 ON
        unless event.through
          # 自己就是事件的情况下
          if self != $game_player
            # 不能通行
            #---------------------------
            $isnpc = false if event.list[0].parameters[0] != "not_npc"
            #---------------------------
            return false
          end
          # 自己是主角、对方的图形是角色的情况下
          if event.character_name != ""
            # 不能通行
            #---------------------------
            $isnpc = false if event.list[0].parameters[0] != "not_npc"
            #---------------------------
            return false
          end
        end
      end
    end
    # 主角的坐标与移动目标坐标一致的情况下
    if $game_player.x == new_x and $game_player.y == new_y
      # 穿透为 ON
      unless $game_player.through
        # 自己的图形是角色的情况下
        if @character_name != ""
          # 不能通行
          return false
        end
      end
    end
    # 可以通行
    return true
  end
  
  #--------------------------------------------------------------------------
  # ● 向下移动
  #     turn_enabled : 本场地位置更改许可标志
  #--------------------------------------------------------------------------
  def move_down(turn_enabled = true)
    #---------------------------
    direct = @direction
    #---------------------------
    # 面向下
    if turn_enabled
      turn_down
    end
    # 可以通行的场合
    if passable?(@x, @y, 2)
      # 面向下
      turn_down
      # 更新坐标
      @y += 1
      # 增加步数
      increase_steps
    # 不能通行的情况下
    else
      
     #---------------------------
    if $isnpc
      if passable?(@x, @y, 6) and passable?(@x+1, @y, 2) and passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
        move_left if direct == 4
        move_right if direct == 6
        if direct == 2 or direct == 8
          randtra = rand(2)
          randtra == 0 ? move_left : move_right
        end
      else
        move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
        move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 2)
      end
    end
    #---------------------------

      # 接触事件的启动判定
      check_event_trigger_touch(@x, @y+1)
    end
  end
  #--------------------------------------------------------------------------
  # ● 向左移动
  #     turn_enabled : 本场地位置更改许可标志
  #--------------------------------------------------------------------------
  def move_left(turn_enabled = true)
    #---------------------------
    direct = @direction
    #---------------------------
    # 面向左
    if turn_enabled
      turn_left
    end
    # 可以通行的情况下
    if passable?(@x, @y, 4)
      # 面向左
      turn_left
      # 更新坐标
      @x -= 1
      # 增加步数
      increase_steps
    # 不能通行的情况下
    else
      
      #---------------------------
      if $isnpc
      if passable?(@x, @y, 8) and passable?(@x, @y-1, 4) and passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
        move_up if direct == 8
        move_down if direct == 2
        if direct == 4 or direct == 6
          randtra = rand(2)
          randtra == 0 ? move_up : move_down
        end
      else
        move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 4)
        move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
      end
      end
      #---------------------------
      
      # 接触事件的启动判定
      check_event_trigger_touch(@x-1, @y)
    end
  end
  #--------------------------------------------------------------------------
  # ● 向右移动
  #     turn_enabled : 本场地位置更改许可标志
  #--------------------------------------------------------------------------
  def move_right(turn_enabled = true)
    #---------------------------
    direct = @direction
    #---------------------------
    # 面向右
    if turn_enabled
      turn_right
    end
    # 可以通行的场合
    if passable?(@x, @y, 6)
      # 面向右
      turn_right
      # 更新坐标
      @x += 1
      # 增加部数
      increase_steps
    # 不能通行的情况下
    else
      #---------------------------
      if $isnpc
      if passable?(@x, @y, 8) and passable?(@x, @y-1, 6) and passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
        move_up if direct == 8
        move_down if direct == 2
        if direct == 4 or direct == 6
          randtra = rand(2)
          randtra == 0 ? move_up : move_down
        end
      else
        move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 6)
        move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
      end
      end
      #---------------------------
      # 接触事件的启动判定
      check_event_trigger_touch(@x+1, @y)
    end
  end
  #--------------------------------------------------------------------------
  # ● 向上移动
  #     turn_enabled : 本场地位置更改许可标志
  #--------------------------------------------------------------------------
  def move_up(turn_enabled = true)
    #---------------------------
    direct = @direction
    #---------------------------
    # 面向上
    if turn_enabled
      turn_up
    end
    # 可以通行的情况下
    if passable?(@x, @y, 8)
      # 面向上
      turn_up
      # 更新坐标
      @y -= 1
      # 歩数増加
      increase_steps
    # 不能通行的情况下
    else
      #---------------------------
      if $isnpc
      if passable?(@x, @y, 6) and passable?(@x+1, @y, 8) and passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
        move_left if direct == 4
        move_right if direct == 6
        if direct == 2 or direct == 8
          randtra = rand(2)
          randtra == 0 ? move_left : move_right
        end
      else
        move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
        move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 8)
      end
      end
      #---------------------------
      # 接触事件的启动判定
      check_event_trigger_touch(@x, @y-1)
    end
  end
end

[LINE]1,#dddddd[/LINE]此贴于 2008-10-27 12:43:53 被版主darkten提醒,请楼主看到后对本贴做出回应。 [LINE]1,#dddddd[/LINE]此贴于 2008-10-28 15:00:47 被版主darkten提醒,请楼主看到后对本贴做出回应。 [LINE]1,#dddddd[/LINE]此贴于 2008-11-1 13:17:32 被版主darkten提醒,请楼主看到后对本贴做出回应。 [LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~
作者: 小夜楼风    时间: 2008-10-26 19:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: 精灵使者    时间: 2008-10-26 20:27
问题就是楼主在用自动寻路脚本,用事件做太难了。
作者: 飞飞MJ    时间: 2008-10-26 20:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小夜楼风    时间: 2008-10-26 22:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: 精灵使者    时间: 2008-10-26 22:10
事件多了话也会比较卡吧……
我以前因为这个焦头烂额死了……
不过如果真的想用事件做的话可能会麻烦点。
提示:地形标志来判断你的障碍类型。
作者: 小夜楼风    时间: 2008-10-26 22:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: 精灵使者    时间: 2008-10-26 22:17
我的游戏里一直都在用防卡脚本。但是只要大于100x100的地图肯定会卡死。
作者: 小夜楼风    时间: 2008-10-26 22:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: 一路一风尘    时间: 2008-10-26 23:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: cinderelmini    时间: 2008-10-27 03:57
其实只是设想撞墙时不要死死地站在那里一动也不动,让角色左右走以便寻路,但是如果用事件的话会卡死的(防卡脚本没什么效果),所以……
作者: 小夜楼风    时间: 2008-10-27 05:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: 精灵使者    时间: 2008-10-27 06:54
只要判断角色左前方和右前方是否可以通行,否则拐弯就可以了。
两边各有2格以上宽度就可以54。
彩虹城堡就有这种寻路系统
作者: cinderelmini    时间: 2008-10-30 03:30
那么,请问这种寻路脚本在那里能找到?

论坛搜索没有耶
作者: darkten    时间: 2008-10-31 20:09
以下引用cinderelmini于2008-10-29 19:30:17的发言:

那么,请问这种寻路脚本在那里能找到?

论坛搜索没有耶


[本贴由作者于 2008-10-29 19:31:09 最后编辑]
在主站搜索“寻路”就可以找到了...
[LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~




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