#============================================================================ # # ■トランジションマップ移動 □Ver1.10 □製作者:月紳士 # ・RPGツクールVX用 RGSS2スクリプト # # ●…書き換えメソッド(競合注意) ◎…メソッドのエイリアス ○…新規メソッド # # ※二次配布禁止!配布元には利用規約があります。必ずそちらを見てください。 #------------------------------------------------------------------------------ # 更新履歴 # Ver.1.10 月紳士のスクリプト「壁タイル拡張」との併用サポート機能追加。 #============================================================================ =begin  このスクリプトは、  トランジションによる画面切替をマップ移動演出に利用するスクリプトです。  具体的には、同マップを錯覚させる、室内・室外の移動演出に使います。 == 準備 =======================================================================  スクリプトをプロジェクトに導入してください。  その際、   Transition_Map_Move_In.png   Transition_Map_Move_Out.png   Transition_Map_Move_Sample.png  の三つのファイルを、プロジェクトのGraphics、  Systemフォルダへのコピー又はインポートを必ずしてください。  (Transition_Map_Move_Sample.png ファイルは、後述の   カスタマイズ項目で変更可能です。)   == 簡単に使う =================================================================  まずはトランジション移動させたい良く似たマップを二つ用意します。  たとえば、建物の内側を書いたマップを作り、  そしてそれをコピーして建物の外側を書いたマップを作ります。  (建物の外から書いて、コピーしたものを元に中を書いても良いです。)  プレイヤーを移動させたいイベントで、  次のいずれかの記述をイベントコマンド・スクリプトにて実行してください。 map_transition_in(1) map_transition_out(1) map_transition(1) ※( )内の 1 の部分はマップIDです。  ここを移動させたいのマップIDに変更してください。 マップIDの先頭の 0 はいりません。マップIDが 001 の場合は 1 と入力します。  map_transition_in は、室外→室内への移動時に使うコマンドです。  室内への移動用のトランジション画像とその設定が実行されます。  map_transition_out は逆に、室内→室外への移動時に使うコマンドです。  室外への移動用のトランジション画像とその設定が実行されます。    map_transition は、カスタマイズ用のトランジションです。  未設定ですと Transition_Map_Move_Sample.png 画像を使って  トランジションを行います。  カスタマイズ項目にてトランジション画像、速度などを初期設定します。  また、ゲーム中で set_map_transition(duration, filename, vague)  のイベントコマンド・スクリプトでの記述を使って  随時変更することが出来ます。  場面演出に合わせてトランジションを用意したい場合に使います。  こちらは、詳しくはカスタマイズ項目で説明します。 == イベントをシンクロさせる ===================================================  トランジション移動をした際に、たとえ同じ位置に同じイベントを配置していても  未設定ですと、イベントが都度、初期位置に戻ってしまいます。  (自律移動をするイベントの場合です)  このスクリプトにはイベントの位置をシンクロさせる機能があります。  シンクロさせたいイベントの名前に、 <シンクロ>  と記入してください。    イベント同士がシンクロする条件は <シンクロ> というワードが含まれていて、  “同じ名前のイベント同士であること”です。  必ず名前をそろえてください。  また、複数同じ名前のイベントがある場合は、  動作不良を起こしますので、必ずわけるように注意してください。    基本的には、マップ間をコピー・ペーストするだけで正しい複製が出来ます。  ※機能を踏まえてしっかり作成すれば、   マップのコピー前にイベントを準備して、   マップコピー時にシンクロイベントもまとめてコピーすることも出来ますね。 == シンクロイベントの詳細 =====================================================  シンクロするイベントは、位置情報や向き、現在のアニメのコマといった、  基本的な「表現に関係する情報」を引き継ぎます。  さらに、  イベントの一時消去をした場合と、セルフスイッチによってページ変更した場合の  画像変更にも対応できるよう、それらの情報も引き継ぎます。  ここは難しく考えず、  コピーをすれば別マップでも同じ様にイベントが表示される、  と覚えておいてください。    ※ただし、引継ぎをする情報に、画像表現の同期には必須ではない情報、   「イベントのグラフィック」「イベントページの内容」   「イベント起動トリガー」「自律移動の設定(固定orランダムや頻度、速度)」   は含まないようにしました。   これを利用したテクニックも工夫できそうです。      別マップでは透明グラフィックにしておいたり、移動をさせなかったり   といったことが出来ます。   あえて、トランジション・マップ移動時に   イベントの画像を一斉に変える、なども面白そうですね。   サンプルプロジェクト内(ばあさんのイベント)が参考になると思います。 == 座標を指定してトランジション移動 ===========================================  トランジション・マップ移動は、  未設定の場合、別マップの同座標へマップ移動をします。  この移動は、座標指定することも可能です。 map_transition_in(1, 4, 5) map_transition_out(1, 4, 5) map_transition(1, 4, 5)  上記の様に、イベントコマンド・スクリプトで表記して実行してください。 ※ 4 の部分はX座標、 5 の部分がY座標です。  ここを移動させたい座標にそれぞれ変更してください。 それぞれ座標の先頭の 0 はいりません。座標が 004 の場合は 4 と入力します。    ※周囲のイベントも、プレイヤーの位置に合わせてシンクロ移動しますが   場合によっては不具合がありそうです。(具体例の報告があると助かります) =end #============================================================================== # □ カスタマイズ項目 #============================================================================== module Transition_Map_Move # 以下はイベントコマンド・スクリプトにて map_transition を指定した時に # 使用されるカスタマイズ用・トランジションの初期設定です。 DURATION = 40 # トランジションにかけるフレーム数です。 # = の後の数字を調整してください。 FILENAME = "Transition_Map_Move_Sample" # トランジション グラフィックのファイル名です。 # " "内にファイル名を記入してください。拡張子は省略可能です。 # 指定したファイルは必ず、Graphics/Systemフォルダ内にインポートしてください。 VAGUE = 40 # 転送元と転送先の境界のあいまいさで、値が大きいほど曖昧になります。 # = の後の数字を調整してください。 =begin  カスタマイズ用・トランジションの設定は、ゲーム中の変更も可能です。  ゲーム中に変更をする場合は、イベントコマンド・スクリプトにて set_map_transition(duration, filename, vague) と記述して実行してください。 duration の部分には DURATION = で設定した数字を変更したもの、 filename の部分には FILENAME = で設定したファイル名を変更したもの、  vague の部分には VAGUE = で設定した数字を変更したものを記述してください。 set_map_transition(40, "Transition_Map_Move_Sample", 40) といった感じに指定します。 ※初心者の方は、必ず半角を使う様に、充分注意しましょう。  (全角、特に全角スペースや全角数字を使わない)  また、ファイル名は " " で囲うのを忘れないようにしましょう。 =end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :synchronize_map_data #-------------------------------------------------------------------------- # ◎ オブジェクト初期化 #-------------------------------------------------------------------------- alias tig_tmm_initialize initialize def initialize tig_tmm_initialize @synchronize_map_data = {} end #-------------------------------------------------------------------------- # ○ イベントのシンクロ用データの保存 #-------------------------------------------------------------------------- def event_synchronize_data_save @synchronize_map_data = {} for event in @events.values if event.synchronize event.synchronize_data_save end end end #-------------------------------------------------------------------------- # ○ イベントのシンクロ用データの取得 #-------------------------------------------------------------------------- def event_synchronize_data_load for event in @events.values if event.synchronize event.synchronize_data_load end end end #-------------------------------------------------------------------------- # ○ 乗り物のシンクロ移動 #-------------------------------------------------------------------------- def synchronize_vehicles(new_map_id) for vehicle in @vehicles vehicle.synchronize_set_location(new_map_id) end end end #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理 # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。 #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :synchronize #-------------------------------------------------------------------------- # ◎ オブジェクト初期化 # map_id : マップ ID # event : イベント (RPG::Event) #-------------------------------------------------------------------------- alias tig_tmm_event_initialize initialize def initialize(map_id, event) tig_tmm_event_initialize(map_id, event) set_synchronize_setting end #-------------------------------------------------------------------------- # ○ 名前の取得 #-------------------------------------------------------------------------- def name return @event.name end #-------------------------------------------------------------------------- # ○ シンクロ用データの保存 #-------------------------------------------------------------------------- def synchronize_data_save $game_map.synchronize_map_data[@event.name] = [] $game_map.synchronize_map_data[@event.name].push(@x - $game_player.difference_x) $game_map.synchronize_map_data[@event.name].push(@y - $game_player.difference_y) $game_map.synchronize_map_data[@event.name].push(@real_x - $game_player.difference_x * 256) $game_map.synchronize_map_data[@event.name].push(@real_y - $game_player.difference_y * 256) $game_map.synchronize_map_data[@event.name].push(@opacity) $game_map.synchronize_map_data[@event.name].push(@blend_type) $game_map.synchronize_map_data[@event.name].push(@direction) $game_map.synchronize_map_data[@event.name].push(@pattern) $game_map.synchronize_map_data[@event.name].push(@move_route_forcing) $game_map.synchronize_map_data[@event.name].push(@bush_depth) $game_map.synchronize_map_data[@event.name].push(@move_route) $game_map.synchronize_map_data[@event.name].push(@move_route_index) $game_map.synchronize_map_data[@event.name].push(@original_move_route) $game_map.synchronize_map_data[@event.name].push(@original_move_route_index) $game_map.synchronize_map_data[@event.name].push(@anime_count) $game_map.synchronize_map_data[@event.name].push(@stop_count) $game_map.synchronize_map_data[@event.name].push(@jump_count) $game_map.synchronize_map_data[@event.name].push(@jump_peak) $game_map.synchronize_map_data[@event.name].push(@wait_count) $game_map.synchronize_map_data[@event.name].push(@locked) $game_map.synchronize_map_data[@event.name].push(@prelock_direction) $game_map.synchronize_map_data[@event.name].push(@move_failed) $game_map.synchronize_map_data[@event.name].push(@erased) $game_map.synchronize_map_data[@event.name].push(@map_id) $game_map.synchronize_map_data[@event.name].push(@id) unless @on_tile == nil $game_map.synchronize_map_data[@event.name].push(@on_tile) $game_map.synchronize_map_data[@event.name].push(@turn_back) end end #-------------------------------------------------------------------------- # ○シンクロ用データの取得 #-------------------------------------------------------------------------- def synchronize_data_load if $game_map.synchronize_map_data.key?(@event.name) @x = $game_map.synchronize_map_data[@event.name][0] @y = $game_map.synchronize_map_data[@event.name][1] @real_x = $game_map.synchronize_map_data[@event.name][2] @real_y = $game_map.synchronize_map_data[@event.name][3] @opacity = $game_map.synchronize_map_data[@event.name][4] @blend_type = $game_map.synchronize_map_data[@event.name][5] @direction = $game_map.synchronize_map_data[@event.name][6] @pattern = $game_map.synchronize_map_data[@event.name][7] @move_route_forcing = $game_map.synchronize_map_data[@event.name][8] @bush_depth = $game_map.synchronize_map_data[@event.name][9] @move_route = $game_map.synchronize_map_data[@event.name][10] @move_route_index = $game_map.synchronize_map_data[@event.name][11] @original_move_route = $game_map.synchronize_map_data[@event.name][12] @original_move_route_index = $game_map.synchronize_map_data[@event.name][13] @anime_count = $game_map.synchronize_map_data[@event.name][14] @stop_count = $game_map.synchronize_map_data[@event.name][15] @jump_count = $game_map.synchronize_map_data[@event.name][16] @jump_peak = $game_map.synchronize_map_data[@event.name][17] @wait_count = $game_map.synchronize_map_data[@event.name][18] @locked = $game_map.synchronize_map_data[@event.name][19] @prelock_direction = $game_map.synchronize_map_data[@event.name][20] @move_failed = $game_map.synchronize_map_data[@event.name][21] if $game_map.synchronize_map_data[@event.name][22] erase end for i in ["A", "B", "C", "D"] key1 = [@map_id, @id, i] key2 = [$game_map.synchronize_map_data[@event.name][23], $game_map.synchronize_map_data[@event.name][24], i] $game_self_switches[key1] = $game_self_switches[key2] end refresh unless @on_tile == nil @on_tile = $game_map.synchronize_map_data[@event.name][25] @turn_back = $game_map.synchronize_map_data[@event.name][26] if @always_turn_back @on_tile = false @turn_back = true elsif @always_on_tile @on_tile = true @turn_back = false end update_turn_back end end end #-------------------------------------------------------------------------- # ○ シンクロさせるイベントであるかを取得 #-------------------------------------------------------------------------- def set_synchronize_setting @event.name = @event.name.sub(/[\<<]シンクロ[\>>]/, "") @synchronize = $& != nil @event.name = @event.name.sub(/[\<<]表保持[\>>]/, "") @always_on_tile = $& != nil @event.name = @event.name.sub(/[\<<]裏保持[\>>]/, "") @always_turn_back = $& != nil end end #============================================================================== # ■ Game_Vehicle #------------------------------------------------------------------------------ #  乗り物を扱うクラスです。このクラスは Game_Map クラスの内部で使用されます。 # 現在のマップに乗り物がないときは、マップ座標 (-1,-1) に設定されます。 #============================================================================== class Game_Vehicle < Game_Character #-------------------------------------------------------------------------- # ○ シンクロ用・位置の変更 #-------------------------------------------------------------------------- def synchronize_set_location(new_map_id) if @map_id == $game_map.map_id @map_id = new_map_id end refresh end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :map_transition_data #-------------------------------------------------------------------------- # ◎ オブジェクト初期化 #-------------------------------------------------------------------------- alias tig_tmm_initialize initialize def initialize tig_tmm_initialize @executing_map_transition = false @map_transition_data = [Transition_Map_Move::DURATION, Transition_Map_Move::FILENAME, Transition_Map_Move::VAGUE] @next_map_transition_data = [] end #-------------------------------------------------------------------------- # ○ トランジションマップ移動の予約 # map_id : マップ ID # x : X 座標 # y : Y 座標 # direction : 移動後の向き #-------------------------------------------------------------------------- def reserve_map_transition(map_id, x, y, type) @executing_map_transition = true @new_map_id = map_id @new_x = x == nil ? @x : x @new_y = y == nil ? @y : y case type when "in" @next_map_transition_data[0] = 40 @next_map_transition_data[1] = "Transition_Map_Move_In" @next_map_transition_data[2] = 40 when "out" @next_map_transition_data[0] = 40 @next_map_transition_data[1] = "Transition_Map_Move_Out" @next_map_transition_data[2] = 40 when "no" @next_map_transition_data[0] = 0 @next_map_transition_data[1] = "BattleStart" @next_map_transition_data[2] = 0 when "custom" @next_map_transition_data[0] = @map_transition_data[0] @next_map_transition_data[1] = @map_transition_data[1] @next_map_transition_data[2] = @map_transition_data[2] end end #-------------------------------------------------------------------------- # ○ 場所移動時のX座標の差 #-------------------------------------------------------------------------- def difference_x return @x - @new_x end #-------------------------------------------------------------------------- # ○ 場所移動時のY座標の差 #-------------------------------------------------------------------------- def difference_y return @y - @new_y end #-------------------------------------------------------------------------- # ○ トランジションマップ移動の予約中判定 #-------------------------------------------------------------------------- def executing_map_transition? return @executing_map_transition end #-------------------------------------------------------------------------- # ○ トランジションマップ移動の実行 #-------------------------------------------------------------------------- def perform_map_transition_move return unless @executing_map_transition if $game_map.map_id != @new_map_id $game_map.synchronize_vehicles(@new_map_id) $game_map.setup(@new_map_id) # 別マップへ移動 end moveto(@new_x, @new_y) @executing_map_transition = false end #-------------------------------------------------------------------------- # ○ トランジションの実行 #-------------------------------------------------------------------------- def map_transition duration = @next_map_transition_data[0] filename = "Graphics/System/" + @next_map_transition_data[1] vague = @next_map_transition_data[2] Graphics.transition(duration, filename, vague) end #-------------------------------------------------------------------------- # ◎ 方向ボタン入力による移動処理 #-------------------------------------------------------------------------- alias tig_tmm_move_by_input move_by_input def move_by_input return if @executing_map_transition tig_tmm_move_by_input end end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ○ コマンド・トランジションマップ移動(IN) #-------------------------------------------------------------------------- def map_transition_in(map_id, x = nil, y = nil) return if $game_temp.in_battle return if $game_player.transfer? $game_player.reserve_map_transition(map_id, x, y, "in") end #-------------------------------------------------------------------------- # ○ コマンド・トランジションマップ移動(OUT) #-------------------------------------------------------------------------- def map_transition_out(map_id, x = nil, y = nil) return if $game_temp.in_battle return if $game_player.transfer? $game_player.reserve_map_transition(map_id, x, y, "out") end #-------------------------------------------------------------------------- # ○ コマンド・トランジションマップ移動(カスタマイズ) #-------------------------------------------------------------------------- def map_transition(map_id, x = nil, y = nil) return if $game_temp.in_battle return if $game_player.transfer? $game_player.reserve_map_transition(map_id, x, y, "custom") end #-------------------------------------------------------------------------- # ○ コマンド・トランジションせずにこっそりマップ移動 #-------------------------------------------------------------------------- def map_move_no_transition(map_id, x = nil, y = nil) return if $game_temp.in_battle return if $game_player.transfer? $game_player.reserve_map_transition(map_id, x, y, "no") end #-------------------------------------------------------------------------- # ○ コマンド・トランジションマップ移動のカスタマイズ設定変更 #-------------------------------------------------------------------------- def set_map_transition(duration, filename, vague) $game_player.map_transition_data = [duration, filename, vague] end end #============================================================================== # ■ Scene_Map #------------------------------------------------------------------------------ #  マップ画面の処理を行うクラスです。 #============================================================================== class Scene_Map < Scene_Base #-------------------------------------------------------------------------- # ◎ フレーム更新 #-------------------------------------------------------------------------- alias tig_tmm_update update def update unless $game_message.visible # メッセージ表示中以外 update_map_transition_player end tig_tmm_update end #-------------------------------------------------------------------------- # ○ トランジションマップ移動の処理 #-------------------------------------------------------------------------- def update_map_transition_player return unless $game_player.executing_map_transition? Graphics.freeze $game_map.event_synchronize_data_save @spriteset.dispose # スプライトセットを解放 $game_player.perform_map_transition_move # 場所移動の実行 $game_map.event_synchronize_data_load @spriteset = Spriteset_Map.new # スプライトセットを再作成 $game_player.map_transition Input.update end end