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

Project1

 找回密码
 注册会员
搜索
查看: 1535|回复: 1
打印 上一主题 下一主题

[已经解决] 全方向ドット移動 Ver ε这个脚本怎么用?

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1534 小时
注册时间
2009-10-1
帖子
213
跳转到指定楼层
1
发表于 2011-11-20 18:56:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
rt
$ud_ok = true # 打开:圣女之歌、三国战记类型(不能跳);
              # 关闭:北欧女神,新超级玛丽,恶魔城类型;
              
$airjump = 1  # 空中多段跳的次数

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
# ————————————————————————————————————
# 全方向ドット移動 Ver ε
# 配布元?サポートURL
# http://members.jcom.home.ne.jp/cogwheel/
#==============================================================================
# ■ Game_Player
#==============================================================================
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 定数
  #--------------------------------------------------------------------------
  UP    = 48                  # 上方向の余裕(0 < UP < 63)
  DOWN  = 16                  # 下方向の余裕(0 < DOWN <63)
  SIDE  = 32                  # 左右方向の余裕(0 < SIDE <63)
  SLANT = false               # 移動ルートの斜め移動時、速度修正
  JUMPMAX = 200              
  GA  = 50                    # 重力加速度,注意这个数值一定至少要为下面那个数值的4倍以上,否则有BUG。
  UPGRADE_PIXEL = 10           # 偏移允许的最大像素
  
  FORBID_JUMP_WAIT = true     # 禁用跳跃后的摔倒时间
  JUMP_INIT_WAIT_COUNT = -2   # 初始等待时间,-2表示在空中跳跃2帧还不会进入摔倒计时,超过就会倒计时。
  #--------------------------------------------------------------------------
  # ● 公開变量
  #--------------------------------------------------------------------------
  attr_reader   :event     
  attr_accessor :move_speed
  #--------------------------------------------------------------------------
  # ● 刷新部分
  #--------------------------------------------------------------------------
  alias :update_original :update
  def update
    #------------------------------------------------
    # ★ 按键时候跑步加速的功能
    #------------------------------------------------
    run_speed_confirm

                       
    #------------------------------------------------
    # 按照是否具有强制移动路线来进行处理。
    #------------------------------------------------
    if @move_route_forcing
      #=====================================================================
      # 如果有强制移动路线,则先本地记录信息和坐标,然后进行修正坐标处理
      # 处理完毕后按照父类的方法进行刷新
      #=====================================================================
      # 本地变量记录移动信息、坐标
      last_moving = moving?
      last_real_x = @real_x
      last_real_y = @real_y
      if (@revise_x != 0 or @revise_y != 0) and not jumping? and @move == true
        #------------------------------------------------
        # ★ 强制移动时候的修正坐标处理
        #------------------------------------------------
        route_forcing_confirm_xy
      else
        super
      end
    else      
      #=====================================================================
      # 如果没强制移动路线的刷新方法
      #=====================================================================
      @move = false
      unless moving? or ($game_system.map_interpreter.running? and $emuInput == nil ) or
             @move_route_forcing or $game_temp.message_window_showing
        @event_run = false   
        
        wait_jump_count_function  # 在高处跳下来之后的等待时间
        
        free_drop                 # 自由落体
        
        control_player_move       # 控制角色移动的主代码
        
      end
      
      # 本地变量记录移动信息、坐标
      last_real_x = @real_x
      last_real_y = @real_y
      @real_x = (@x * 128 + @revise_x).round
      @real_y = (@y * 128 + @revise_y).round      
      # 移动状态记录
      last_moving = moving?
      # 修正坐标数值的更新
      move_on
      # 現在的座標语以前座標有差异的場合(用来增加步数和刷新待机动画)
      if (last_real_x != @real_x or last_real_y != @real_y)
        @move_distance = 0 if @move_distance == nil
        @move_distance += (Math.sqrt((last_real_x - @real_x) ** 2 +
                                      (last_real_y - @real_y) ** 2)).round
        if @move_distance >= 128
          @move_distance %= 128
          increase_steps
        end
        # 待机踏步动画更新
        anime_update
      else
        @pattern = 0
      end
    end
    #------------------------------------------------
    # ★ 根据角色位置进行地图滚动处理
    #------------------------------------------------
    scroll_player_display(last_real_x, last_real_y)
      
    # 上次主角移动中的情况
    if last_moving
      # 同位置事件的启动判定
      result = check_event_trigger_here([1,2])
      # 如果触发事件,就要校对一下面向。
      if result == true
        if (last_real_x / 128.0).round != @x and
            (last_real_y / 128.0).round != @y
          if @direction == 2 or @direction == 8
            (last_real_x / 128.0).round > @x ? turn_left : turn_right
          else
            (last_real_y / 128.0).round > @y ? turn_up : turn_down
          end
        elsif (last_real_x / 128.0).round > @x
          turn_left
        elsif (last_real_x / 128.0).round < @x
          turn_right
        elsif (last_real_y / 128.0).round > @y
          turn_up
        elsif (last_real_y / 128.0).round < @y
          turn_down
        end
      end
      if result == false
        unless $DEBUG and Input.press?(Input::CTRL)
          if @encounter_count > 0
            @encounter_count -= 1
          end
        end
      end
    end
   
    # 按键跳跃的部分
    press_and_jump
        
    if Input.trigger?(Input::C)
      check_event_trigger_here([0])
      check_event_trigger_there([0,1,2])
    end
  end

                       
  #------------------------------------------------
  # ● 强制移动时候的修正坐标处理
  #------------------------------------------------
  def route_forcing_confirm_xy
    if @revise_x != @real_x - @x * 128 or @revise_y != @real_y - @y * 128
      @revise_x = @real_x - @x * 128
      @revise_y = @real_y - @y * 128
    end
    # 移動距離distance1と目標距離distance2を設定
    distance1 = 2 ** @move_speed
    distance2 = (Math.sqrt(@revise_x ** 2 + @revise_y ** 2)).round
    # 移動距離が目標距離を越えた場合
    if distance1 > distance2
      # 強制的に補正座標を零にする
      @real_x = @real_x - @revise_x
      @real_y = @real_y - @revise_y
      @revise_x = 0
      @revise_y = 0
      anime_update
    # 移動距離が目標距離に達しない場合
    else
      # 移動距離分目標距離に近づく
      @real_x -= (distance1 * @revise_x / distance2).round
      @real_y -= (distance1 * @revise_y / distance2).round
      @revise_x = @real_x - @x * 128
      @revise_y = @real_y - @y * 128
      anime_update
    end
  end

  
  #------------------------------------------------
  # ● 按键跳跃的部分
  #------------------------------------------------
        def press_and_jump
    if Input.repeat?(Input::A)
      $game_player.move_speed = 5
    else
      $game_player.move_speed = 4
    end
    return
    if Input.press?(Input::A) and not $ud_ok
      @twojump = 1 if @twojump == 0 and down1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, 5, true)
      if (not @apassed) and @twojump <= $airjump
        @apassed = true
        @jumpnow = JUMPMAX
        @twojump += 1
      else
        @jumpnow += 3        
      end
    else
      @apassed = false
    end
  end

  #------------------------------------------------
  # ● 按键时候跑步加速的功能
  #------------------------------------------------
  def run_speed_confirm
    @walk  = 4
    @dash  = 5
    @event = 4
    @dot_m = true
    unless moving? or $game_system.map_interpreter.running? or
            @move_route_forcing or $game_temp.message_window_showing
      if @walk != @dash
        if Input.press?(Input::C)
          if @move_speed != @dash
            @move_speed = @dash
          end
        else
          if @move_speed != @walk
            @move_speed = @walk
          end
        end
      end
    end
  end

                       
  #------------------------------------------------
  # ● 根据角色位置进行地图滚动处理
  #------------------------------------------------
  def scroll_player_display(last_real_x, last_real_y)
    # 角色向下移动、画面上的位置在中央下方的情况下
    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
      $game_map.scroll_down(@real_y - last_real_y)
    end
    # 角色向左移动、画面上的位置在中央左方的情况下
    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
      $game_map.scroll_left(last_real_x - @real_x)
    end
    # 角色向右移动、画面上的位置在中央右方的情况下
    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
      $game_map.scroll_right(@real_x - last_real_x)
    end
    # 角色向上移动、画面上的位置在中央上方的情况下
    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
      $game_map.scroll_up(last_real_y - @real_y)
    end
  end

                       
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  def initialize
    @after_jump_wait_release = false
    @jumpnow = 0
    @after_jump_wait_count = 0
    @twojump = 0
    @apassed = false
    @revise_x = 0
    @revise_y = 0
    @move == false
    @move_distance
    super
  end
  
  #--------------------------------------------------------------------------
  # ● 等待跳跃摔倒的倒数计秒
  #--------------------------------------------------------------------------
  def wait_jump_count_function
    if @after_jump_wait_release
      if @after_jump_wait_count > JUMP_INIT_WAIT_COUNT
        @after_jump_wait_count -= 1
      else
        @after_jump_wait_release = false
      end
      return
    end  
  end      
  
  #--------------------------------------------------------------------------
  # ● 自由落体的代码,非常重要!
  #--------------------------------------------------------------------------
  def free_drop
    if not $ud_ok
      @jumpnow -= GA  # 重力加速度
      if @jumpnow < 0 # 下降阶段
        @jumpnow = [@jumpnow, -JUMPMAX].max  # 容错
        for i in 0..- (@jumpnow / 4) + 1
          if not down2(x, y, i * 4)              # 已经找到地面的情况
            down1(((@x * 128 + @revise_x) / 128.0).round,
            ((@y * 128 + @revise_y) / 128.0).round, (i - 1) * 4, true)
            # 跳跃落地时间的问题
            if @after_jump_wait_count > 0
              if FORBID_JUMP_WAIT
                @after_jump_wait_release = true
                @after_jump_wait_count = JUMP_INIT_WAIT_COUNT - 1
              else
                @after_jump_wait_release = true
              end
            else
              @after_jump_wait_count = JUMP_INIT_WAIT_COUNT
              @after_jump_wait_release = false
            end
            @jumpnow = 0
            @twojump = 0
            break
          end
        end
        if @jumpnow != 0
          down1(((@x * 128 + @revise_x) / 128.0).round,
            ((@y * 128 + @revise_y) / 128.0).round, -@jumpnow, true)
          @after_jump_wait_count += 1
          # @jumpnow = 0
          # @twojump = 0
        end
      elsif @jumpnow > 0 # 自由落体上升阶段,这段的封顶修改还得改改,up1太粗糙了
        @jumpnow = [@jumpnow, JUMPMAX].min
        if not up1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, @jumpnow, true)
          @jumpnow = 0
        end
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ● 控制角色移动的主代码
  #--------------------------------------------------------------------------
  def control_player_move
    # 向某方向按键的处理,这里是很重要的主处理部分,各种跑步动作一类的设置
    # 面域的行走等,都可以从这个地方引申出来
    unless @after_jump_wait_release
      if $emuInput != nil
        inputdir8($emuInput)
      else
        inputdir8(Input.dir8)
      end
    end
  end      
  
  def inputdir8(inputtt)
    case inputtt
    when 1
      $ud_ok ? move_lower_left_p : move_left_p_upgrade
    when 2
      move_down_p if $ud_ok
    when 3
      $ud_ok ? move_lower_right_p : move_right_p_upgrade
    when 4
      $ud_ok ? move_left_p : move_left_p_upgrade
    when 6
      $ud_ok ? move_right_p : move_right_p_upgrade
    when 7
      $ud_ok ? move_upper_left_p : move_left_p_upgrade(true)
    when 8
      move_up_p if $ud_ok
    when 9
      $ud_ok ? move_upper_right_p : move_right_p_upgrade(true)
    end
  end

  #--------------------------------------------------------------------------
  # ● 移動判定
  #--------------------------------------------------------------------------
  def moving?
    unless @dot_m
      result = super
      return result
    end
    # 強制移動の場合オリジナルの判定をさせる
    if @move_route_forcing
      if @move == false
        return false
      end
      super
    # 通常時は現座標が実座標と異なる場合のみ移動中と判定
    else
      return (@x != (@real_x / 128.0).round or @y != (@real_y / 128.0).round)
    end
  end
  #--------------------------------------------------------------------------
  # ● 移動判定
  #--------------------------------------------------------------------------
  def moving_a?
    if @move == false
      if (@move_route.list[@move_route_index].code <= 14 or
          @move_route.list[@move_route_index].code == 25)
        @move = true
      end
      return false
    end
    moving?
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (ジャンプ)
  #--------------------------------------------------------------------------
  def update_jump
    # ジャンプカウントを 1 減らす
    @jump_count -= 1
    # 新しい座標を計算
    @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
    @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
    if @jump_count == 0
      @revise_x = 0
      @revise_y = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 移動タイプ : カスタム
  #--------------------------------------------------------------------------
  def move_type_custom
    unless @dot_m
      super
      return
    end
    # 停止中でなければ中断
    if jumping? or moving_a?
      return
    end
    # 移動コマンドのリストの最後に到達するまでループ
    while @move_route_index < @move_route.list.size
      # 移動コマンドを取得
      command = @move_route.list[@move_route_index]
      # コマンドコード 0 番 (リストの最後) の場合
      if command.code == 0
        # オプション [動作を繰り返す] が ON の場合
        if @move_route.repeat
          # 移動ルートのインデックスを最初に戻す
          @move_route_index = 0
        end
        # オプション [動作を繰り返す] が OFF の場合
        unless @move_route.repeat
          # 移動ルート強制中の場合
          if @move_route_forcing and not @move_route.repeat
            # 移動ルートの強制を解除
            @move_route_forcing = false
            # オリジナルの移動ルートを復帰
            @move_route = @original_move_route
            @move_route_index = @original_move_route_index
            @original_move_route = nil
          end
          # 停止カウントをクリア
          @stop_count = 0
        end
        return
      end
      # 移動系コマンド (下に移動~ジャンプ) の場合
      if command.code <= 14
        # コマンドコードで分岐
        case command.code
        when 1  # 下に移動
          move_down
        when 2  # 左に移動
          move_left
        when 3  # 右に移動
          move_right
        when 4  # 上に移動
          move_up
        when 5  # 左下に移動
          move_lower_left
        when 6  # 右下に移動
          move_lower_right
        when 7  # 左上に移動
          move_upper_left
        when 8  # 右上に移動
          move_upper_right
        when 9  # ランダムに移動
          move_random
        when 10  # プレイヤーに近づく
          move_toward_player
        when 11  # プレイヤーから遠ざかる
          move_away_from_player
        when 12  # 一歩前進
          move_forward
        when 13  # 一歩後退
          move_backward
        when 14  # ジャンプ
          jump(command.parameters[0], command.parameters[1])
        end
        # オプション [移動できない場合は無視] が OFF で、移動失敗の場合
        if not @move_route.skippable and not moving? and not jumping?
          return
        end
        @move_route_index += 1
        return
      end
      # ウェイトの場合
      if command.code == 15
        # ウェイトカウントを設定
        @wait_count = command.parameters[0] * 2 - 1
        @move_route_index += 1
        return
      end
      # 向き変更系のコマンドの場合
      if command.code >= 16 and command.code <= 26
        # コマンドコードで分岐
        case command.code
        when 16  # 下を向く
          turn_down
        when 17  # 左を向く
          turn_left
        when 18  # 右を向く
          turn_right
        when 19  # 上を向く
          turn_up
        when 20  # 右に 90 度回転
          turn_right_90
        when 21  # 左に 90 度回転
          turn_left_90
        when 22  # 180 度回転
          turn_180
        when 23  # 右か左に 90 度回転
          turn_right_or_left_90
        when 24  # ランダムに方向転換
          turn_random
        when 25  # プレイヤーの方を向く
          turn_toward_player
        when 26  # プレイヤーの逆を向く
          turn_away_from_player
        end
        @move_route_index += 1
        return
      end
      # その他のコマンドの場合
      if command.code >= 27
        # コマンドコードで分岐
        case command.code
        when 27  # スイッチ ON
          $game_switches[command.parameters[0]] = true
          $game_map.need_refresh = true
        when 28  # スイッチ OFF
          $game_switches[command.parameters[0]] = false
          $game_map.need_refresh = true
        when 29  # 移動速度の変更
          @move_speed = command.parameters[0]
        when 30  # 移動頻度の変更
          @move_frequency = command.parameters[0]
        when 31  # 移動時アニメ ON
          @walk_anime = true
        when 32  # 移動時アニメ OFF
          @walk_anime = false
        when 33  # 停止時アニメ ON
          @step_anime = true
        when 34  # 停止時アニメ OFF
          @step_anime = false
        when 35  # 向き固定 ON
          @direction_fix = true
        when 36  # 向き固定 OFF
          @direction_fix = false
        when 37  # すり抜け ON
          @through = true
        when 38  # すり抜け OFF
          @through = false
        when 39  # 最前面に表示 ON
          @always_on_top = true
        when 40  # 最前面に表示 OFF
          @always_on_top = false
        when 41  # グラフィック変更
          @tile_id = 0
          @character_name = command.parameters[0]
          @character_hue = command.parameters[1]
          if @original_direction != command.parameters[2]
            @direction = command.parameters[2]
            @original_direction = @direction
            @prelock_direction = 0
          end
          if @original_pattern != command.parameters[3]
            @pattern = command.parameters[3]
            @original_pattern = @pattern
          end
        when 42  # 不透明度の変更
          @opacity = command.parameters[0]
        when 43  # 合成方法の変更
          @blend_type = command.parameters[0]
        when 44  # SE の演奏
          $game_system.se_play(command.parameters[0])
        when 45  # スクリプト
          result = eval(command.parameters[0])
        end
        @move_route_index += 1
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 下に移動
  #--------------------------------------------------------------------------
  def move_down_p
    # 下を向く
    turn_down
    # 计算出移动距离
    distance = 2 ** @move_speed
    #down1(((@x * 128 + @revise_x) / 128.0).round,
    #      ((@y * 128 + @revise_y) / 128.0).round, distance, true)
    for i in 1..distance.to_i / 4 + 1
      if down1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, distance, true)
        break
      else
        distance = [distance - 4, 0].max
        break if distance == 0
      end        
    end
  end

  def move_down_aaaagq
    distance = 2 ** @move_speed
    down1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  end
  #--------------------------------------------------------------------------
  # ● 下に移動可能かどうかの判定1
  #--------------------------------------------------------------------------
  def down1(x, y, distance, down = false)
    result = down2(x, y, distance)
    if result == false
      @event_run = check_event_trigger_touch(x, y+1)
      return result
    end
    if @revise_x < -SIDE
      result = down2(x, y + 1, distance, 4)
      result &= down2(x - 1, y, distance)
      if result == false
        if down
          move_lower_right_p
          if @revise_x > SIDE
            @revise_x = SIDE
          end
        end
        return result
      end
    elsif @revise_x > SIDE
      result = down2(x, y + 1, distance, 6)
      result &= down2(x + 1, y, distance)
      if result == false
        if down
          move_lower_left_p
          if @revise_x < -SIDE
            @revise_x = -SIDE
          end
        end
        return result
      end
    end
    # 移动像素
    @revise_y += distance
    return result
  end
  #--------------------------------------------------------------------------
  # ● 下に移動可能かどうかの判定2
  #--------------------------------------------------------------------------
  def down2(x, y, distance, d = 2)
    #return $game_map.passable_map_pixel?(screen_x, screen_y + distance / 4, d, x, y, distance)
    return passable_map_pixel?(all_screen_x, all_screen_y + distance / 4, d)    # + distance / 4
   
   
    if @revise_y + distance > DOWN
      unless passable?(x, y, d)
        if @revise_y < DOWN
          @revise_y = DOWN
        end
        return false
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 左に移動
  #--------------------------------------------------------------------------
  def move_left_p
    # 左を向く
    turn_left
    distance = 2 ** @move_speed
    for i in 1..distance.to_i / 4 + 1
      if left1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, distance, true)
        break
      else
        distance = [distance - 4, 0].max
        break if distance == 0
      end        
    end
  end
  #--------------------------------------------------------------------------
  # ● 左移動upgrade
  #--------------------------------------------------------------------------
  def move_left_p_upgrade(uping = false)
    # 左を向く
    turn_left
    distance = 2 ** @move_speed
    for i in 1..distance.to_i / 4 + 1
      if left1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, distance, true, true, uping)
        break
      else
        distance = [distance - 4, 0].max
        break if distance == 0
      end        
    end
  end  
  #--------------------------------------------------------------------------
  # ● 左に移動可能かどうかの判定1
  #--------------------------------------------------------------------------
  def left1(x, y, distance, left = false, upgrade = false, uping = false)
    if upgrade
      result = left2(x, y, distance, 4, upgrade, uping)   
      if result[0] == false
        @event_run = check_event_trigger_touch(x-1, y)
        return result[0]
      end        
      @revise_x -= distance
      @revise_y += result[1] * 4
      return result[0]
    else
      result = left2(x, y, distance, 4, upgrade)      
      if result == false
        @event_run = check_event_trigger_touch(x-1, y)
        return result
      end      
      if @revise_y < -UP and $ud_ok
        result = left2(x - 1, y, distance, 8)
        result &= left2(x, y - 1, distance)
        if result == false
          if left
            move_lower_left_p
            if @revise_y > DOWN
              @revise_y = DOWN
            end
          end
          return result
        end
      elsif @revise_y > DOWN and $ud_ok
        result = left2(x - 1, y, distance, 2)
        result &= left2(x, y + 1, distance)
        if result == false
          if left
            move_upper_left_p
            if @revise_y < -UP
              @revise_y = -UP
            end
          end
          return result
        end
      end
      @revise_x -= distance
      return result
    end
  end
  #--------------------------------------------------------------------------
  # ● 左に移動可能かどうかの判定2
  #--------------------------------------------------------------------------
  def left2(x, y, distance, d = 4, upgrade = false, uping = false)
    #return $game_map.passable_map_pixel?(screen_x - distance / 4, screen_y, d)
    #unless upgrade
    #  return passable_map_pixel?(all_screen_x - distance / 4, all_screen_y , d)
    #else
    #  if Input.repeat?(Input::UP)
    #    for i in -UPGRADE_PIXEL..UPGRADE_PIXEL
    #      #p all_screen_x - distance / 4, all_screen_y + i, d
    #      if passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i, d) and
    #          !passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i + 1, d)
    #        return [true, +i]
    #      end        
    #    end            
    #   else
    #     for i in -UPGRADE_PIXEL..UPGRADE_PIXEL
    #      #p all_screen_x - distance / 4, all_screen_y + i, d
    #      if passable_map_pixel?(all_screen_x - distance / 4, all_screen_y - i, d) and
    #        !passable_map_pixel?(all_screen_x - distance / 4, all_screen_y - i + 1, d)
    #        return [true, -i]
    #      end        
    #    end
    #  end
    #  return [false, 0]
    #end
   
    unless upgrade
      return passable_map_pixel?(all_screen_x - distance / 4, all_screen_y , d)
    else
      if uping
        for i in -UPGRADE_PIXEL..UPGRADE_PIXEL
          if passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i , d) and
            !passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i + 1, d)
            return [true, +i]
          end        
        end      
      else
        for i in 0..UPGRADE_PIXEL
          #p all_screen_x - distance / 4, all_screen_y + i, d
          if passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i , d) and
            !passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i + 1, d)
            return [true, +i]
          end        
          if passable_map_pixel?(all_screen_x - distance / 4, all_screen_y - i , d) and
            !passable_map_pixel?(all_screen_x - distance / 4, all_screen_y - i + 1, d)
            return [true, -i]
          end
        end
      end
      # return [true, 0]
      return [false, 0]
    end   
   
   
   
   
    if @revise_x - distance < -SIDE
      unless passable?(x, y, d)
        if @revise_x > -SIDE
          @revise_x = -SIDE
        end
        return false
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 右に移動
  #--------------------------------------------------------------------------
  def move_right_p
    # 右を向く
    turn_right
    distance = 2 ** @move_speed
    for i in 1..distance.to_i / 4 + 1
      if right1(((@x * 128 + @revise_x) / 128.0).round,
            ((@y * 128 + @revise_y) / 128.0).round, distance, true)
        break
      else
        distance = [distance - 4, 0].max
        break if distance == 0
      end        
    end            
  end
  #--------------------------------------------------------------------------
  # ● 右に移動
  #--------------------------------------------------------------------------
  def move_right_p_upgrade(uping = false)
    # 右を向く
    turn_right
    distance = 2 ** @move_speed
    for i in 1..distance.to_i / 4 + 1
      if right1(((@x * 128 + @revise_x) / 128.0).round,
            ((@y * 128 + @revise_y) / 128.0).round, distance, true, true, uping)
        break
      else
        distance = [distance - 4, 0].max
        break if distance == 0
      end        
    end            
  end
  #--------------------------------------------------------------------------
  # ● 右に移動可能かどうかの判定1
  #--------------------------------------------------------------------------
  def right1(x, y, distance, right = false, upgrade = false, uping = false)
    if upgrade
      result = right2(x, y, distance, 6, upgrade, uping)   
      if result[0] == false
        @event_run = check_event_trigger_touch(x+1, y)
        return result[0]
      end        
      @revise_x += distance
      @revise_y += result[1] * 4
      return result[0]
    else
      result = right2(x, y, distance)
      if result == false
        @event_run = check_event_trigger_touch(x+1, y)
        return result
      end
      if @revise_y < -UP and $ud_ok
        result = right2(x + 1, y, distance, 8)
        result &= right2(x, y - 1, distance)
        if result == false
          if right
            move_lower_right_p
            if @revise_y > DOWN
              @revise_y = DOWN
            end
          end
          return result
        end
      elsif @revise_y > DOWN and $ud_ok
        result = right2(x + 1, y, distance, 2)
        result &= right2(x, y + 1, distance)
        if result == false
          if right
            move_upper_right_p
            if @revise_y < -UP
              @revise_y = -UP
            end
          end
          return result
        end
      end
      @revise_x += distance
      return result
    end
  end
  #--------------------------------------------------------------------------
  # ● 是否能向右移动,尚未添加SIDE的判断
  #--------------------------------------------------------------------------
  def right2(x, y, distance, d = 6, upgrade = false, uping = false)
    # p upgrade # $game_map.passable_map_pixel?(screen_x + distance / 4, screen_y, d)
    #return $game_map.passable_map_pixel?(screen_x + distance / 4, screen_y, d)
    #return passable_map_pixel?(all_screen_x + distance / 4, all_screen_y , d)
    unless upgrade
      return passable_map_pixel?(all_screen_x + distance / 4, all_screen_y , d)
    else
      if uping
        for i in -UPGRADE_PIXEL..UPGRADE_PIXEL
          if passable_map_pixel?(all_screen_x + distance / 4, all_screen_y + i , d) and
            !passable_map_pixel?(all_screen_x + distance / 4, all_screen_y + i + 1, d)
            return [true, +i]
          end        
        end      
      else
        for i in 0..UPGRADE_PIXEL
          #p all_screen_x - distance / 4, all_screen_y + i, d
          if passable_map_pixel?(all_screen_x + distance / 4, all_screen_y + i , d) and
            !passable_map_pixel?(all_screen_x + distance / 4, all_screen_y + i + 1, d)
            return [true, +i]
          end        
          if passable_map_pixel?(all_screen_x + distance / 4, all_screen_y - i , d) and
            !passable_map_pixel?(all_screen_x + distance / 4, all_screen_y - i + 1, d)
            return [true, -i]
          end
        end
      end
      # return [true, 0]
      return [false,0]
    end
   
   
   
    if @revise_x + distance > SIDE
      unless passable?(x, y, d)
        if @revise_x < SIDE
          @revise_x = SIDE
        end
        return false
      end      
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 上に移動
  #--------------------------------------------------------------------------
  def move_up_p
    # 上を向く
    turn_up
    # 下に移動
    distance = 2 ** @move_speed
    #up1(((@x * 128 + @revise_x) / 128.0).round,
    #    ((@y * 128 + @revise_y) / 128.0).round, distance, true)
        
    for i in 1..distance.to_i / 4 + 1
      if up1(((@x * 128 + @revise_x) / 128.0).round,
        ((@y * 128 + @revise_y) / 128.0).round, distance, true)
        break
      else
        distance = [distance - 4, 0].max
        break if distance == 0
      end        
    end
  end
  
  def move_up_aaaagq
    distance = 2 ** @move_speed
    up1(((@x * 128 + @revise_x) / 128.0).round,
        ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  end
  #--------------------------------------------------------------------------
  # ● 上に移動可能かどうかの判定1
  #--------------------------------------------------------------------------
  def up1(x, y, distance, up = false)   
    result = up2(x, y, distance)
    if result == false
      @event_run = check_event_trigger_touch(x, y-1)
      return result
    end
    if @revise_x < -SIDE
      result = up2(x, y - 1, distance, 4)
      result &= up2(x - 1, y, distance)
      if result == false
        if up
          move_upper_right_p
          if @revise_x > SIDE
            @revise_x = SIDE
          end
        end
        return result
      end
    elsif @revise_x > SIDE
      result = up2(x, y - 1, distance, 6)
      result &= up2(x + 1, y, distance)
      if result == false
        if up
          move_upper_left_p
          if @revise_x < -SIDE
            @revise_x = -SIDE
          end
        end
        return result
      end
    end
    @revise_y -= distance
    return result
  end
  #--------------------------------------------------------------------------
  # ● 上に移動可能かどうかの判定2
  #--------------------------------------------------------------------------
  def up2(x, y, distance, d = 8)   
    #return $game_map.passable_map_pixel?(screen_x, screen_y - distance / 4, d)
    $debug_string = "in_x=#{all_screen_x} in_y=#{all_screen_y + distance / 4}"
    return passable_map_pixel?(all_screen_x, all_screen_y - distance / 4, d)    #- distance / 4
   
    if @revise_y - distance < -UP
      unless passable?(x, y, d)
        if @revise_y > -UP
          @revise_y = -UP
        end
        return false
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 左下に移動
  #--------------------------------------------------------------------------
  def move_lower_left_p
    # 向き固定でない場合
    unless @direction_fix
      # 右向きだった場合は左を、上向きだった場合は下を向く
      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
    end
    # 左下に移動
    distance = ((2 ** @move_speed) / Math.sqrt(2)).round
    if @direction == 2
      turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_down if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 2, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_y > DOWN and -UP > @revise_y - distance
          @revise_y = DOWN
        end
        turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_left if @event_run
      end
    else
      turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_left if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 4, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if  @revise_x + distance> SIDE and -SIDE > @revise_x
          @revise_x = -SIDE
        end
        turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_down if @event_run
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 右下に移動
  #--------------------------------------------------------------------------
  def move_lower_right_p
    # 向き固定でない場合
    unless @direction_fix
      # 左向きだった場合は右を、上向きだった場合は下を向く
      @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
    end
    # 右下に移動
    distance = ((2 ** @move_speed) / Math.sqrt(2)).round
    if @direction == 2
      turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_down if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 2, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_y > DOWN and -UP > @revise_y - distance
          @revise_y = DOWN
        end
        turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_right if @event_run
      end
    else
      turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_right if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 6, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_x > SIDE and -SIDE > @revise_x - distance
          @revise_x = SIDE
        end
        turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_down if @event_run
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 左上に移動
  #--------------------------------------------------------------------------
  def move_upper_left_p
    # 向き固定でない場合
    unless @direction_fix
      # 右向きだった場合は左を、下向きだった場合は上を向く
      @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
    end
    # 左上に移動
    distance = ((2 ** @move_speed) / Math.sqrt(2)).round
    if @direction == 8
      turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
                            ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_up if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 8, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_y + distance > DOWN and -UP > @revise_y
          @revise_y = -UP
        end
        turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_left if @event_run
      end
    else
      turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
                            ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_left if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 4, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_x > SIDE and -SIDE > @revise_x - distance
          @revise_x = SIDE
        end
        turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_up if @event_run
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 右上に移動
  #--------------------------------------------------------------------------
  def move_upper_right_p
    # 向き固定でない場合
    unless @direction_fix
      # 左向きだった場合は右を、下向きだった場合は上を向く
      @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
    end
    # 右上に移動
    distance = ((2 ** @move_speed) / Math.sqrt(2)).round
    if @direction == 8
      turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
                            ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_up if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 8, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_y + distance > DOWN and -UP > @revise_y
          @revise_y = -UP
        end
        turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_right if @event_run
      end
    else
      turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
                            ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_right if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 6, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_x > SIDE and -SIDE > @revise_x - distance
          @revise_x = SIDE
        end
        turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_up if @event_run
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 同位置のイベント起動判定
  #--------------------------------------------------------------------------
  def check_event_trigger_here(triggers, run = true)
    result = false
    # イベント実行中の場合
    if $game_system.map_interpreter.running?
      return result
    end
    # 全イベントのループ
    for event in $game_map.events.values
      # イベントの座標とトリガーが一致した場合
      if event.x == ((@x * 128 + @revise_x) / 128.0).round and
          event.y == ((@y * 128 + @revise_y) / 128.0).round and
          triggers.include?(event.trigger)
        # ジャンプ中以外で、起動判定が同位置のイベントなら
        if not event.jumping? and event.over_trigger?
          if event.list.size > 1
            if run == true
              event.start
            end
            result = true
          end
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # ● 坐标修正,这个的功能是用来在走过一格之后把修正坐标清理为正确的数值
  #    再添加一些定定期的硬运算修正会不会更好?不过似乎现在也不是很容易出问题
  #--------------------------------------------------------------------------
  def move_on
    if @y < (@y + @revise_y / 128.0).round
      @y += 1
      @revise_y -= 128
    end
    if @x > (@x + @revise_x / 128.0).round
      @x -= 1
      @revise_x += 128
    end
    if @x < (@x + @revise_x / 128.0).round
      @x += 1
      @revise_x -= 128
    end
    if @y > (@y + @revise_y / 128.0).round
      @y -= 1
      @revise_y += 128
    end
  end
  #--------------------------------------------------------------------------
  # ● 自动切换图片的原地踏步刷新
  #--------------------------------------------------------------------------
  def anime_update
    # 移动时动画为 ON 的情况下
    if @walk_anime
      # 动画计数增加 1.5
      @anime_count += 1.5
    # 移动时动画为 OFF、停止时动画为 ON 的情况下
    elsif @step_anime
      # 动画计数增加 1
      @anime_count += 1
    end
    # 动画计数超过最大值的情况下
    # ※最大值等于基本值减去移动速度 * 1 的值
    if @anime_count > 13 - @move_speed * 2
      # 停止动画为 OFF 并且在停止中的情况下
      if not @step_anime and @stop_count > 0
        # 还原为原来的图形
        @pattern = @original_pattern
      # 停止动画为 ON 并且在移动中的情况下
      else
        # 更新图形
        @pattern = (@pattern + 1) % 8
      end
      # 清除动画计数
      @anime_count = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 移动到指定位置
  #--------------------------------------------------------------------------
  alias :moveto_original :moveto
  def moveto(x, y)
    # 坐标修正,用来制作按象素移动的方法。
    @revise_x = 0
    @revise_y = 0
    moveto_original(x, y)
  end
  #--------------------------------------------------------------------------
  # ● 移動したかどうかの判定
  #--------------------------------------------------------------------------
  def last_move?(x, y, direction, distance)
    if direction == 2 or direction == 6
      distance *= -1
    end
    if (direction == 2 or direction == 8) and
        (y / 128.0).round != ((y - distance) / 128.0).round
      return true
    end
    if (direction == 4 or direction == 6) and
        (x / 128.0).round != ((x - distance) / 128.0).round
      return true
    end
    return false
  end
end
#==============================================================================
# ■ Game_Character (分割定義 1)
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  # ● 更新画面 (移动)
  #--------------------------------------------------------------------------
  def update_move
    # 移动速度转换为地图坐标系的移动距离
    distance = 2 ** @move_speed
    if @x * 128 != @real_x and @y * 128 != @real_y and Game_Player::SLANT
      distance /= Math.sqrt(2)
      distance = distance.round
    end
    # 理论坐标在实际坐标下方的情况下
    if @y * 128 > @real_y
      # 向下移动
      @real_y = [@real_y + distance, @y * 128].min
    end
    # 理论坐标在实际坐标左方的情况下
    if @x * 128 < @real_x
      # 向左移动
      @real_x = [@real_x - distance, @x * 128].max
    end
    # 理论坐标在实际坐标右方的情况下
    if @x * 128 > @real_x
      # 向右移动
      @real_x = [@real_x + distance, @x * 128].min
    end
    # 理论坐标在实际坐标上方的情况下
    if @y * 128 < @real_y
      # 向上移动
      @real_y = [@real_y - distance, @y * 128].max
    end
    # 移动时动画为 ON 的情况下
    if @walk_anime
      # 动画计数增加 1.5
      @anime_count += 1.5
    # 移动时动画为 OFF、停止时动画为 ON 的情况下
    elsif @step_anime
      # 动画计数增加 1
      @anime_count += 1
    end
  end
end
#==============================================================================
# ■ Game_Event
#==============================================================================
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● イベント起動
  #--------------------------------------------------------------------------
  def start
    # 実行内容が空でない場合
    if @list.size > 1
      # $game_player.event が0でない場合
      if $game_player.event != 0
        # 移動速度を $game_player.event にする
        $game_player.move_speed = $game_player.event
      end
      @starting = true
    end
  end
end
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================

Lv1.梦旅人

小黑

梦石
0
星屑
50
在线时间
140 小时
注册时间
2011-8-23
帖子
536
2
发表于 2011-11-20 19:31:24 | 只看该作者
1. 这个脚本又长又臭(我没有鼻子)
2. 没有放进代码框发帖
3. 把 $ud_ok = true  改  $ud_ok = false 就是跳跃模式
4. 用法就在事件里的脚本
起码对得起自己。
回复

使用道具 举报

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

本版积分规则

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

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-3 17:01

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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