#◆◇◆◇◆ 鏡床スクリプトVX ver 1.04 ◇◆◇◆◇ # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ■ 更新履歴 ○ ver 1.04(2011/01/24) 飛行船搭乗時に反射しないように変更 鏡床を無効化するタイルの設定を追加 ○ ver 1.03(2010/12/13) スイッチによる演出無効化機能を追加 ○ ver 1.02(2010/12/04) オープニング系スクリプトに対応 ○ ver 1.01(2010/12/01) 画面が変わると落ちるミスを修正 ○ ver 1.00(2010/11/23) 公開 ■ 説明 現在キャラクターが立っている 「一歩下」のタイルが、特定のタイルだった場合、 一歩下のタイルにキャラクターの半透明の映像を映し出します。 水面などの演出に向いています。 鏡床とみなされるタイルの登録には、専用のマップを別に使います。 詳しい設定方法はスクリーンショットを参照してください。 イベントの場合は、「最初の」実行内容が 「注釈」で、注釈の内容が 鏡床描写 のみの場合、同様に映し出します。 設定していない場合は映し出さないので、 映し出したいイベントにだけ設定してください。 導入場所の注意 エイリアスで構成されていますので、 出来るだけ下のほうに導入してください。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # 鏡床スクリプトVXを有効化 ( true で有効 / false で無効 ) RGSS["鏡床スクリプトVX"] = true # 鏡床用のダミーマップのID # (このダミーマップに配置したタイル全てが鏡床とみなされます) MirrorTile_Map_ID = 4 # 鏡床無効化用のダミーマップのID # (このダミーマップに配置したタイル全てが鏡床無効化用タイルとみなされます) UNMirrorTile_Map_ID = 11 # 機能を一時的に無効化するスイッチ # このスイッチが オン の時、機能を無効化します Not_Mirror_Switch = 1 end # 鏡床スクリプトVXが有効な場合に以降の処理を実行する if MINTO::RGSS["鏡床スクリプトVX"] == true then #============================================================================== # ☆ MINTO_MirrorTile #------------------------------------------------------------------------------ # 鏡床のメイン処理を行うモジュールです。 #============================================================================== module MINTO_MirrorTile #-------------------------------------------------------------------------- # ● 鏡床のセット #-------------------------------------------------------------------------- def self.mirror_tile_set # データが既に存在する場合 unless @mirror_tile_data.nil? # メソッドを返す return end # 鏡床用のダミーマップをロード map = load_data(sprintf("Data/Map%03d.rvdata", MINTO::MirrorTile_Map_ID)) # 鏡床データを初期化 @mirror_tile_data = {} mirror_tile_data = [] # ループ処理(全タイル) for x in 0..(map.width) for y in 0..(map.height) # 鏡床データに保存 mirror_tile_data.push(map.data[x, y, 0]) mirror_tile_data.push(map.data[x, y, 1]) mirror_tile_data.push(map.data[x, y, 2]) end end # 重複する要素を除外 mirror_tile_data.uniq! # 無効なデータを除外 mirror_tile_data -= [0] mirror_tile_data -= [nil] # ループ処理 for id in mirror_tile_data do @mirror_tile_data[id] = true end # 鏡床用のダミーマップをロード map = load_data(sprintf("Data/Map%03d.rvdata", MINTO::UNMirrorTile_Map_ID)) # 鏡床データを初期化 @unmirror_tile_data = {} unmirror_tile_data = [] # ループ処理(全タイル) for x in 0..(map.width) for y in 0..(map.height) # 鏡床データに保存 unmirror_tile_data.push(map.data[x, y, 0]) unmirror_tile_data.push(map.data[x, y, 1]) unmirror_tile_data.push(map.data[x, y, 2]) end end # 重複する要素を除外 unmirror_tile_data.uniq! # 無効なデータを除外 unmirror_tile_data -= [0] unmirror_tile_data -= [nil] # ループ処理 for id in unmirror_tile_data do @unmirror_tile_data[id] = true end end #-------------------------------------------------------------------------- # ● 鏡床データの習得 #-------------------------------------------------------------------------- def self.data return @mirror_tile_data end #-------------------------------------------------------------------------- # ● 鏡床データの習得 #-------------------------------------------------------------------------- def self.undata return @unmirror_tile_data end end #============================================================================== # ■ Sprite #------------------------------------------------------------------------------ #  スプライト表示を扱う組み込みクラスです。 #============================================================================== class Sprite #-------------------------------------------------------------------------- # ● 複製の作成 #-------------------------------------------------------------------------- def dup # 各データをコピー sprite = Sprite.new(self.viewport) sprite.bitmap = self.bitmap.dup if self.bitmap != nil sprite.x = self.x sprite.y = self.y sprite.z = self.z sprite.visible = self.visible sprite.ox = self.ox sprite.oy = self.oy sprite.angle = self.angle sprite.mirror = self.mirror sprite.opacity = self.opacity sprite.blend_type = self.blend_type sprite.color = self.color.dup sprite.src_rect = self.src_rect.dup sprite.zoom_x = self.zoom_x sprite.zoom_y = self.zoom_y return sprite end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :map # マップの情報 end #============================================================================== # ■ Sprite_Character #------------------------------------------------------------------------------ #  キャラクター表示用のスプライトです。 # Game_Character クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Character < Sprite_Base #-------------------------------------------------------------------------- # ● 解放 # alias : dispose_MINTO_Mirror_Tile #-------------------------------------------------------------------------- alias :dispose_MINTO_Mirror_Tile :dispose def dispose # 鏡床が存在する場合 if @mirror_tile_sprite != nil then # 鏡床を解放 @mirror_tile_sprite.bitmap.dispose @mirror_tile_sprite.dispose end # 元の処理を実行 dispose_MINTO_Mirror_Tile end #-------------------------------------------------------------------------- # ● 鏡床有効判定 # x : X 座標 # y : Y 座標 #-------------------------------------------------------------------------- def mirror_tile_include?(x, y) if MINTO_MirrorTile.data[$game_map.map.data[x, y, 0]] or MINTO_MirrorTile.data[$game_map.map.data[x, y, 1]] or MINTO_MirrorTile.data[$game_map.map.data[x, y, 2]] if not MINTO_MirrorTile.undata[$game_map.map.data[x, y, 0]] and not MINTO_MirrorTile.undata[$game_map.map.data[x, y, 1]] and not MINTO_MirrorTile.undata[$game_map.map.data[x, y, 2]] return true end end return false end #-------------------------------------------------------------------------- # ● 鏡床の作成 #-------------------------------------------------------------------------- def mirror_tile_set # 鏡床が存在する場合 if @mirror_tile_sprite != nil then # 鏡床を解放 @mirror_tile_sprite.bitmap.dispose @mirror_tile_sprite.bitmap = nil @mirror_tile_sprite.dispose @mirror_tile_sprite = nil end # 最終ファイル名を更新 @last_tile_id = @character.tile_id @last_character_name = @character.character_name.dup # 鏡床用のスプライトを生成 @mirror_tile_sprite = self.dup # 座標を調節する @mirror_tile_sprite.y = self.y - (self.oy / 6) @mirror_tile_sprite.z = self.z # 色を白っぽくする @mirror_tile_sprite.tone.red = 64 @mirror_tile_sprite.tone.green = 64 @mirror_tile_sprite.tone.blue = 64 # 半透明にする @mirror_tile_sprite.opacity = self.opacity * 62 / 100 # 180度回転させる @mirror_tile_sprite.angle = 180 # 左右を反転させる @mirror_tile_sprite.mirror = (not self.mirror == true) end #-------------------------------------------------------------------------- # ● 鏡床の更新 #-------------------------------------------------------------------------- def update_mirror_tile # キャラクターの現在位置を取得 x = @character.x y = @character.y # 元々鏡床が存在しない場合 if @mirror_tile_sprite == nil then # メソッドを返す return end # 機能が無効化されている場合 if $game_switches[MINTO::Not_Mirror_Switch] == true then # 不可視状態にする @mirror_tile_sprite.visible = false # メソッドを返す return end # プレイヤーの場合 unless @character.is_a?(Game_Event) then # 機能が無効化されている場合 if $game_map.airship.driving == true then # 不可視状態にする @mirror_tile_sprite.visible = false # メソッドを返す return end end # 下のタイルが鏡床以外の場合 if mirror_tile_include?(x, (y + 1)) == false then # 鏡床を不可視状態にする @mirror_tile_sprite.visible = false # メソッドを返す return # 下のタイルが鏡床の場合 else # Y座標補正値を初期化する @y_plus = 0 #@mirror_tile_sprite.wave_amp = 1 #@mirror_tile_sprite.wave_length = 60 #@mirror_tile_sprite.wave_speed = 320 end # 各情報を更新する @mirror_tile_sprite.src_rect = self.src_rect.dup @mirror_tile_sprite.x = self.x @mirror_tile_sprite.y = self.y - (self.oy / 6) + @y_plus @mirror_tile_sprite.opacity = self.opacity * 62 / 100 @mirror_tile_sprite.z = self.z - 1 @mirror_tile_sprite.visible = self.visible @mirror_tile_sprite.update end #-------------------------------------------------------------------------- # ● フレーム更新 # alias : update_MINTO_Mirror_Tile #-------------------------------------------------------------------------- alias :update_MINTO_Mirror_Tile :update def update # ファイル名、色相のどれかが現在のものと異なる場合 if @last_tile_id != @character.tile_id or @last_character_name != @character.character_name # 鏡床が存在する場合 if @mirror_tile_sprite != nil then # 元の処理を実行 update_MINTO_Mirror_Tile # 鏡床を再作成 mirror_tile_set # 鏡床を更新 update_mirror_tile # メソッドを返す return end end # 元の処理を実行 update_MINTO_Mirror_Tile # まだ鏡床を作成していない場合 if @mirror_tile == nil then # キャラクターがイベントの場合 if @character.is_a?(Game_Event) == true then # 有効なイベントの場合 if @character.list != nil then # 最初の内容が注釈の場合 if @character.list[0].code == 108 then # 注釈の内容が「鏡床描写」だった場合 if @character.list[0].parameters == ["鏡床描写"] then # 鏡床を作成 mirror_tile_set # 作成済みフラグをオン @mirror_tile = true end end end # キャラクターがプレイヤーの場合 else # 鏡床を作成 mirror_tile_set # 作成済みフラグをオン @mirror_tile = true end end # 鏡床を更新 update_mirror_tile end end # 鏡床のセット MINTO_MirrorTile.mirror_tile_set end