赞 | 0 |
VIP | 34 |
好人卡 | 0 |
积分 | 1 |
经验 | 15312 |
最后登录 | 2014-8-14 |
在线时间 | 584 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 584 小时
- 注册时间
- 2009-8-19
- 帖子
- 424
|
4楼
楼主 |
发表于 2011-8-28 12:56:39
|
只看该作者
本帖最后由 zyshra 于 2011-8-28 13:13 编辑
- $ud_ok = true #上下失效
- $airjump = 1 #空中连跳
- #==============================================================================
- # 本脚本来自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 = 80 #跳起的高度
- JUMPADD = 10
- #--------------------------------------------------------------------------
- # ● 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_reader :event # イベント時移動速度
- attr_accessor :move_speed # 移動速度
- #--------------------------------------------------------------------------
- # ● フレーム更新
- #--------------------------------------------------------------------------
- alias :update_original :update
- def update
- # @walk:歩行速度 @dash:ダッシュ時移動速度
- # @event:イベント時移動速度(0の時は、イベント時に速度変更をしない)
- @walk = 4
- @dash = 4 #按空格键加速后的速度值为4
- @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,使用和转载请保留此信息
- #==============================================================================
复制代码 |
|