赞 | 0 |
VIP | 465 |
好人卡 | 35 |
积分 | 11 |
经验 | 27106 |
最后登录 | 2020-5-5 |
在线时间 | 404 小时 |
Lv3.寻梦者 永久的旅行者
- 梦石
- 1
- 星屑
- 110
- 在线时间
- 404 小时
- 注册时间
- 2006-12-13
- 帖子
- 3091
|
本帖最后由 darkten 于 2009-10-2 13:29 编辑
在论坛某处无意中见到的...
没有试验过...
祝你成功...- class Game_Player < Game_Character
- #--------------------------------------------------------------------------
- # ● 定数
- #--------------------------------------------------------------------------
- TOP_SPACE = BOTTOM_SPACE = 16 # 上下の判定無視領域
- LEFT_SPACE = RIGHT_SPACE = 16 # 左右の判定無視領域
- #--------------------------------------------------------------------------
- # ● 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_accessor :dot_moving # ドット移動の向き(nil:ドット移動していない 0:止まっている)
- #--------------------------------------------------------------------------
- # ● 初期化
- #--------------------------------------------------------------------------
- def initialize
- super
- # ドット移動開始、立ち止まらせる
- @dot_moving = 0
- end
- #--------------------------------------------------------------------------
- # ● 移動中判定
- #--------------------------------------------------------------------------
- def moving?(by_update = false)
- # 呼び出し元がupdate以外で、かつドット移動中のとき
- if !by_update and @dot_moving
- # 立ち止まっていなければ移動中
- return @dot_moving != 0
- else
- # ドット移動中でなく、かつ論理座標と実座標が違っていれば移動中
- return (!@dot_moving and (@real_x != @x * 128 or @real_y != @y * 128))
- end
- end
- #--------------------------------------------------------------------------
- # ● 移動ルートの強制
- # move_route : 新しい移動ルート
- #--------------------------------------------------------------------------
- def force_move_route(move_route)
- # 立ち止まらせる
- @dot_moving = 0
- super(move_route)
- end
- #--------------------------------------------------------------------------
- # ● フレーム更新
- #--------------------------------------------------------------------------
- def update
- # ローカル変数に座標を記憶
- last_real_x, last_real_y = @real_x, @real_y
- last_x, last_y = @x, @y
- # ローカル変数に移動中かどうかを記憶
- last_moving = moving?(true)
- # 移動中、イベント実行中、移動ルート強制中、
- # メッセージウィンドウ表示中のいずれでもない場合
- unless moving?(true) or $game_system.map_interpreter.running? or
- @move_route_forcing or $game_temp.message_window_showing
- # ドット移動
- dot_move(Input.dir4)
- end
- super
- # キャラクターが下に移動し、かつ画面上の位置が中央より下の場合
- 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
- # 移動中ではない場合
- unless moving?(true)
- # 座標が更新されたか、ドット移動中でなく前回プレイヤーが移動中だった場合
- if last_x != @x or last_y != @y or (!@dot_moving and last_moving)
- # 同位置のイベントとの接触によるイベント起動判定
- result = check_event_trigger_here([1,2])
- # 起動したイベントがない場合
- if result == false
- # デバッグモードが ON かつ CTRL キーが押されている場合を除き
- unless $DEBUG and Input.press?(Input::CTRL)
- # エンカウント カウントダウン
- if @encounter_count > 0
- @encounter_count -= 1
- end
- end
- # 起動したイベントがある場合
- else
- # 立ち止まる、ドット移動していないならそのまま
- @dot_moving = @dot_moving ? 0 : nil
- end
- end
- # C ボタンが押された場合
- if Input.trigger?(Input::C)
- # 同位置および正面のイベント起動判定
- check_event_trigger_here([0])
- check_event_trigger_there([0,1,2])
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 移動タイプ : カスタム
- #--------------------------------------------------------------------------
- def move_type_custom
- # 停止中でなければ中断
- if jumping? or moving?
- 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
- # ドット移動強制終了
- @dot_moving = nil
- # コマンドコードで分岐
- 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
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● フレーム更新 (移動)
- #--------------------------------------------------------------------------
- def update_move
- # ドット移動中で無いなら論理座標更新
- unless @dot_moving
- # 移動速度からマップ座標系での移動距離に変換
- distance = 2 ** @move_speed
- # 論理座標が実座標より下の場合
- 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
- end
- # 移動時アニメが ON の場合
- if @walk_anime
- # アニメカウントを 1.5 増やす
- @anime_count += 1.5
- # 移動時アニメが OFF で、停止時アニメが ON の場合
- elsif @step_anime
- # アニメカウントを 1 増やす
- @anime_count += 1
- end
- end
- #--------------------------------------------------------------------------
- # ● ドット移動(追加)
- # dir : 方向(0,2,4,6,8)
- #--------------------------------------------------------------------------
- def dot_move(dir)
- @dot_moving = dir
- # 立ち止まっているかドット移動中でないならすぐにリターン
- if dir == 0 or !dir
- return
- end
- # 座標の保存
- last_real_x, last_real_y = @real_x, @real_y
- last_x, last_y = @x, @y
- # 移動速度からマップ座標系での移動距離に変換
- distance = 2 ** @move_speed
- # 座標を更新、進行方向側の二隅の座標を得る
- case dir
- when 2
- turn_down
- @real_y += distance
- dx, dy = 0, 1
- x1, y1 = @real_x + LEFT_SPACE, @real_y + 127 - BOTTOM_SPACE
- x2, y2 = @real_x + 127 - RIGHT_SPACE, y1
- when 4
- turn_left
- @real_x -= distance
- dx, dy = -1, 0
- x1, y1 = @real_x + LEFT_SPACE, @real_y + TOP_SPACE
- x2, y2 = x1, @real_y + 127 - BOTTOM_SPACE
- when 6
- turn_right
- @real_x += distance
- dx, dy = 1, 0
- x1, y1 = @real_x + 127 - RIGHT_SPACE, @real_y + TOP_SPACE
- x2, y2 = x1, @real_y + 127 - BOTTOM_SPACE
- when 8
- turn_up
- @real_y -= distance
- dx, dy = 0, -1
- x1, y1 = @real_x + LEFT_SPACE, @real_y + TOP_SPACE
- x2, y2 = @real_x + 127 - RIGHT_SPACE, y1
- end
- # 二隅がいずれもキャラクタの論理座標からはみ出している場合
- if (x1 / 128 != @x or y1 / 128 != @y) and (x2 / 128 != @x or y2 / 128 != @y)
- # 進行方向の二隅がともに通行可能か調べる
- @x, @y = x1 / 128 - dx, y1 / 128 - dy
- pass1 = passable?(@x, @y, dir)
- @x, @y = x2 / 128 - dx, y2 / 128 - dy
- pass2 = passable?(@x, @y, dir)
- # 座標を元に戻す
- @x, @y = last_x, last_y
- # 通行可能な場合
- if pass1 and pass2
- # 新しい実座標の計算
- @x, @y = (@real_x + 64) / 128, (@real_y + 64) / 128
- # 座標が変化したなら歩数更新
- if last_x != @x or last_y != @y
- increase_steps
- end
- # 通行不可能な場合
- else
- # 立ち止まる
- @dot_moving = 0
- # 実座標を矯正する
- case dir
- when 2
- @real_y = [(last_real_y + 64) / 128 * 128, last_real_y].max
- # 右側に寄っているとき
- if @real_x / 128 < @x
- # 右のイベントを先に処理
- x1, x2 = x2, x1
- end
- when 4
- @real_x = [(last_real_x + 64) / 128 * 128, last_real_x].min
- # 下側に寄っているとき
- if @real_y / 128 < @y
- # 下のイベントを先に処理
- y1, y2 = y2, y1
- end
- when 6
- @real_x = [(last_real_x + 64) / 128 * 128, last_real_x].max
- # 下側に寄っているとき
- if @real_y / 128 < @y
- # 下のイベントを先に処理
- y1, y2 = y2, y1
- end
- when 8
- @real_y = [(last_real_y + 64) / 128 * 128, last_real_y].min
- # 右側に寄っているとき
- if @real_x / 128 < @x
- # 右のイベントを先に処理
- x1, x2 = x2, x1
- end
- end
- # 接触イベントの起動判定(一つ起動したらもう一つは無視)
- check_event_trigger_touch(x1 / 128, y1 / 128) or
- check_event_trigger_touch(x2 / 128, y2 / 128)
- end
- end
- end
- end
- class Scene_Map
- def update
- # ループ
- loop do
- # マップ、インタプリタ、プレイヤーの順に更新
- # (この更新順序は、イベントを実行する条件が満たされているときに
- # プレイヤーに一瞬移動する機会を与えないなどの理由で重要)
- $game_map.update
- $game_system.map_interpreter.update
- $game_player.update
- # システム (タイマー)、画面を更新
- $game_system.update
- $game_screen.update
- # プレイヤーの場所移動中でなければループを中断
- unless $game_temp.player_transferring
- break
- end
- # 場所移動を実行
- transfer_player
- # トランジション処理中の場合、ループを中断
- if $game_temp.transition_processing
- break
- end
- end
- # スプライトセットを更新
- @spriteset.update
- # メッセージウィンドウを更新
- @message_window.update
- # ゲームオーバーの場合
- if $game_temp.gameover
- # ゲームオーバー画面に切り替え
- $scene = Scene_Gameover.new
- return
- end
- # タイトル画面に戻す場合
- if $game_temp.to_title
- # タイトル画面に切り替え
- $scene = Scene_Title.new
- return
- end
- # トランジション処理中の場合
- if $game_temp.transition_processing
- # トランジション処理中フラグをクリア
- $game_temp.transition_processing = false
- # トランジション実行
- if $game_temp.transition_name == ""
- Graphics.transition(20)
- else
- Graphics.transition(40, "Graphics/Transitions/" +
- $game_temp.transition_name)
- end
- end
- # メッセージウィンドウ表示中の場合
- if $game_temp.message_window_showing
- return
- end
- # エンカウント カウントが 0 で、エンカウントリストが空ではない場合
- if $game_player.encounter_count == 0 and $game_map.encounter_list != []
- # イベント実行中かエンカウント禁止中でなければ
- unless $game_system.map_interpreter.running? or
- $game_system.encounter_disabled
- # トループを決定
- n = rand($game_map.encounter_list.size)
- troop_id = $game_map.encounter_list[n]
- # トループが有効なら
- if $data_troops[troop_id] != nil
- # バトル呼び出しフラグをセット
- $game_temp.battle_calling = true
- $game_temp.battle_troop_id = troop_id
- $game_temp.battle_can_escape = true
- $game_temp.battle_can_lose = false
- $game_temp.battle_proc = nil
- end
- end
- end
- # B ボタンが押された場合
- if Input.trigger?(Input::B)
- # イベント実行中かメニュー禁止中でなければ
- unless $game_system.map_interpreter.running? or
- $game_system.menu_disabled
- # メニュー呼び出しフラグと SE 演奏フラグをセット
- $game_temp.menu_calling = true
- $game_temp.menu_beep = true
- end
- end
- # デバッグモードが ON かつ F9 キーが押されている場合
- if $DEBUG and Input.press?(Input::F9)
- # デバッグ呼び出しフラグをセット
- $game_temp.debug_calling = true
- end
- # ドット移動中でなくプレイヤーの移動中である場合を除き
- unless !$game_player.dot_moving and $game_player.moving?
- # 各種画面の呼び出しを実行
- if $game_temp.battle_calling
- call_battle
- elsif $game_temp.shop_calling
- call_shop
- elsif $game_temp.name_calling
- call_name
- elsif $game_temp.menu_calling
- call_menu
- elsif $game_temp.save_calling
- call_save
- elsif $game_temp.debug_calling
- call_debug
- end
- end
- end
- end
复制代码 |
|