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

Project1

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

[已经过期] 重力脚本速度的设置

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
95 小时
注册时间
2011-7-14
帖子
38
跳转到指定楼层
1
发表于 2011-8-23 17:11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个脚本把速度限制了,我想在某个条件下速度更高为6.怎么弄啊?
  1. =begin
  2. ====================================================================
  3. 重力状态:(在每个地图都要设置一下,"并行处理")
  4. $ud_ok = false     
  5. $airjump = 1
  6. ====================================================================
  7. 解除重力:(在我的这个游戏里用于爬楼梯)
  8. $ud_ok = true
  9. =end
  10. #==============================================================================
  11. # 本脚本来自奇兵RPG,使用和转载请保留此信息
  12. #==============================================================================
  13. $ud_ok = true     
  14. $airjump = 1
  15. # ————————————————————————————————————
  16. # 全方向ドット移動 Ver ε
  17. # 配布元?サポートURL
  18. # http://members.jcom.home.ne.jp/cogwheel/

  19. #==============================================================================
  20. # ■ Game_Player
  21. #------------------------------------------------------------------------------
  22. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  23. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  24. #==============================================================================
  25. class Game_Player < Game_Character
  26.   #--------------------------------------------------------------------------
  27.   # ● 定数
  28.   #--------------------------------------------------------------------------
  29.   UP    = 48                  # 上方向の余裕(0 < UP < 63)
  30.   DOWN  = 16                  # 下方向の余裕(0 < DOWN <63)
  31.   SIDE  = 32                  # 左右方向の余裕(0 < SIDE <63)
  32.   SLANT = false               # 移動ルートの斜め移動時、速度修正
  33.   JUMPMAX = 90              
  34.   JUMPADD = 40              
  35.   #--------------------------------------------------------------------------
  36.   # ● 公開インスタンス変数
  37.   #--------------------------------------------------------------------------
  38.   attr_reader   :event                    # イベント時移動速度
  39.   attr_accessor :move_speed               # 移動速度
  40.   #--------------------------------------------------------------------------
  41.   # ● フレーム更新
  42.   #--------------------------------------------------------------------------
  43.   alias :update_original :update
  44.   def update
  45.     # @walk:歩行速度 @dash:ダッシュ時移動速度
  46.     # @event:イベント時移動速度(0の時は、イベント時に速度変更をしない)
  47.     @walk  = 4
  48.     @dash  = 5
  49.     @event = 20
  50.     @dot_m = true
  51.     #ダッシュ機能。エンターキーが押されている間、移動速度を変更する。

  52.    

  53.    
  54.     unless moving? or $game_system.map_interpreter.running? or
  55.             @move_route_forcing or $game_temp.message_window_showing
  56.       if @walk != @dash
  57.         if Input.press?(Input::C)
  58.           if @move_speed != @walk
  59.             @move_speed = @walk
  60.           end
  61.         else
  62.           if @move_speed != @walk
  63.             @move_speed = @walk
  64.           end
  65.         end
  66.       end
  67.     end
  68.     if @revise_x == nil and @revise_y == nil
  69.       @revise_x = 0
  70.       @revise_y = 0
  71.     end
  72.     unless @dot_m
  73.       update_original
  74.       return
  75.     end
  76.     if @move_route_forcing
  77.       # ローカル変数に移動中かどうかを記憶
  78.       last_moving = moving?
  79.       # ローカル変数に座標を記憶
  80.       last_real_x = @real_x
  81.       last_real_y = @real_y
  82.       # 座標がずれている場合
  83.       if (@revise_x != 0 or @revise_y != 0) and not jumping? and @move == true
  84.         if @revise_x != @real_x - @x * 128 or @revise_y != @real_y - @y * 128
  85.           @revise_x = @real_x - @x * 128
  86.           @revise_y = @real_y - @y * 128
  87.         end
  88.         # 移動距離distance1と目標距離distance2を設定
  89.         distance1 = 2 ** @move_speed
  90.         distance2 = Math.sqrt(@revise_x ** 2 + @revise_y ** 2)
  91.         # 移動距離が目標距離を越えた場合
  92.         if distance1 > distance2
  93.           # 強制的に補正座標を零にする
  94.           @real_x = @real_x - @revise_x
  95.           @real_y = @real_y - @revise_y
  96.           @revise_x = 0
  97.           @revise_y = 0
  98.           anime_update
  99.         # 移動距離が目標距離に達しない場合
  100.         else
  101.           # 移動距離分目標距離に近づく
  102.           @real_x -= (distance1 * @revise_x / distance2).round
  103.           @real_y -= (distance1 * @revise_y / distance2).round
  104.           @revise_x = @real_x - @x * 128
  105.           @revise_y = @real_y - @y * 128
  106.           anime_update
  107.         end
  108.       else
  109.         super
  110.       end
  111.     else
  112.       @move = false
  113.       # 移動中、イベント実行中、移動ルート強制中、
  114.       # メッセージウィンドウ表示中のいずれでもない場合
  115.       unless moving? or $game_system.map_interpreter.running? or
  116.              @move_route_forcing or $game_temp.message_window_showing
  117.         @event_run = false
  118.         # 方向ボタンが押されていれば、その方向へプレイヤーを移動
  119. #---------------------------上下失效-----------------------------------------
  120.       case Input.dir8
  121.         when 1
  122.           $ud_ok ? move_lower_left_p : move_left_p
  123.         when 2
  124. #          $ud_ok ? move_down_p : move_down_aaaagq
  125.           move_down_p if $ud_ok
  126.         when 3
  127.          $ud_ok ? move_lower_right_p : move_right_p
  128.         when 4
  129.           move_left_p
  130.         when 6
  131.           move_right_p
  132.         when 7
  133.          $ud_ok ? move_upper_left_p : move_left_p
  134.         when 8
  135. #         $ud_ok ? move_up_p : move_up_aaaagq
  136.          move_up_p if $ud_ok
  137.         when 9
  138.          $ud_ok ? move_upper_right_p : move_right_p
  139.         end
  140.       end
  141.       # ローカル変数に座標を記憶
  142.       last_real_x = @real_x
  143.       last_real_y = @real_y
  144.       # 移動処理
  145.       @real_x = @x * 128 + @revise_x
  146.       @real_y = @y * 128 + @revise_y
  147.       # ローカル変数に移動中かどうかを記憶
  148.       last_moving = moving?
  149.       # 座標更新
  150.       move_on
  151.       # 現在の座標と以前の座標が異なる場合
  152.       if (last_real_x != @real_x or last_real_y != @real_y)
  153.         @move_distance = 0 if @move_distance == nil
  154.         @move_distance += Math.sqrt((last_real_x - @real_x) ** 2 +
  155.                                       (last_real_y - @real_y) ** 2)
  156.         if @move_distance >= 128
  157.           @move_distance %= 128
  158.           increase_steps
  159.         end
  160.         # アニメーションを更新
  161.         anime_update
  162.       else
  163.         @pattern = 0
  164.       end
  165.     end
  166.     # キャラクターが下に移動し、かつ画面上の位置が中央より下の場合
  167.     if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  168.       # マップを下にスクロール
  169.       $game_map.scroll_down(@real_y - last_real_y)
  170.     end
  171.     # キャラクターが左に移動し、かつ画面上の位置が中央より左の場合
  172.     if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  173.       # マップを左にスクロール
  174.       $game_map.scroll_left(last_real_x - @real_x)
  175.     end
  176.     # キャラクターが右に移動し、かつ画面上の位置が中央より右の場合
  177.     if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  178.       # マップを右にスクロール
  179.       $game_map.scroll_right(@real_x - last_real_x)
  180.     end
  181.     # キャラクターが上に移動し、かつ画面上の位置が中央より上の場合
  182.     if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  183.       # マップを上にスクロール
  184.       $game_map.scroll_up(last_real_y - @real_y)
  185.     end
  186.     # 前回プレイヤーが移動中だった場合
  187.     if last_moving
  188.       # 同位置のイベントとの接触によるイベント起動判定
  189.       result = check_event_trigger_here([1,2])
  190.       if result == true
  191.         if (last_real_x / 128.0).round != @x and
  192.             (last_real_y / 128.0).round != @y
  193.           if @direction == 2 or @direction == 8
  194.             if (last_real_x / 128.0).round > @x
  195.               turn_left
  196.             else
  197.               turn_right
  198.             end
  199.           else
  200.             if (last_real_y / 128.0).round > @y
  201.               turn_up
  202.             else
  203.               turn_down
  204.             end
  205.           end
  206.         elsif (last_real_x / 128.0).round > @x
  207.           turn_left
  208.         elsif (last_real_x / 128.0).round < @x
  209.           turn_right
  210.         elsif (last_real_y / 128.0).round > @y
  211.           turn_up
  212.         elsif (last_real_y / 128.0).round < @y
  213.           turn_down
  214.         end
  215.       end
  216.       # 起動したイベントがない場合
  217.       if result == false
  218.         # デバッグモードが ON かつ CTRL キーが押されている場合を除き
  219.         unless $DEBUG and Input.press?(Input::CTRL)
  220.           # エンカウント カウントダウン
  221.           if @encounter_count > 0
  222.             @encounter_count -= 1
  223.           end
  224.         end
  225.       end
  226.     end
  227. #-----------------------按跳跃-----------------------------------------------
  228. # A ボタンが押された場合
  229.     if Input.press?(Input::A) and not $ud_ok
  230.       @twojump = 1 if @twojump == 0 and down1(((@x * 128 + @revise_x) / 128.0).round,
  231.           ((@y * 128 + @revise_y) / 128.0).round, 5, true)
  232.       if (not @apassed) and @twojump <= $airjump
  233.         @apassed = true
  234.         @jumpnow = JUMPMAX
  235.         @twojump += 1
  236.       else
  237.         @jumpnow += 3        
  238.       end
  239.     else
  240.       @apassed = false
  241.     end
  242. #----------------------自由落体--------------------------------
  243.     if not $ud_ok
  244.       @jumpnow -= 10
  245.       if @jumpnow < 0
  246.         @jumpnow = [@jumpnow, -JUMPMAX].max
  247.         if not down1(((@x * 128 + @revise_x) / 128.0).round,
  248.           ((@y * 128 + @revise_y) / 128.0).round, -@jumpnow, true)
  249.           @jumpnow = 0
  250.           @twojump = 0
  251.         end
  252.       elsif @jumpnow > 0
  253.         @jumpnow = [@jumpnow, JUMPMAX].min
  254.         if not up1(((@x * 128 + @revise_x) / 128.0).round,
  255.           ((@y * 128 + @revise_y) / 128.0).round, @jumpnow, true)
  256.           @jumpnow = 0
  257.         end
  258.       end
  259.     end
  260.     if Input.trigger?(Input::C)
  261.       # 同位置および正面のイベント起動判定
  262.       check_event_trigger_here([0])
  263.       check_event_trigger_there([0,1,2])
  264.     end
  265.   end
  266.   #--------------------------------------------------------------------------
  267.   # ● オブジェクト初期化
  268.   #--------------------------------------------------------------------------
  269.   def initialize
  270.     @jumpnow = 0
  271.     @twojump = 0
  272.     @apassed = false
  273.     @revise_x = 0
  274.     @revise_y = 0
  275.     @move == false
  276.     super
  277.   end
  278.   #--------------------------------------------------------------------------
  279.   # ● 移動判定
  280.   #--------------------------------------------------------------------------
  281.   def moving?
  282.     unless @dot_m
  283.       result = super
  284.       return result
  285.     end
  286.     # 強制移動の場合オリジナルの判定をさせる
  287.     if @move_route_forcing
  288.       if @move == false
  289.         return false
  290.       end
  291.       super
  292.     # 通常時は現座標が実座標と異なる場合のみ移動中と判定
  293.     else
  294.       return (@x != (@real_x / 128.0).round or @y != (@real_y / 128.0).round)
  295.     end
  296.   end
  297.   #--------------------------------------------------------------------------
  298.   # ● 移動判定
  299.   #--------------------------------------------------------------------------
  300.   def moving_a?
  301.     if @move == false
  302.       if (@move_route.list[@move_route_index].code <= 14 or
  303.           @move_route.list[@move_route_index].code == 25)
  304.         @move = true
  305.       end
  306.       return false
  307.     end
  308.     moving?
  309.   end
  310.   #--------------------------------------------------------------------------
  311.   # ● フレーム更新 (ジャンプ)
  312.   #--------------------------------------------------------------------------
  313.   def update_jump
  314.     # ジャンプカウントを 1 減らす
  315.     @jump_count -= 1
  316.     # 新しい座標を計算
  317.     @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
  318.     @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
  319.     if @jump_count == 0
  320.       @revise_x = 0
  321.       @revise_y = 0
  322.     end
  323.   end
  324.   #--------------------------------------------------------------------------
  325.   # ● 移動タイプ : カスタム
  326.   #--------------------------------------------------------------------------
  327.   def move_type_custom
  328.     unless @dot_m
  329.       super
  330.       return
  331.     end
  332.     # 停止中でなければ中断
  333.     if jumping? or moving_a?
  334.       return
  335.     end
  336.     # 移動コマンドのリストの最後に到達するまでループ
  337.     while @move_route_index < @move_route.list.size
  338.       # 移動コマンドを取得
  339.       command = @move_route.list[@move_route_index]
  340.       # コマンドコード 0 番 (リストの最後) の場合
  341.       if command.code == 0
  342.         # オプション [動作を繰り返す] が ON の場合
  343.         if @move_route.repeat
  344.           # 移動ルートのインデックスを最初に戻す
  345.           @move_route_index = 0
  346.         end
  347.         # オプション [動作を繰り返す] が OFF の場合
  348.         unless @move_route.repeat
  349.           # 移動ルート強制中の場合
  350.           if @move_route_forcing and not @move_route.repeat
  351.             # 移動ルートの強制を解除
  352.             @move_route_forcing = false
  353.             # オリジナルの移動ルートを復帰
  354.             @move_route = @original_move_route
  355.             @move_route_index = @original_move_route_index
  356.             @original_move_route = nil
  357.           end
  358.           # 停止カウントをクリア
  359.           @stop_count = 0
  360.         end
  361.         return
  362.       end
  363.       # 移動系コマンド (下に移動~ジャンプ) の場合
  364.       if command.code <= 14
  365.         # コマンドコードで分岐
  366.         case command.code
  367.         when 1  # 下に移動
  368.           move_down
  369.         when 2  # 左に移動
  370.           move_left
  371.         when 3  # 右に移動
  372.           move_right
  373.         when 4  # 上に移動
  374.           move_up
  375.         when 5  # 左下に移動
  376.           move_lower_left
  377.         when 6  # 右下に移動
  378.           move_lower_right
  379.         when 7  # 左上に移動
  380.           move_upper_left
  381.         when 8  # 右上に移動
  382.           move_upper_right
  383.         when 9  # ランダムに移動
  384.           move_random
  385.         when 10  # プレイヤーに近づく
  386.           move_toward_player
  387.         when 11  # プレイヤーから遠ざかる
  388.           move_away_from_player
  389.         when 12  # 一歩前進
  390.           move_forward
  391.         when 13  # 一歩後退
  392.           move_backward
  393.         when 14  # ジャンプ
  394.           jump(command.parameters[0], command.parameters[1])
  395.         end
  396.         # オプション [移動できない場合は無視] が OFF で、移動失敗の場合
  397.         if not @move_route.skippable and not moving? and not jumping?
  398.           return
  399.         end
  400.         @move_route_index += 1
  401.         return
  402.       end
  403.       # ウェイトの場合
  404.       if command.code == 15
  405.         # ウェイトカウントを設定
  406.         @wait_count = command.parameters[0] * 2 - 1
  407.         @move_route_index += 1
  408.         return
  409.       end
  410.       # 向き変更系のコマンドの場合
  411.       if command.code >= 16 and command.code <= 26
  412.         # コマンドコードで分岐
  413.         case command.code
  414.         when 16  # 下を向く
  415.           turn_down
  416.         when 17  # 左を向く
  417.           turn_left
  418.         when 18  # 右を向く
  419.           turn_right
  420.         when 19  # 上を向く
  421.           turn_up
  422.         when 20  # 右に 90 度回転
  423.           turn_right_90
  424.         when 21  # 左に 90 度回転
  425.           turn_left_90
  426.         when 22  # 180 度回転
  427.           turn_180
  428.         when 23  # 右か左に 90 度回転
  429.           turn_right_or_left_90
  430.         when 24  # ランダムに方向転換
  431.           turn_random
  432.         when 25  # プレイヤーの方を向く
  433.           turn_toward_player
  434.         when 26  # プレイヤーの逆を向く
  435.           turn_away_from_player
  436.         end
  437.         @move_route_index += 1
  438.         return
  439.       end
  440.       # その他のコマンドの場合
  441.       if command.code >= 27
  442.         # コマンドコードで分岐
  443.         case command.code
  444.         when 27  # スイッチ ON
  445.           $game_switches[command.parameters[0]] = true
  446.           $game_map.need_refresh = true
  447.         when 28  # スイッチ OFF
  448.           $game_switches[command.parameters[0]] = false
  449.           $game_map.need_refresh = true
  450.         when 29  # 移動速度の変更
  451.           @move_speed = command.parameters[0]
  452.         when 30  # 移動頻度の変更
  453.           @move_frequency = command.parameters[0]
  454.         when 31  # 移動時アニメ ON
  455.           @walk_anime = true
  456.         when 32  # 移動時アニメ OFF
  457.           @walk_anime = false
  458.         when 33  # 停止時アニメ ON
  459.           @step_anime = true
  460.         when 34  # 停止時アニメ OFF
  461.           @step_anime = false
  462.         when 35  # 向き固定 ON
  463.           @direction_fix = true
  464.         when 36  # 向き固定 OFF
  465.           @direction_fix = false
  466.         when 37  # すり抜け ON
  467.           @through = true
  468.         when 38  # すり抜け OFF
  469.           @through = false
  470.         when 39  # 最前面に表示 ON
  471.           @always_on_top = true
  472.         when 40  # 最前面に表示 OFF
  473.           @always_on_top = false
  474.         when 41  # グラフィック変更
  475.           @tile_id = 0
  476.           @character_name = command.parameters[0]
  477.           @character_hue = command.parameters[1]
  478.           if @original_direction != command.parameters[2]
  479.             @direction = command.parameters[2]
  480.             @original_direction = @direction
  481.             @prelock_direction = 0
  482.           end
  483.           if @original_pattern != command.parameters[3]
  484.             @pattern = command.parameters[3]
  485.             @original_pattern = @pattern
  486.           end
  487.         when 42  # 不透明度の変更
  488.           @opacity = command.parameters[0]
  489.         when 43  # 合成方法の変更
  490.           @blend_type = command.parameters[0]
  491.         when 44  # SE の演奏
  492.           $game_system.se_play(command.parameters[0])
  493.         when 45  # スクリプト
  494.           result = eval(command.parameters[0])
  495.         end
  496.         @move_route_index += 1
  497.         return
  498.       end
  499.     end
  500.   end
  501.   #--------------------------------------------------------------------------
  502.   # ● 下に移動
  503.   #--------------------------------------------------------------------------
  504.   def move_down_p
  505.     # 下を向く
  506.     turn_down
  507.     # 移動距離を算出
  508.     distance = 2 ** @move_speed
  509.     down1(((@x * 128 + @revise_x) / 128.0).round,
  510.           ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  511.   end
  512.   def move_down_aaaagq
  513.     distance = 2 ** @move_speed
  514.     down1(((@x * 128 + @revise_x) / 128.0).round,
  515.           ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  516.   end
  517.   #--------------------------------------------------------------------------
  518.   # ● 下に移動可能かどうかの判定1
  519.   #--------------------------------------------------------------------------
  520.   def down1(x, y, distance, down = false)
  521.     result = down2(x, y, distance)
  522.     if result == false
  523.       @event_run = check_event_trigger_touch(x, y+1)
  524.       return result
  525.     end
  526.     if @revise_x < -SIDE
  527.       result = down2(x, y + 1, distance, 4)
  528.       result &= down2(x - 1, y, distance)
  529.       if result == false
  530.         if down
  531.           move_lower_right_p
  532.           if @revise_x > SIDE
  533.             @revise_x = SIDE
  534.           end
  535.         end
  536.         return result
  537.       end
  538.     elsif @revise_x > SIDE
  539.       result = down2(x, y + 1, distance, 6)
  540.       result &= down2(x + 1, y, distance)
  541.       if result == false
  542.         if down
  543.           move_lower_left_p
  544.           if @revise_x < -SIDE
  545.             @revise_x = -SIDE
  546.           end
  547.         end
  548.         return result
  549.       end
  550.     end
  551.     # 下に移動可能ならば距離分移動
  552.     @revise_y += distance
  553.     return result
  554.   end
  555.   #--------------------------------------------------------------------------
  556.   # ● 下に移動可能かどうかの判定2
  557.   #--------------------------------------------------------------------------
  558.   def down2(x, y, distance, d = 2)
  559.     if @revise_y + distance > DOWN
  560.       unless passable?(x, y, d)
  561.         if @revise_y < DOWN
  562.           @revise_y = DOWN
  563.         end
  564.         return false
  565.       end
  566.     end
  567.     return true
  568.   end
  569.   #--------------------------------------------------------------------------
  570.   # ● 左に移動
  571.   #--------------------------------------------------------------------------
  572.   def move_left_p
  573.     # 左を向く
  574.     turn_left
  575.     distance = 2 ** @move_speed
  576.     left1(((@x * 128 + @revise_x) / 128.0).round,
  577.           ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  578.   end
  579.   #--------------------------------------------------------------------------
  580.   # ● 左に移動可能かどうかの判定1
  581.   #--------------------------------------------------------------------------
  582.   def left1(x, y, distance, left = false)
  583.     result = left2(x, y, distance)
  584.     if result == false
  585.       @event_run = check_event_trigger_touch(x-1, y)
  586.       return result
  587.     end
  588.     if @revise_y < -UP and $ud_ok
  589.       result = left2(x - 1, y, distance, 8)
  590.       result &= left2(x, y - 1, distance)
  591.       if result == false
  592.         if left
  593.           move_lower_left_p
  594.           if @revise_y > DOWN
  595.             @revise_y = DOWN
  596.           end
  597.         end
  598.         return result
  599.       end
  600.     elsif @revise_y > DOWN and $ud_ok
  601.       result = left2(x - 1, y, distance, 2)
  602.       result &= left2(x, y + 1, distance)
  603.       if result == false
  604.         if left
  605.           move_upper_left_p
  606.           if @revise_y < -UP
  607.             @revise_y = -UP
  608.           end
  609.         end
  610.         return result
  611.       end
  612.     end
  613.     @revise_x -= distance
  614.     return result
  615.   end
  616.   #--------------------------------------------------------------------------
  617.   # ● 左に移動可能かどうかの判定2
  618.   #--------------------------------------------------------------------------
  619.   def left2(x, y, distance, d = 4)
  620.     if @revise_x - distance < -SIDE
  621.       unless passable?(x, y, d)
  622.         if @revise_x > -SIDE
  623.           @revise_x = -SIDE
  624.         end
  625.         return false
  626.       end
  627.     end
  628.     return true
  629.   end
  630.   #--------------------------------------------------------------------------
  631.   # ● 右に移動
  632.   #--------------------------------------------------------------------------
  633.   def move_right_p
  634.       # 右を向く
  635.       turn_right
  636.     distance = 2 ** @move_speed
  637.     right1(((@x * 128 + @revise_x) / 128.0).round,
  638.             ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  639.   end
  640.   #--------------------------------------------------------------------------
  641.   # ● 右に移動可能かどうかの判定1
  642.   #--------------------------------------------------------------------------
  643.   def right1(x, y, distance, right = false)
  644.     result = right2(x, y, distance)
  645.     if result == false
  646.       @event_run = check_event_trigger_touch(x+1, y)
  647.       return result
  648.     end
  649.     if @revise_y < -UP and $ud_ok
  650.       result = right2(x + 1, y, distance, 8)
  651.       result &= right2(x, y - 1, distance)
  652.       if result == false
  653.         if right
  654.           move_lower_right_p
  655.           if @revise_y > DOWN
  656.             @revise_y = DOWN
  657.           end
  658.         end
  659.         return result
  660.       end
  661.     elsif @revise_y > DOWN and $ud_ok
  662.       result = right2(x + 1, y, distance, 2)
  663.       result &= right2(x, y + 1, distance)
  664.       if result == false
  665.         if right
  666.           move_upper_right_p
  667.           if @revise_y < -UP
  668.             @revise_y = -UP
  669.           end
  670.         end
  671.         return result
  672.       end
  673.     end
  674.     @revise_x += distance
  675.     return result
  676.   end
  677.   #--------------------------------------------------------------------------
  678.   # ● 右に移動可能かどうかの判定2
  679.   #--------------------------------------------------------------------------
  680.   def right2(x, y, distance, d = 6)
  681.     if @revise_x + distance > SIDE
  682.       unless passable?(x, y, d)
  683.         if @revise_x < SIDE
  684.           @revise_x = SIDE
  685.         end
  686.         return false
  687.       end
  688.     end
  689.     return true
  690.   end
  691.   #--------------------------------------------------------------------------
  692.   # ● 上に移動
  693.   #--------------------------------------------------------------------------
  694.   def move_up_p
  695.     # 上を向く
  696.     turn_up
  697.     # 下に移動
  698.     distance = 2 ** @move_speed
  699.     up1(((@x * 128 + @revise_x) / 128.0).round,
  700.         ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  701.   end
  702.   def move_up_aaaagq
  703.     distance = 2 ** @move_speed
  704.     up1(((@x * 128 + @revise_x) / 128.0).round,
  705.         ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  706.   end
  707.   #--------------------------------------------------------------------------
  708.   # ● 上に移動可能かどうかの判定1
  709.   #--------------------------------------------------------------------------
  710.   def up1(x, y, distance, up = false)
  711.     result = up2(x, y, distance)
  712.     if result == false
  713.       @event_run = check_event_trigger_touch(x, y-1)
  714.       return result
  715.     end
  716.     if @revise_x < -SIDE
  717.       result = up2(x, y - 1, distance, 4)
  718.       result &= up2(x - 1, y, distance)
  719.       if result == false
  720.         if up
  721.           move_upper_right_p
  722.           if @revise_x > SIDE
  723.             @revise_x = SIDE
  724.           end
  725.         end
  726.         return result
  727.       end
  728.     elsif @revise_x > SIDE
  729.       result = up2(x, y - 1, distance, 6)
  730.       result &= up2(x + 1, y, distance)
  731.       if result == false
  732.         if up
  733.           move_upper_left_p
  734.           if @revise_x < -SIDE
  735.             @revise_x = -SIDE
  736.           end
  737.         end
  738.         return result
  739.       end
  740.     end
  741.     @revise_y -= distance
  742.     return result
  743.   end
  744.   #--------------------------------------------------------------------------
  745.   # ● 上に移動可能かどうかの判定2
  746.   #--------------------------------------------------------------------------
  747.   def up2(x, y, distance, d = 8)
  748.     if @revise_y - distance < -UP
  749.       unless passable?(x, y, d)
  750.         if @revise_y > -UP
  751.           @revise_y = -UP
  752.         end
  753.         return false
  754.       end
  755.     end
  756.     return true
  757.   end
  758.   #--------------------------------------------------------------------------
  759.   # ● 左下に移動
  760.   #--------------------------------------------------------------------------
  761.   def move_lower_left_p
  762.     # 向き固定でない場合
  763.     unless @direction_fix
  764.       # 右向きだった場合は左を、上向きだった場合は下を向く
  765.       @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
  766.     end
  767.     # 左下に移動
  768.     distance = (2 ** @move_speed) / Math.sqrt(2)
  769.     if @direction == 2
  770.       turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
  771.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  772.       turn_down if @event_run
  773.       unless @event_run
  774.         if last_move?(@real_x, @real_y, 2, distance)
  775.           result = check_event_trigger_here([1,2], false)
  776.           if result == true
  777.             return
  778.           end
  779.         end
  780.         move_on
  781.         if @revise_y > DOWN and -UP > @revise_y - distance
  782.           @revise_y = DOWN
  783.         end
  784.         turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
  785.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  786.         turn_left if @event_run
  787.       end
  788.     else
  789.       turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
  790.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  791.       turn_left if @event_run
  792.       unless @event_run
  793.         if last_move?(@real_x, @real_y, 4, distance)
  794.           result = check_event_trigger_here([1,2], false)
  795.           if result == true
  796.             return
  797.           end
  798.         end
  799.         move_on
  800.         if  @revise_x + distance> SIDE and -SIDE > @revise_x
  801.           @revise_x = -SIDE
  802.         end
  803.         turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
  804.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  805.         turn_down if @event_run
  806.       end
  807.     end
  808.   end
  809.   #--------------------------------------------------------------------------
  810.   # ● 右下に移動
  811.   #--------------------------------------------------------------------------
  812.   def move_lower_right_p
  813.     # 向き固定でない場合
  814.     unless @direction_fix
  815.       # 左向きだった場合は右を、上向きだった場合は下を向く
  816.       @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
  817.     end
  818.     # 右下に移動
  819.     distance = (2 ** @move_speed) / Math.sqrt(2)
  820.     if @direction == 2
  821.       turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
  822.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  823.       turn_down if @event_run
  824.       unless @event_run
  825.         if last_move?(@real_x, @real_y, 2, distance)
  826.           result = check_event_trigger_here([1,2], false)
  827.           if result == true
  828.             return
  829.           end
  830.         end
  831.         move_on
  832.         if @revise_y > DOWN and -UP > @revise_y - distance
  833.           @revise_y = DOWN
  834.         end
  835.         turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
  836.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  837.         turn_right if @event_run
  838.       end
  839.     else
  840.       turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
  841.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  842.       turn_right if @event_run
  843.       unless @event_run
  844.         if last_move?(@real_x, @real_y, 6, distance)
  845.           result = check_event_trigger_here([1,2], false)
  846.           if result == true
  847.             return
  848.           end
  849.         end
  850.         move_on
  851.         if @revise_x > SIDE and -SIDE > @revise_x - distance
  852.           @revise_x = SIDE
  853.         end
  854.         turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
  855.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  856.         turn_down if @event_run
  857.       end
  858.     end
  859.   end
  860.   #--------------------------------------------------------------------------
  861.   # ● 左上に移動
  862.   #--------------------------------------------------------------------------
  863.   def move_upper_left_p
  864.     # 向き固定でない場合
  865.     unless @direction_fix
  866.       # 右向きだった場合は左を、下向きだった場合は上を向く
  867.       @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
  868.     end
  869.     # 左上に移動
  870.     distance = (2 ** @move_speed) / Math.sqrt(2)
  871.     if @direction == 8
  872.       turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
  873.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  874.       turn_up if @event_run
  875.       unless @event_run
  876.         if last_move?(@real_x, @real_y, 8, distance)
  877.           result = check_event_trigger_here([1,2], false)
  878.           if result == true
  879.             return
  880.           end
  881.         end
  882.         move_on
  883.         if @revise_y + distance > DOWN and -UP > @revise_y
  884.           @revise_y = -UP
  885.         end
  886.         turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
  887.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  888.         turn_left if @event_run
  889.       end
  890.     else
  891.       turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
  892.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  893.       turn_left if @event_run
  894.       unless @event_run
  895.         if last_move?(@real_x, @real_y, 4, distance)
  896.           result = check_event_trigger_here([1,2], false)
  897.           if result == true
  898.             return
  899.           end
  900.         end
  901.         move_on
  902.         if @revise_x > SIDE and -SIDE > @revise_x - distance
  903.           @revise_x = SIDE
  904.         end
  905.         turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
  906.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  907.         turn_up if @event_run
  908.       end
  909.     end
  910.   end
  911.   #--------------------------------------------------------------------------
  912.   # ● 右上に移動
  913.   #--------------------------------------------------------------------------
  914.   def move_upper_right_p
  915.     # 向き固定でない場合
  916.     unless @direction_fix
  917.       # 左向きだった場合は右を、下向きだった場合は上を向く
  918.       @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
  919.     end
  920.     # 右上に移動
  921.     distance = (2 ** @move_speed) / Math.sqrt(2)
  922.     if @direction == 8
  923.       turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
  924.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  925.       turn_up if @event_run
  926.       unless @event_run
  927.         if last_move?(@real_x, @real_y, 8, distance)
  928.           result = check_event_trigger_here([1,2], false)
  929.           if result == true
  930.             return
  931.           end
  932.         end
  933.         move_on
  934.         if @revise_y + distance > DOWN and -UP > @revise_y
  935.           @revise_y = -UP
  936.         end
  937.         turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
  938.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  939.         turn_right if @event_run
  940.       end
  941.     else
  942.       turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
  943.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  944.       turn_right if @event_run
  945.       unless @event_run
  946.         if last_move?(@real_x, @real_y, 6, distance)
  947.           result = check_event_trigger_here([1,2], false)
  948.           if result == true
  949.             return
  950.           end
  951.         end
  952.         move_on
  953.         if @revise_x > SIDE and -SIDE > @revise_x - distance
  954.           @revise_x = SIDE
  955.         end
  956.         turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
  957.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  958.         turn_up if @event_run
  959.       end
  960.     end
  961.   end
  962.   #--------------------------------------------------------------------------
  963.   # ● 同位置のイベント起動判定
  964.   #--------------------------------------------------------------------------
  965.   def check_event_trigger_here(triggers, run = true)
  966.     result = false
  967.     # イベント実行中の場合
  968.     if $game_system.map_interpreter.running?
  969.       return result
  970.     end
  971.     # 全イベントのループ
  972.     for event in $game_map.events.values
  973.       # イベントの座標とトリガーが一致した場合
  974.       if event.x == ((@x * 128 + @revise_x) / 128.0).round and
  975.           event.y == ((@y * 128 + @revise_y) / 128.0).round and
  976.           triggers.include?(event.trigger)
  977.         # ジャンプ中以外で、起動判定が同位置のイベントなら
  978.         if not event.jumping? and event.over_trigger?
  979.           if event.list.size > 1
  980.             if run == true
  981.               event.start
  982.             end
  983.             result = true
  984.           end
  985.         end
  986.       end
  987.     end
  988.     return result
  989.   end
  990.   #--------------------------------------------------------------------------
  991.   # ● 座標修正
  992.   #--------------------------------------------------------------------------
  993.   def move_on
  994.     if @y < (@y + @revise_y / 128.0).round
  995.       @y += 1
  996.       @revise_y -= 128
  997.     end
  998.     if @x > (@x + @revise_x / 128.0).round
  999.       @x -= 1
  1000.       @revise_x += 128
  1001.     end
  1002.     if @x < (@x + @revise_x / 128.0).round
  1003.       @x += 1
  1004.       @revise_x -= 128
  1005.     end
  1006.     if @y > (@y + @revise_y / 128.0).round
  1007.       @y -= 1
  1008.       @revise_y += 128
  1009.     end
  1010.   end
  1011.   #--------------------------------------------------------------------------
  1012.   # ● アニメーションアップデート
  1013.   #--------------------------------------------------------------------------
  1014.   def anime_update
  1015.     # 移動時アニメが ON の場合
  1016.     if @walk_anime
  1017.       # アニメカウントを 1.5 増やす
  1018.       @anime_count += 1.5
  1019.     # 移動時アニメが OFF で、停止時アニメが ON の場合
  1020.     elsif @step_anime
  1021.       # アニメカウントを 1 増やす
  1022.       @anime_count += 1
  1023.     end
  1024.     # アニメカウントが最大値を超えた場合
  1025.     # ※最大値は、基本値 18 から移動速度 * 1 を引いた値
  1026.     if @anime_count > 18 - @move_speed * 2
  1027.       # 停止時アニメが OFF かつ 停止中の場合
  1028.       if not @step_anime and @stop_count > 0
  1029.         # パターンをオリジナルに戻す
  1030.         @pattern = @original_pattern
  1031.       # 停止時アニメが ON または 移動中の場合
  1032.       else
  1033.         # パターンを更新
  1034.         @pattern = (@pattern + 1) % 4
  1035.       end
  1036.       # アニメカウントをクリア
  1037.       @anime_count = 0
  1038.     end
  1039.   end
  1040.   #--------------------------------------------------------------------------
  1041.   # ● 指定位置に移動
  1042.   #--------------------------------------------------------------------------
  1043.   # オリジナルのイベントを改名
  1044.   alias :moveto_original :moveto
  1045.   def moveto(x, y)
  1046.     # 補正座標を初期化
  1047.     @revise_x = 0
  1048.     @revise_y = 0
  1049.     # オリジナルのイベントを呼び出し
  1050.     moveto_original(x, y)
  1051.   end
  1052.   #--------------------------------------------------------------------------
  1053.   # ● 移動したかどうかの判定
  1054.   #--------------------------------------------------------------------------
  1055.   def last_move?(x, y, direction, distance)
  1056.     if direction == 2 or direction == 6
  1057.       distance *= -1
  1058.     end
  1059.     if (direction == 2 or direction == 8) and
  1060.         (y / 128.0).round != ((y - distance) / 128.0).round
  1061.       return true
  1062.     end
  1063.     if (direction == 4 or direction == 6) and
  1064.         (x / 128.0).round != ((x - distance) / 128.0).round
  1065.       return true
  1066.     end
  1067.     return false
  1068.   end
  1069. end

  1070. #==============================================================================
  1071. # ■ Game_Character (分割定義 1)
  1072. #------------------------------------------------------------------------------
  1073. #  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event
  1074. # クラスのスーパークラスとして使用されます。
  1075. #==============================================================================

  1076. class Game_Character
  1077.   #--------------------------------------------------------------------------
  1078.   # ● フレーム更新 (移動)
  1079.   #--------------------------------------------------------------------------
  1080.   def update_move
  1081.     # 移動速度からマップ座標系での移動距離に変換
  1082.     distance = 4 ** @move_speed
  1083.     if @x * 128 != @real_x and @y * 128 != @real_y and Game_Player::SLANT
  1084.       distance /= Math.sqrt(2)
  1085.     end
  1086.     # 論理座標が実座標より下の場合
  1087.     if @y * 128 > @real_y
  1088.       # 下に移動
  1089.       @real_y = [@real_y + distance, @y * 128].min
  1090.     end
  1091.     # 論理座標が実座標より左の場合
  1092.     if @x * 128 < @real_x
  1093.       # 左に移動
  1094.       @real_x = [@real_x - distance, @x * 128].max
  1095.     end
  1096.     # 論理座標が実座標より右の場合
  1097.     if @x * 128 > @real_x
  1098.       # 右に移動
  1099.       @real_x = [@real_x + distance, @x * 128].min
  1100.     end
  1101.     # 論理座標が実座標より上の場合
  1102.     if @y * 128 < @real_y
  1103.       # 上に移動
  1104.       @real_y = [@real_y - distance, @y * 128].max
  1105.     end
  1106.     # 移動時アニメが ON の場合
  1107.     if @walk_anime
  1108.       # アニメカウントを 1.5 増やす
  1109.       @anime_count += 1.5
  1110.     # 移動時アニメが OFF で、停止時アニメが ON の場合
  1111.     elsif @step_anime
  1112.       # アニメカウントを 1 増やす
  1113.       @anime_count += 1
  1114.     end
  1115.   end
  1116. end

  1117. #==============================================================================
  1118. # ■ Game_Event
  1119. #------------------------------------------------------------------------------
  1120. #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
  1121. # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
  1122. #==============================================================================

  1123. class Game_Event < Game_Character
  1124.   #--------------------------------------------------------------------------
  1125.   # ● イベント起動
  1126.   #--------------------------------------------------------------------------
  1127.   def start
  1128.     # 実行内容が空でない場合
  1129.     if @list.size > 1
  1130.       # $game_player.event が0でない場合
  1131.       if $game_player.event != 0
  1132.         # 移動速度を $game_player.event にする
  1133.         $game_player.move_speed = $game_player.event
  1134.       end
  1135.       @starting = true
  1136.     end
  1137.   end
  1138. end

  1139. #==============================================================================
  1140. # 本脚本来自奇兵RPG,使用和转载请保留此信息
  1141. #==============================================================================
复制代码
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-11-27 04:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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