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

Project1

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

[已经解决] 关于重力脚本里的加速功能

 关闭 [复制链接]

Lv1.梦旅人

草莓君

梦石
0
星屑
79
在线时间
418 小时
注册时间
2008-6-12
帖子
1902
跳转到指定楼层
1
发表于 2009-9-19 14:19:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x

    $ud_ok = false #上下失效
    $airjump = 0  #空中连跳
    #==============================================================================
    # 本脚本来自www.66RPG.com,使用和转载请保留此信息
    #==============================================================================

    # ————————————————————————————————————
    # 全方向ドット移動 Ver ε
    # 配布元・サポートURL
    # http://members.jcom.home.ne.jp/cogwheel/

    #==============================================================================
    # ■ Game_Player
    #------------------------------------------------------------------------------
    #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
    # 機能を持っています。このクラスのインスタンスは $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 = 100              
      JUMPADD = 10              
      #--------------------------------------------------------------------------
      # ● 公開インスタンス変数
      #--------------------------------------------------------------------------
      attr_reader   :event                    # イベント時移動速度
      attr_accessor :move_speed               # 移動速度
      #--------------------------------------------------------------------------
      # ● フレーム更新
      #--------------------------------------------------------------------------
      alias :update_original :update
      def update
        # @walk:歩行速度 @dash:ダッシュ時移動速度
        # @event:イベント時移動速度(0の時は、イベント時に速度変更をしない)
        @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
        if @revise_x == nil and @revise_y == nil
          @revise_x = 0
          @revise_y = 0
        end
        unless @dot_m
          update_original
          return
        end
        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
            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)
            # 移動距離が目標距離を越えた場合
            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
          else
            super
          end
        else
          @move = false
          # 移動中、イベント実行中、移動ルート強制中、
          # メッセージウィンドウ表示中のいずれでもない場合
          unless moving? or $game_system.map_interpreter.running? or
                 @move_route_forcing or $game_temp.message_window_showing
            @event_run = false
            # 方向ボタンが押されていれば、その方向へプレイヤーを移動
    #---------------------------上下失效-----------------------------------------
          case Input.dir8
            when 1
              $ud_ok ? move_lower_left_p : move_left_p
            when 2
    #          $ud_ok ? move_down_p : move_down_aaaagq
              move_down_p if $ud_ok
            when 3
             $ud_ok ? move_lower_right_p : move_right_p
            when 4
              move_left_p
            when 6
              move_right_p
            when 7
             $ud_ok ? move_upper_left_p : move_left_p
            when 8
    #         $ud_ok ? move_up_p : move_up_aaaagq
             move_up_p if $ud_ok
            when 9
             $ud_ok ? move_upper_right_p : move_right_p
            end
          end
          # ローカル変数に座標を記憶
          last_real_x = @real_x
          last_real_y = @real_y
          # 移動処理
          @real_x = @x * 128 + @revise_x
          @real_y = @y * 128 + @revise_y
          # ローカル変数に移動中かどうかを記憶
          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)
            if @move_distance >= 128
              @move_distance %= 128
              increase_steps
            end
            # アニメーションを更新
            anime_update
          else
            @pattern = 0
          end
        end
        # キャラクターが下に移動し、かつ画面上の位置が中央より下の場合
        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
        # 前回プレイヤーが移動中だった場合
        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
                if (last_real_x / 128.0).round > @x
                  turn_left
                else
                  turn_right
                end
              else
                if (last_real_y / 128.0).round > @y
                  turn_up
                else
                  turn_down
                end
              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
            # デバッグモードが ON かつ CTRL キーが押されている場合を除き
            unless $DEBUG and Input.press?(Input::CTRL)
              # エンカウント カウントダウン
              if @encounter_count > 0
                @encounter_count -= 1
              end
            end
          end
        end
    #-----------------------按跳跃-----------------------------------------------
    # A ボタンが押された場合
        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
    #----------------------自由落体--------------------------------
        if not $ud_ok
          @jumpnow -= 10
          if @jumpnow < 0
            @jumpnow = [@jumpnow, -JUMPMAX].max
            if not down1(((@x * 128 + @revise_x) / 128.0).round,
              ((@y * 128 + @revise_y) / 128.0).round, -@jumpnow, true)
              @jumpnow = 0
              @twojump = 0
            end
          elsif @jumpnow > 0
            @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
        if Input.trigger?(Input::C)
          # 同位置および正面のイベント起動判定
          check_event_trigger_here([0])
          check_event_trigger_there([0,1,2])
        end
      end
      #--------------------------------------------------------------------------
      # ● オブジェクト初期化
      #--------------------------------------------------------------------------
      def initialize
        @jumpnow = 0
        @twojump = 0
        @apassed = false
        @revise_x = 0
        @revise_y = 0
        @move == false
        super
      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)
      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)
        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
        left1(((@x * 128 + @revise_x) / 128.0).round,
              ((@y * 128 + @revise_y) / 128.0).round, distance, true)
      end
      #--------------------------------------------------------------------------
      # ● 左に移動可能かどうかの判定1
      #--------------------------------------------------------------------------
      def left1(x, y, distance, left = false)
        result = left2(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 = 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
      #--------------------------------------------------------------------------
      # ● 左に移動可能かどうかの判定2
      #--------------------------------------------------------------------------
      def left2(x, y, distance, d = 4)
        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
        right1(((@x * 128 + @revise_x) / 128.0).round,
                ((@y * 128 + @revise_y) / 128.0).round, distance, true)
      end
      #--------------------------------------------------------------------------
      # ● 右に移動可能かどうかの判定1
      #--------------------------------------------------------------------------
      def right1(x, y, distance, right = false)
        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
      #--------------------------------------------------------------------------
      # ● 右に移動可能かどうかの判定2
      #--------------------------------------------------------------------------
      def right2(x, y, distance, d = 6)
        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)
      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)
        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)
        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)
        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)
        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)
        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
        # アニメカウントが最大値を超えた場合
        # ※最大値は、基本値 18 から移動速度 * 1 を引いた値
        if @anime_count > 18 - @move_speed * 2
          # 停止時アニメが OFF かつ 停止中の場合
          if not @step_anime and @stop_count > 0
            # パターンをオリジナルに戻す
            @pattern = @original_pattern
          # 停止時アニメが ON または 移動中の場合
          else
            # パターンを更新
            @pattern = (@pattern + 1) % 4
          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)
    #------------------------------------------------------------------------------
    #  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event
    # クラスのスーパークラスとして使用されます。
    #==============================================================================

    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)
        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
    #------------------------------------------------------------------------------
    #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
    # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
    #==============================================================================

    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,使用和转载请保留此信息
    #==============================================================================


请大家帮我把这个脚本里的加速功能给去掉,因为不需要

STG弹幕实验进程【醒目】
http://rpg.blue/home.php?mod=space&uid=21363&do=blog&classid=89&view=me&from=space

此号已被我入侵啦哈哈。   By-西露达
西露达你不要随便发帖子就行了……  By kxx1997

Lv1.梦旅人

穿越一季:朔

梦石
0
星屑
50
在线时间
333 小时
注册时间
2007-4-11
帖子
5369

贵宾

2
发表于 2009-9-19 17:29:03 | 只看该作者
#--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias :update_original :update
  def update
    # @walk:歩行速度 @dash:ダッシュ時移動速度
    # @event:イベント時移動速度(0の時は、イベント時に速度変更をしない)
    @walk  = 4
    @dash  = 5
    @event = 4
    @dot_m = true
    #ダッシュ機能。エンターキーが押されている間、移動速度を変更する。

在脚本中找到这一段。
和下一段相关联不难发现速度判断的代入方式。
既然是代入,我们可以换一种极为简便的方式。
直接把上段红字部分的数值改为4.意思就是虽然加速功能存在,但不管怎么加速。速度维持在4,也就是完全无视掉了
6R复活?别扯淡了.

柳柳一旦接手66RPG,我果断呵呵啊。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
4 小时
注册时间
2010-6-26
帖子
8
3
发表于 2010-6-26 21:27:48 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-26 04:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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