| 
 
| 赞 | 13 |  
| VIP | 27 |  
| 好人卡 | 24 |  
| 积分 | 6 |  
| 经验 | 58769 |  
| 最后登录 | 2017-11-28 |  
| 在线时间 | 795 小时 |  
 Lv2.观梦者 无节操 
	梦石0 星屑607 在线时间795 小时注册时间2009-2-6帖子3939  
 | 
| 18L提供的脚本的完整版 来源为ZTBS,其真实作者不详0 0(也许是ZTBS的作者?)
 自汉化
 希望能从某种程度上帮助到布丁{:nm_4:}复制代码#==============================================================================
# 「移动方法」 ver1.20
#   by 水夜
#     汉化 by moy
#  http://zenith.ifdef.jp/
#------------------------------------------------------------------------------
# 提供了不少方便调用的移动方法
#==============================================================================
# 给出目录方便查找和使用:
#    中文名           行数          方法名
# "走向某事件"         26         go_to_event(id)
# "远离某事件"         61         move_away_from_event(id)
# "移向指定坐标"       96         go_to_position(x, y)
# "从指定坐标返回"     129        move_away_from_position(x, y)
# "面向某事件"         162        turn_toward_event(id)
# "背向某事件"         183        turn_away_from_event(id)
# "面向某一坐标"       204        turn_toward_position(x, y)
# "背向某一坐标"       223        turn_away_from_position(x, y)
# "随机范围移动"       242        move_random_area(x, y, distance)
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  # ●定义"走向某事件"的方法  
  #--------------------------------------------------------------------------
  def move_toward_event(id)
    # 计算与需要走向的某事件的位移
    sx = @x - $game_map.events[id].x
    sy = @y - $game_map.events[id].y
    # 如果位移为0(也就是说是本事件)则返回
    if sx == 0 and sy == 0
      return
    end
    # 设置XY的绝对值变量
    abs_sx = sx.abs
    abs_sy = sy.abs
    # XY的绝对值相等时
    if abs_sx == abs_sy
      # X或Y自加1
      rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
    end
    # X比Y的绝对值大时
    if abs_sx > abs_s
      # 在X方向位移结束后执行Y方向
      sx > 0 ? move_left : move_right
      if not moving? and sy != 0
        sy > 0 ? move_up : move_down
      end
    # X比Y的绝对值小时
    else
      # 在Y方向位移结束后执行X方向
      sy > 0 ? move_up : move_down
      if not moving? and sx != 0
        sx > 0 ? move_left : move_right
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 定义"远离某事件"的方法
  #--------------------------------------------------------------------------
  def move_away_from_event(id)
    # 计算与需要远离的某事件的位移
    sx = @x - $game_map.events[id].x
    sy = @y - $game_map.events[id].y
    # 如果位移为0(也就是说是本事件)则返回
    if sx == 0 and sy == 0
      return
    end
    # 设置XY的绝对值变量
    abs_sx = sx.abs
    abs_sy = sy.abs
    # XY的绝对值相等时
    if abs_sx == abs_sy
      # X或Y自加1
      rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
    end
    # X比Y的绝对值大时
    if abs_sx > abs_sy
      # 在X方向位移结束后执行Y方向
      sx > 0 ? move_right : move_left
      if not moving? and sy != 0
        sy > 0 ? move_down : move_up
      end
    # X比Y的绝对值小时
    else
      # 在Y方向位移结束后执行X方向
      sy > 0 ? move_down : move_up
      if not moving? and sx != 0
        sx > 0 ? move_right : move_left
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 定义"移向指定坐标"的方法.
  #--------------------------------------------------------------------------
  def move_toward_position(x, y)
    # 计算与目标坐标间的位移
    sx = @x - x
    sy = @y - y
    # 如果是当前所在坐标则返回
    if sx == 0 and sy == 0
      return
    end
    # 设置XY的绝对值变量
    abs_sx = sx.abs
    abs_sy = sy.abs
    # XY的绝对值相等时
    if abs_sx == abs_sy
      # X或Y自加1
      rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
    end
    # X比Y的绝对值大时
    if abs_sx > abs_sy
      sx > 0 ? move_left : move_right
      if not moving? and sy != 0
        sy > 0 ? move_up : move_down
      end
    # X比Y的绝对值小时
    else
      sy > 0 ? move_up : move_down
      if not moving? and sx != 0
        sx > 0 ? move_left : move_right
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 定义"从指定坐标返回"的方法
  #--------------------------------------------------------------------------
  def move_away_from_position(x, y)
    # 计算与目标坐标间的位移
    sx = @x - x
    sy = @y - y
    # 如果是当前所在坐标则返回
    if sx == 0 and sy == 0
      return
    end
    # 设置XY的绝对值变量
    abs_sx = sx.abs
    abs_sy = sy.abs
    # XY的绝对值相等时
    if abs_sx == abs_sy
      # X或Y自加1
      rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
    end
    # X比Y的绝对值大时
    if abs_sx > abs_sy
      sx > 0 ? move_right : move_left
      if not moving? and sy != 0
        sy > 0 ? move_down : move_up
      end
    # X比Y的绝对值小时
    else
      sy > 0 ? move_down : move_up
      if not moving? and sx != 0
        sx > 0 ? move_right : move_left
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 定义"面向某事件"的方法
  #--------------------------------------------------------------------------
  def turn_toward_event(id)
    # 计算与需要面向的事件间的位移
    sx = @x - $game_map.events[id].x
    sy = @y - $game_map.events[id].y
    # 如果是当前所在坐标则返回
    if sx == 0 and sy == 0
      return
    end
    # X比Y的绝对值大时
    if sx.abs > sy.abs
      # X的值为正则转左,负则转右
      sx > 0 ? turn_left : turn_right
    # X比Y的绝对值小时
    else
      # Y的值为正则转上,负则转下
      sy > 0 ? turn_up : turn_down
    end
  end
  #--------------------------------------------------------------------------
  # ● 定义"背向某事件"的方法
  #--------------------------------------------------------------------------
  def turn_away_from_event(id)
    # 计算与需要背向的事件间的位移
    sx = @x - $game_map.events[id].x
    sy = @y - $game_map.events[id].y
    # 如果是当前所在坐标则返回
    if sx == 0 and sy == 0
      return
    end
    # X比Y的绝对值大时
    if sx.abs > sy.abs
      # X的值为正则转右,负则转左
      sx > 0 ? turn_right : turn_left
    # X比Y的绝对值小时
    else
      # Y的值为正则转下,负则转上
      sy > 0 ? turn_down : turn_up
    end
  end
  #--------------------------------------------------------------------------
  # ● 定义"面向某一坐标"的方法
  #--------------------------------------------------------------------------
  def turn_toward_position(x, y)
    # 计算与指定坐标间的位移
    sx = @x - x
    sy = @y - y
    # 如果是当前所在坐标则返回
    if sx == 0 and sy == 0
      return
    end
    # X比Y的绝对值大时
    if sx.abs > sy.abs
      sx > 0 ? turn_left : turn_right
    # X比Y的绝对值小时
    else
      sy > 0 ? turn_up : turn_down
    end
  end
  #--------------------------------------------------------------------------
  # ● 定义"背向某一坐标"的方法
  #--------------------------------------------------------------------------
  def turn_away_from_position(x, y)
    # 计算与指定坐标间的位移
    sx = @x - x
    sy = @y - y
    # 如果是当前所在坐标则返回
    if sx == 0 and sy == 0
      return
    end
    # X比Y的绝对值大时
    if sx.abs > sy.abs
      sx > 0 ? turn_right : turn_left
    # X比Y的绝对值小时
    else
      sy > 0 ? turn_down : turn_up
    end
  end
  #--------------------------------------------------------------------------
  # ● 定义"随机范围移动"的方法
  #--------------------------------------------------------------------------
  def move_random_area(x, y, distance)
    # 计算与目标原点区域中心间的位移
    sx = @x - x
    sy = @y - y
    # 如果已经在范围外
    if sx.abs + sy.abs > distance
      # 接近区域中心
      move_toward_position(x, y)
      return
    end
    # 在范围内时随机选择方向移动
    case rand(4)
    when 0  # 向下移动
      if sx.abs + sy < distance
        move_down(false)
      end
    when 1  # 向左移动
      if -sx + sy.abs < distance
        move_left(false)
      end
    when 2  # 向右移动
      if sx + sy.abs < distance
        move_right(false)
      end
    when 3  # 向上移动
      if sx.abs - sy < distance
        move_up(false)
      end
    end
  end
end
获取特定事件就如同18L在那里插入的for循环一样添加就好.不过建议在调用行为外使用?因为这些行为也许可以用于NPC的AI,而不仅仅是敌人
 | 
 评分
查看全部评分
 |