| 赞 | 0  | 
 
| VIP | 0 | 
 
| 好人卡 | 0 | 
 
| 积分 | 1 | 
 
| 经验 | 8217 | 
 
| 最后登录 | 2015-12-14 | 
 
| 在线时间 | 67 小时 | 
 
 
 
 
 
Lv1.梦旅人 
	- 梦石
 - 0 
 
        - 星屑
 - 107 
 
        - 在线时间
 - 67 小时
 
        - 注册时间
 - 2007-12-16
 
        - 帖子
 - 75
 
 
 
 | 
	
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员  
 
x
 
这脚本其实只是把之前神隐不器VX上发的A*自动寻路二叉堆版 
实装到VA的地图上而已 
然后修正了一下地图循环的部分~~~ 
 
这算是伪八方向的版本 
如果要改四方向就把 
11行 
Directions = 8 # 寻路方向(4或8) 
 
 Directions = 8 # 寻路方向(4或8)  
 
  
改成 
Directions = 4 # 寻路方向(4或8) 
 
 Directions = 4 # 寻路方向(4或8)  
 
  
334~337行 
    if Input.dir8 > 0       init_mouse_control_info       move_direction(Input.dir8)     end 
 
     if Input.dir8 > 0  
      init_mouse_control_info  
      move_direction(Input.dir8)  
    end  
 
  
改成 
    if Input.dir4 > 0       init_mouse_control_info       move_direction(Input.dir4)     end 
 
     if Input.dir4 > 0  
      init_mouse_control_info  
      move_direction(Input.dir4)  
    end  
 
  
401~428行 
if @mouse_drag       @mpath.clear unless @mpath.empty?       dir = -1       # 滑鼠移動控制       dir = 6 if mouse_x > self.screen_x + 30       dir = 4 if mouse_x < self.screen_x - 30       if mouse_y > self.screen_y + 10         case dir         when 4           dir = 1         when 6           dir = 3         else           dir = 2         end       end       if mouse_y < self.screen_y - 48         case dir         when 4           dir = 7         when 6           dir = 9         else           dir = 8         end       end       move_direction(dir) if dir > 0     end 
 
 if @mouse_drag  
      @mpath.clear unless @mpath.empty?  
      dir = -1  
      # 滑鼠移動控制  
      dir = 6 if mouse_x > self.screen_x + 30  
      dir = 4 if mouse_x < self.screen_x - 30  
      if mouse_y > self.screen_y + 10  
        case dir  
        when 4  
          dir = 1  
        when 6  
          dir = 3  
        else  
          dir = 2  
        end  
      end  
      if mouse_y < self.screen_y - 48  
        case dir  
        when 4  
          dir = 7  
        when 6  
          dir = 9  
        else  
          dir = 8  
        end  
      end  
      move_direction(dir) if dir > 0  
    end  
 
  
改成 
if @mouse_drag       @mpath.clear unless @mpath.empty?       dir = -1       # 滑鼠移動控制       dir = 6 if mouse_x > self.screen_x + 30       dir = 4 if mouse_x < self.screen_x - 30       dir = 2 if mouse_y > self.screen_y + 10       dir = 8 if mouse_y < self.screen_y - 48       move_direction(dir) if dir > 0     end 
 
 if @mouse_drag  
      @mpath.clear unless @mpath.empty?  
      dir = -1  
      # 滑鼠移動控制  
      dir = 6 if mouse_x > self.screen_x + 30  
      dir = 4 if mouse_x < self.screen_x - 30  
      dir = 2 if mouse_y > self.screen_y + 10  
      dir = 8 if mouse_y < self.screen_y - 48  
      move_direction(dir) if dir > 0  
    end  
 
  
 
 
要用真八方向的话就自己改 
Game_Player的move_direction(d)方法吧 
 
#============================================================================== # ■ RMVA A+自动寻路 系统 #------------------------------------------------------------------------------ #  A*自動尋路 部分 By 神隱不器 #     其他腳本 部分 By 釣到一隻猴子@_@ #==============================================================================   #============================================================================== # ■ PathFinding #------------------------------------------------------------------------------ #  A*自動尋路 二叉堆版。 #     By 神隱不器 #==============================================================================   module PathFinding   #--------------------------------------------------------------------------   # ● 参数   #--------------------------------------------------------------------------   Directions = 8  # 寻路方向(4或8)   PathType = 1    # 返回值的类型(0:节点坐标, 1:移动方向)   #--------------------------------------------------------------------------   Node = Struct.new(:x, :y, :d, :parent, :h, :g, :f)   #--------------------------------------------------------------------------   # ● 搜索路径   #--------------------------------------------------------------------------   def self.find_short_path(self_x, self_y, trg_x, trg_y)     return find_path(self_x, self_y, trg_x, trg_y)   end   #--------------------------------------------------------------------------   # ● 寻找角色的最短路径   #--------------------------------------------------------------------------   def self.find_player_short_path(trg_x, trg_y)     if Input.mouse_icon != 0       @possible_x = trg_x       @possible_y = trg_y     end     self_x = $game_player.x     self_y = $game_player.y     return find_path(self_x, self_y, trg_x, trg_y)   end   #--------------------------------------------------------------------------   # ● 开始   #--------------------------------------------------------------------------   def self.find_path(start_x, start_y, dest_x, dest_y)     @dest_pos = [dest_x, dest_y]     ## 加入起始节点     size = [$game_map.width, $game_map.height]     @open = BinaryHeap.new(size, make_node(start_x, start_y, nil)) {|a,b| a.f <=> b.f }     @link = @open.link     path = []     while !@open.data.empty?       node = @open.dequeue       if [node.x,node.y] == @dest_pos         path = make_path(node,PathType)         break       end       self.check(node)     end     @possible_x = nil     @possible_y = nil     return path   end   #--------------------------------------------------------------------------   # ● 生成路径   # type: 返回的形式 (0:节点坐标, 1:移动方向)   #--------------------------------------------------------------------------   def self.make_path(node,type)     path = []     loop do       case type       when 0         path.unshift [node.x, node.y]       when 1         path.unshift direction(node.x,node.y,node.parent)       end       ## 循环条件       node = node.parent       break if node.nil? || node.parent.nil?     end     return path   end   #--------------------------------------------------------------------------   # ● 生成节点   #--------------------------------------------------------------------------   def self.make_node(x, y, parent)     buf = Node.new(x,y,direction(x,y,parent),parent)     buf.h = self.h(buf)     buf.g = self.g(buf)     buf.f = buf.h + buf.g     return buf   end   #--------------------------------------------------------------------------   # ● 寻路   #--------------------------------------------------------------------------   def self.check(node)     px = $game_map.round_x(node.x)     py = $game_map.round_y(node.y)     @link[px, py] = -2 ## closed     self.child_nodes(node).each do |n|       x = $game_map.round_x(n.x)       y = $game_map.round_y(n.y)       next if @link[x, y] == -2 ## closed       next if !passable?(px, py, n.d)       ## 检查更新       if @link[x, y] - 1 >= 0 && @open.data[@link[x, y] - 1]         @open.replace(@link[x, y] - 1, n) if @open.data[@link[x, y] - 1].g > n.g       else         @open.enqueue(n)       end     end   end   #--------------------------------------------------------------------------   # ● h值   #--------------------------------------------------------------------------   def self.h(node)     return ((node.x-@dest_pos[0]).abs + (node.y-@dest_pos[1]).abs)*20   end   #--------------------------------------------------------------------------   # ● g值   #--------------------------------------------------------------------------   def self.g(node)     parent = node.parent     return 0 if parent.nil?     dg = parent.d == node.d ? 0 : 14                                   ## 改变方向的附加开销     dx = node.x - parent.x     dy = node.y - parent.y     ## 判断相对坐标     if dx != 0 && dy != 0       return parent.g + 14 + dg     else       return parent.g + 10 + dg     end   end   #--------------------------------------------------------------------------   # ● 方向   #--------------------------------------------------------------------------   def self.direction(x,y,parent)     return parent.nil? ? 5 : (5 + (x-parent.x)*1 + (y-parent.y)*-3)   end   #--------------------------------------------------------------------------   # ● 子节点   #--------------------------------------------------------------------------   def self.child_nodes(node)     nodes = []     case Directions     when 4 # 4方向寻路       nodes<<make_node(node.x,node.y-1,node)<<make_node(node.x,node.y+1,node)       nodes<<make_node(node.x-1,node.y,node)<<make_node(node.x+1,node.y,node)     when 8 # 8方向寻路       for x in -1..1         for y in -1..1           next if x == 0 && y == 0           nodes << make_node(node.x+x, node.y+y, node)         end       end     end     return nodes   end   #--------------------------------------------------------------------------   # ● 通行?    #--------------------------------------------------------------------------   def self.passable?(x, y, d)     if @possible_x and @possible_y       tx, ty = x, y       case d       when 1 # 左下         tx -= 1         ty += 1       when 2 # 下         ty += 1       when 3 # 右下         tx += 1         ty += 1       when 4 # 左         tx -= 1       when 6 # 右         tx += 1       when 7 # 左上         tx -= 1         ty -= 1       when 8 # 上         ty -= 1       when 9 # 右上         tx += 1         ty -= 1       end       return true if @possible_x == tx and @possible_y == ty     end     x = $game_map.round_x(x)     y = $game_map.round_y(y)     case d     when 0, 2, 4, 6, 8       return $game_player.passable?(x, y, d)     when 1       return $game_player.diagonal_passable?(x, y, 4, 2)     when 3       return $game_player.diagonal_passable?(x, y, 6, 2)     when 7       return $game_player.diagonal_passable?(x, y, 4, 8)     when 9       return $game_player.diagonal_passable?(x, y, 6, 8)     end   end   #--------------------------------------------------------------------------   # ●    #--------------------------------------------------------------------------   def self.open     @open.data   end   #--------------------------------------------------------------------------   # ●    #--------------------------------------------------------------------------   def self.close     result = []     for i in [email]0...@link.xsize[/email]       for j in [email]0...@link.ysize[/email]         result<<[i,j] if @link[i,j]==-2       end     end     return result   end end   #============================================================================== # ■ BinaryHeap #------------------------------------------------------------------------------ #  二叉堆 寻路用。 #==============================================================================   class BinaryHeap   #--------------------------------------------------------------------------   # ● 定义实例变量   #--------------------------------------------------------------------------   attr_reader :data   attr_reader :link   #--------------------------------------------------------------------------   # ● 初始化   #--------------------------------------------------------------------------   def initialize(link,*val,&cmp)     @link = Table.new(*link)     @data = val.sort     @cmp = cmp     @cmp = Proc.new{|a,b| a<=>b} if @cmp.nil?     @data.each_index{|i| @link[@data[i].x,@data[i].y] = i+1}   end   #--------------------------------------------------------------------------   # ● 入列   #--------------------------------------------------------------------------   def enqueue(val)     return replace(@data.size,val)   end   #--------------------------------------------------------------------------   # ● 出列   #--------------------------------------------------------------------------   def dequeue     shift = @data[0]     if @data.size <= 1       @data.clear       return shift     end     @data[0] = @data.pop     linkto(0)     fid,cid = 0,[1,2]     while @data[cid[0]]     ## 左枝存在时       if @data[cid[1]].nil? ## 右枝不存在时         min = cid[0]        else         min = @cmp.call(@data[cid[0]],@data[cid[1]]) < 0 ? cid[0] : cid[1]       end       if @cmp.call(@data[min],@data[fid]) < 0         @data[min],@data[fid] = @data[fid],@data[min]         linkto(min,fid)         fid = min         cid = [fid*2+1,fid*2+2]       else         break       end     end     return shift   end   #--------------------------------------------------------------------------   # ● 修改   #--------------------------------------------------------------------------   def replace(pos, val)     @data[pos] = val     linkto(pos)     cid,fid = pos,(pos-1)/2     while cid > 0 ## 大于顶层时       if @cmp.call(val,@data[fid]) < 0         @data[cid] = @data[fid]         linkto(cid)         cid = fid         fid = (cid-1)/2       else         break       end     end     @data[cid] = val     linkto(cid)     return cid   end   #--------------------------------------------------------------------------   # ● 关联   #--------------------------------------------------------------------------   def linkto(*id)     id.each{|i| @link[@data[i].x,@data[i].y]=i+1}   end end   #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  处理玩家人物的类。拥有事件启动的判定、地图的卷动等功能。 #   本类的实例请参考 $game_player 。 #==============================================================================   class Game_Player < Game_Character   #--------------------------------------------------------------------------   # ● 初始化对象   #--------------------------------------------------------------------------   alias :d8_ori_init :initialize unless defined? d8_ori_init   def initialize     d8_ori_init     init_mouse_control_info   end   #--------------------------------------------------------------------------   # ● 初始化滑鼠訊息   #--------------------------------------------------------------------------   def init_mouse_control_info     @mouse_drag = false     @mouse_count = 0     @mouse_speeding = false     @find_path = 0     @mpath ? @mpath.clear : @mpath = []   end   #--------------------------------------------------------------------------   # ● 由玩家控制移动   #--------------------------------------------------------------------------   def move_by_input     return if !movable? || $game_map.interpreter.running?     if Input.dir8 > 0       init_mouse_control_info       move_direction(Input.dir4)     end     update_mouse_control   end   #--------------------------------------------------------------------------   # ● 更新滑鼠控制   #--------------------------------------------------------------------------   def update_mouse_control     # Count refresh     @find_path += 1 if @find_path != 0     # Mouse     mouse_x, mouse_y = Input.get_mouse_pos     # 滑鼠連點狀態     if Input.dbclick?(Input::M_L)       @mouse_speeding = true       @find_path = 1       @mouse_count = 0     elsif Input.trigger?(Input::M_L)       @find_path = 1       @mouse_count = 0     elsif Input.press?(Input::M_L)       if @mouse_count > 10         @mouse_drag = true         @find_path = 0       else         @mouse_count += 1       end     else       @mouse_count = 0       @mouse_speeding = false if @mpath.empty? and @find_path == 0       @mouse_drag = false     end     # 自動尋路     if @find_path > 12       @find_path = 0       if Input.mouse_icon != 0         if @target_target_event != 0           @mouse_trigger_event = false           @target_target_event = 0         else           @mouse_trigger_event = true           @target_target_event = @target_event         end       end       # 計算滑鼠所在地圖座標       if $game_map.loop_horizontal? and $game_map.display_x + Graphics.width / 32 > $game_map.width and x < $game_map.display_x         dx = $game_map.display_x - $game_map.width       else         dx = $game_map.display_x       end       if $game_map.loop_vertical? and $game_map.display_y + Graphics.height / 32 > $game_map.height and y < $game_map.display_y         dy = $game_map.display_y - $game_map.height       else         dy = $game_map.display_y       end       mx = dx + mouse_x / 32       my = dy + mouse_y / 32       mx = mx <= mx.floor + 0.5 ? mx.ceil : mx.floor       my = my >= my.floor + 0.5 ? my.ceil : my.floor       if passable?(mx, my, 0) or Input.mouse_icon != 0         @mpath = PathFinding.find_player_short_path(mx, my)         @mouse_drag = false       end     end     if @mouse_drag       @mpath.clear unless @mpath.empty?       dir = -1       # 滑鼠移動控制       dir = 6 if mouse_x > self.screen_x + 30       dir = 4 if mouse_x < self.screen_x - 30       if mouse_y > self.screen_y + 10         case dir         when 4           dir = 1         when 6           dir = 3         else           dir = 2         end       end       if mouse_y < self.screen_y - 48         case dir         when 4           dir = 7         when 6           dir = 9         else           dir = 8         end       end       move_direction(dir) if dir > 0     end     # 依自動尋路路徑行走     move_direction(@mpath.shift) if !@mpath.empty?   end   #--------------------------------------------------------------------------   # ● 依方向移動   #--------------------------------------------------------------------------   def move_direction(d)     case d     when 2, 4, 6, 8       move_straight(d)     # 斜向需作修正     when 1       return move_diagonal(4, 2) if diagonal_passable?(@x, @y, 4, 2)       move_straight(4) if passable?(@x, @y, 4)       move_straight(2) if passable?(@x, @y, 2)     when 3       return move_diagonal(6, 2) if diagonal_passable?(@x, @y, 6, 2)       move_straight(6) if passable?(@x, @y, 6)       move_straight(2) if passable?(@x, @y, 2)     when 7       return move_diagonal(4, 8) if diagonal_passable?(@x, @y, 4, 8)       move_straight(4) if passable?(@x, @y, 4)       move_straight(8) if passable?(@x, @y, 8)     when 9       return move_diagonal(6, 8) if diagonal_passable?(@x, @y, 6, 8)       move_straight(6) if passable?(@x, @y, 6)       move_straight(8) if passable?(@x, @y, 8)     end   end end 
 
 #==============================================================================  
# ■ RMVA A+自动寻路 系统  
#------------------------------------------------------------------------------  
#  A*自動尋路 部分 By 神隱不器  
#     其他腳本 部分 By 釣到一隻猴子@_@  
#==============================================================================  
   
#==============================================================================  
# ■ PathFinding  
#------------------------------------------------------------------------------  
#  A*自動尋路 二叉堆版。  
#     By 神隱不器  
#==============================================================================  
   
module PathFinding  
  #--------------------------------------------------------------------------  
  # ● 参数  
  #--------------------------------------------------------------------------  
  Directions = 8  # 寻路方向(4或8)  
  PathType = 1    # 返回值的类型(0:节点坐标, 1:移动方向)  
  #--------------------------------------------------------------------------  
  Node = Struct.new(:x, :y, :d, :parent, :h, :g, :f)  
  #--------------------------------------------------------------------------  
  # ● 搜索路径  
  #--------------------------------------------------------------------------  
  def self.find_short_path(self_x, self_y, trg_x, trg_y)  
    return find_path(self_x, self_y, trg_x, trg_y)  
  end  
  #--------------------------------------------------------------------------  
  # ● 寻找角色的最短路径  
  #--------------------------------------------------------------------------  
  def self.find_player_short_path(trg_x, trg_y)  
    if Input.mouse_icon != 0  
      @possible_x = trg_x  
      @possible_y = trg_y  
    end  
    self_x = $game_player.x  
    self_y = $game_player.y  
    return find_path(self_x, self_y, trg_x, trg_y)  
  end  
  #--------------------------------------------------------------------------  
  # ● 开始  
  #--------------------------------------------------------------------------  
  def self.find_path(start_x, start_y, dest_x, dest_y)  
    @dest_pos = [dest_x, dest_y]  
    ## 加入起始节点  
    size = [$game_map.width, $game_map.height]  
    @open = BinaryHeap.new(size, make_node(start_x, start_y, nil)) {|a,b| a.f <=> b.f }  
    @link = @open.link  
    path = []  
    while !@open.data.empty?  
      node = @open.dequeue  
      if [node.x,node.y] == @dest_pos  
        path = make_path(node,PathType)  
        break  
      end  
      self.check(node)  
    end  
    @possible_x = nil  
    @possible_y = nil  
    return path  
  end  
  #--------------------------------------------------------------------------  
  # ● 生成路径  
  # type: 返回的形式 (0:节点坐标, 1:移动方向)  
  #--------------------------------------------------------------------------  
  def self.make_path(node,type)  
    path = []  
    loop do  
      case type  
      when 0  
        path.unshift [node.x, node.y]  
      when 1  
        path.unshift direction(node.x,node.y,node.parent)  
      end  
      ## 循环条件  
      node = node.parent  
      break if node.nil? || node.parent.nil?  
    end  
    return path  
  end  
  #--------------------------------------------------------------------------  
  # ● 生成节点  
  #--------------------------------------------------------------------------  
  def self.make_node(x, y, parent)  
    buf = Node.new(x,y,direction(x,y,parent),parent)  
    buf.h = self.h(buf)  
    buf.g = self.g(buf)  
    buf.f = buf.h + buf.g  
    return buf  
  end  
  #--------------------------------------------------------------------------  
  # ● 寻路  
  #--------------------------------------------------------------------------  
  def self.check(node)  
    px = $game_map.round_x(node.x)  
    py = $game_map.round_y(node.y)  
    @link[px, py] = -2 ## closed  
    self.child_nodes(node).each do |n|  
      x = $game_map.round_x(n.x)  
      y = $game_map.round_y(n.y)  
      next if @link[x, y] == -2 ## closed  
      next if !passable?(px, py, n.d)  
      ## 检查更新  
      if @link[x, y] - 1 >= 0 && @open.data[@link[x, y] - 1]  
        @open.replace(@link[x, y] - 1, n) if @open.data[@link[x, y] - 1].g > n.g  
      else  
        @open.enqueue(n)  
      end  
    end  
  end  
  #--------------------------------------------------------------------------  
  # ● h值  
  #--------------------------------------------------------------------------  
  def self.h(node)  
    return ((node.x-@dest_pos[0]).abs + (node.y-@dest_pos[1]).abs)*20  
  end  
  #--------------------------------------------------------------------------  
  # ● g值  
  #--------------------------------------------------------------------------  
  def self.g(node)  
    parent = node.parent  
    return 0 if parent.nil?  
    dg = parent.d == node.d ? 0 : 14  
                                  ## 改变方向的附加开销  
    dx = node.x - parent.x  
    dy = node.y - parent.y  
    ## 判断相对坐标  
    if dx != 0 && dy != 0  
      return parent.g + 14 + dg  
    else  
      return parent.g + 10 + dg  
    end  
  end  
  #--------------------------------------------------------------------------  
  # ● 方向  
  #--------------------------------------------------------------------------  
  def self.direction(x,y,parent)  
    return parent.nil? ? 5 : (5 + (x-parent.x)*1 + (y-parent.y)*-3)  
  end  
  #--------------------------------------------------------------------------  
  # ● 子节点  
  #--------------------------------------------------------------------------  
  def self.child_nodes(node)  
    nodes = []  
    case Directions  
    when 4 # 4方向寻路  
      nodes<<make_node(node.x,node.y-1,node)<<make_node(node.x,node.y+1,node)  
      nodes<<make_node(node.x-1,node.y,node)<<make_node(node.x+1,node.y,node)  
    when 8 # 8方向寻路  
      for x in -1..1  
        for y in -1..1  
          next if x == 0 && y == 0  
          nodes << make_node(node.x+x, node.y+y, node)  
        end  
      end  
    end  
    return nodes  
  end  
  #--------------------------------------------------------------------------  
  # ● 通行?   
  #--------------------------------------------------------------------------  
  def self.passable?(x, y, d)  
    if @possible_x and @possible_y  
      tx, ty = x, y  
      case d  
      when 1 # 左下  
        tx -= 1  
        ty += 1  
      when 2 # 下  
        ty += 1  
      when 3 # 右下  
        tx += 1  
        ty += 1  
      when 4 # 左  
        tx -= 1  
      when 6 # 右  
        tx += 1  
      when 7 # 左上  
        tx -= 1  
        ty -= 1  
      when 8 # 上  
        ty -= 1  
      when 9 # 右上  
        tx += 1  
        ty -= 1  
      end  
      return true if @possible_x == tx and @possible_y == ty  
    end  
    x = $game_map.round_x(x)  
    y = $game_map.round_y(y)  
    case d  
    when 0, 2, 4, 6, 8  
      return $game_player.passable?(x, y, d)  
    when 1  
      return $game_player.diagonal_passable?(x, y, 4, 2)  
    when 3  
      return $game_player.diagonal_passable?(x, y, 6, 2)  
    when 7  
      return $game_player.diagonal_passable?(x, y, 4, 8)  
    when 9  
      return $game_player.diagonal_passable?(x, y, 6, 8)  
    end  
  end  
  #--------------------------------------------------------------------------  
  # ●   
  #--------------------------------------------------------------------------  
  def self.open  
    @open.data  
  end  
  #--------------------------------------------------------------------------  
  # ●   
  #--------------------------------------------------------------------------  
  def self.close  
    result = []  
    for i in [email]0...@link.xsize[/email]  
      for j in [email]0...@link.ysize[/email]  
        result<<[i,j] if @link[i,j]==-2  
      end  
    end  
    return result  
  end  
end  
   
#==============================================================================  
# ■ BinaryHeap  
#------------------------------------------------------------------------------  
#  二叉堆 寻路用。  
#==============================================================================  
   
class BinaryHeap  
  #--------------------------------------------------------------------------  
  # ● 定义实例变量  
  #--------------------------------------------------------------------------  
  attr_reader :data  
  attr_reader :link  
  #--------------------------------------------------------------------------  
  # ● 初始化  
  #--------------------------------------------------------------------------  
  def initialize(link,*val,&cmp)  
    @link = Table.new(*link)  
    @data = val.sort  
    @cmp = cmp  
    @cmp = Proc.new{|a,b| a<=>b} if @cmp.nil?  
    @data.each_index{|i| @link[@data[i].x,@data[i].y] = i+1}  
  end  
  #--------------------------------------------------------------------------  
  # ● 入列  
  #--------------------------------------------------------------------------  
  def enqueue(val)  
    return replace(@data.size,val)  
  end  
  #--------------------------------------------------------------------------  
  # ● 出列  
  #--------------------------------------------------------------------------  
  def dequeue  
    shift = @data[0]  
    if @data.size <= 1  
      @data.clear  
      return shift  
    end  
    @data[0] = @data.pop  
    linkto(0)  
    fid,cid = 0,[1,2]  
    while @data[cid[0]]     ## 左枝存在时  
      if @data[cid[1]].nil? ## 右枝不存在时  
        min = cid[0]   
      else  
        min = @cmp.call(@data[cid[0]],@data[cid[1]]) < 0 ? cid[0] : cid[1]  
      end  
      if @cmp.call(@data[min],@data[fid]) < 0  
        @data[min],@data[fid] = @data[fid],@data[min]  
        linkto(min,fid)  
        fid = min  
        cid = [fid*2+1,fid*2+2]  
      else  
        break  
      end  
    end  
    return shift  
  end  
  #--------------------------------------------------------------------------  
  # ● 修改  
  #--------------------------------------------------------------------------  
  def replace(pos, val)  
    @data[pos] = val  
    linkto(pos)  
    cid,fid = pos,(pos-1)/2  
    while cid > 0 ## 大于顶层时  
      if @cmp.call(val,@data[fid]) < 0  
        @data[cid] = @data[fid]  
        linkto(cid)  
        cid = fid  
        fid = (cid-1)/2  
      else  
        break  
      end  
    end  
    @data[cid] = val  
    linkto(cid)  
    return cid  
  end  
  #--------------------------------------------------------------------------  
  # ● 关联  
  #--------------------------------------------------------------------------  
  def linkto(*id)  
    id.each{|i| @link[@data[i].x,@data[i].y]=i+1}  
  end  
end  
   
#==============================================================================  
# ■ Game_Player  
#------------------------------------------------------------------------------  
#  处理玩家人物的类。拥有事件启动的判定、地图的卷动等功能。  
#   本类的实例请参考 $game_player 。  
#==============================================================================  
   
class Game_Player < Game_Character  
  #--------------------------------------------------------------------------  
  # ● 初始化对象  
  #--------------------------------------------------------------------------  
  alias :d8_ori_init :initialize unless defined? d8_ori_init  
  def initialize  
    d8_ori_init  
    init_mouse_control_info  
  end  
  #--------------------------------------------------------------------------  
  # ● 初始化滑鼠訊息  
  #--------------------------------------------------------------------------  
  def init_mouse_control_info  
    @mouse_drag = false  
    @mouse_count = 0  
    @mouse_speeding = false  
    @find_path = 0  
    @mpath ? @mpath.clear : @mpath = []  
  end  
  #--------------------------------------------------------------------------  
  # ● 由玩家控制移动  
  #--------------------------------------------------------------------------  
  def move_by_input  
    return if !movable? || $game_map.interpreter.running?  
    if Input.dir8 > 0  
      init_mouse_control_info  
      move_direction(Input.dir4)  
    end  
    update_mouse_control  
  end  
  #--------------------------------------------------------------------------  
  # ● 更新滑鼠控制  
  #--------------------------------------------------------------------------  
  def update_mouse_control  
    # Count refresh  
    @find_path += 1 if @find_path != 0  
    # Mouse  
    mouse_x, mouse_y = Input.get_mouse_pos  
    # 滑鼠連點狀態  
    if Input.dbclick?(Input::M_L)  
      @mouse_speeding = true  
      @find_path = 1  
      @mouse_count = 0  
    elsif Input.trigger?(Input::M_L)  
      @find_path = 1  
      @mouse_count = 0  
    elsif Input.press?(Input::M_L)  
      if @mouse_count > 10  
        @mouse_drag = true  
        @find_path = 0  
      else  
        @mouse_count += 1  
      end  
    else  
      @mouse_count = 0  
      @mouse_speeding = false if @mpath.empty? and @find_path == 0  
      @mouse_drag = false  
    end  
    # 自動尋路  
    if @find_path > 12  
      @find_path = 0  
      if Input.mouse_icon != 0  
        if @target_target_event != 0  
          @mouse_trigger_event = false  
          @target_target_event = 0  
        else  
          @mouse_trigger_event = true  
          @target_target_event = @target_event  
        end  
      end  
      # 計算滑鼠所在地圖座標  
      if $game_map.loop_horizontal? and $game_map.display_x + Graphics.width / 32 > $game_map.width and x < $game_map.display_x  
        dx = $game_map.display_x - $game_map.width  
      else  
        dx = $game_map.display_x  
      end  
      if $game_map.loop_vertical? and $game_map.display_y + Graphics.height / 32 > $game_map.height and y < $game_map.display_y  
        dy = $game_map.display_y - $game_map.height  
      else  
        dy = $game_map.display_y  
      end  
      mx = dx + mouse_x / 32  
      my = dy + mouse_y / 32  
      mx = mx <= mx.floor + 0.5 ? mx.ceil : mx.floor  
      my = my >= my.floor + 0.5 ? my.ceil : my.floor  
      if passable?(mx, my, 0) or Input.mouse_icon != 0  
        @mpath = PathFinding.find_player_short_path(mx, my)  
        @mouse_drag = false  
      end  
    end  
    if @mouse_drag  
      @mpath.clear unless @mpath.empty?  
      dir = -1  
      # 滑鼠移動控制  
      dir = 6 if mouse_x > self.screen_x + 30  
      dir = 4 if mouse_x < self.screen_x - 30  
      if mouse_y > self.screen_y + 10  
        case dir  
        when 4  
          dir = 1  
        when 6  
          dir = 3  
        else  
          dir = 2  
        end  
      end  
      if mouse_y < self.screen_y - 48  
        case dir  
        when 4  
          dir = 7  
        when 6  
          dir = 9  
        else  
          dir = 8  
        end  
      end  
      move_direction(dir) if dir > 0  
    end  
    # 依自動尋路路徑行走  
    move_direction(@mpath.shift) if !@mpath.empty?  
  end  
  #--------------------------------------------------------------------------  
  # ● 依方向移動  
  #--------------------------------------------------------------------------  
  def move_direction(d)  
    case d  
    when 2, 4, 6, 8  
      move_straight(d)  
    # 斜向需作修正  
    when 1  
      return move_diagonal(4, 2) if diagonal_passable?(@x, @y, 4, 2)  
      move_straight(4) if passable?(@x, @y, 4)  
      move_straight(2) if passable?(@x, @y, 2)  
    when 3  
      return move_diagonal(6, 2) if diagonal_passable?(@x, @y, 6, 2)  
      move_straight(6) if passable?(@x, @y, 6)  
      move_straight(2) if passable?(@x, @y, 2)  
    when 7  
      return move_diagonal(4, 8) if diagonal_passable?(@x, @y, 4, 8)  
      move_straight(4) if passable?(@x, @y, 4)  
      move_straight(8) if passable?(@x, @y, 8)  
    when 9  
      return move_diagonal(6, 8) if diagonal_passable?(@x, @y, 6, 8)  
      move_straight(6) if passable?(@x, @y, 6)  
      move_straight(8) if passable?(@x, @y, 8)  
    end  
  end  
end  
 
  
 
然后这脚本用的鼠标系统是咱自己习惯用的自订版本 
用其他的鼠标脚本就自己改判断的部分吧(不负责的闪人~~~ 
(其实只是把一般鼠标用的Mouse模组整个丢进Input里) 
(基本上跟優化版的鼠標系統+全鍵盤差不多) 
鼠标系统就丟在範例裡了 
 
附件大小限制的关系 
System文件夹自己拷一份 
 
MouseMove.rar
(347.62 KB, 下载次数: 715)
 |   
 
 
 
 |