#◆◇◆◇◆ 鏡の壁スクリプトVX ver 1.02 ◇◆◇◆◇ # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ■ 更新履歴 ○ ver 1.02(2010/12/13) スイッチによる演出無効化機能を追加 ○ ver 1.01(2010/12/04) オープニング系スクリプトに対応 ○ ver 1.00(2010/11/28) 公開 ■ 説明 鏡床スクリプトVX専用の拡張スクリプトです。 このスクリプト素材を使用する場合は、 鏡床スクリプトVXが必須となります。 キャラクターの「一歩上」のタイルが特定のタイルだった場合、 そのタイルにキャラクターの鏡写し映像を描写します。 イベントの場合は、鏡床スクリプトのものをそのまま継承します。 氷のダンジョン等に向いているかもしれません。 鏡の壁とみなされるタイルの登録には、専用のマップを別に使います。 詳しい設定方法はスクリーンショットを参照してください。 ◆ 鏡の壁イベントの設定 鏡の壁とみなすイベントには、 まず移動タイプを 固定 にし、 名前に 鏡 の文字を含ませてください。 そのイベントは鏡の壁とみなされます。 (途中でそのイベントを動かしても、 鏡の壁の判定は更新されません。 あくまで絶対に動かないイベント専用の機能です) 導入場所の注意 エイリアスで構成されていますので、 出来るだけ下のほうに導入してください。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # 鏡の壁スクリプトVXを有効化 ( true で有効 / false で無効 ) RGSS["鏡の壁スクリプトVX"] = true # 鏡の壁用のダミーマップのID # (このダミーマップに配置したタイル全てが鏡の壁とみなされます) MirrorWall_Map_ID = 5 # 機能を一時的に無効化するスイッチ # このスイッチが オン の時、機能を無効化します Not_MirrorWall_Switch = 2 end # 鏡の壁スクリプトVXが有効な場合に以降の処理を実行する if MINTO::RGSS["鏡の壁スクリプトVX"] == true then #============================================================================== # ☆ MINTO_MirrorWall #------------------------------------------------------------------------------ # 鏡の壁のメイン処理を行うモジュールです。 #============================================================================== module MINTO_MirrorWall #-------------------------------------------------------------------------- # ● 鏡の壁セット #-------------------------------------------------------------------------- def self.mirror_wall_set # データが既に存在する場合 unless @mirror_wall_data.nil? # メソッドを返す return end # 鏡の壁用のダミーマップをロード map = load_data(sprintf("Data/Map%03d.rvdata", MINTO::MirrorWall_Map_ID)) # 鏡の壁データを初期化 @mirror_wall_data = {} mirror_wall_data = [] # ループ処理(全タイル) for x in (0..map.width) do for y in (0..map.height) do # 鏡床データに保存 mirror_wall_data.push(map.data[x, y, 0]) mirror_wall_data.push(map.data[x, y, 1]) mirror_wall_data.push(map.data[x, y, 2]) end end # 重複する要素を除外 mirror_wall_data.uniq! # 無効なデータを除外 mirror_wall_data -= [0] mirror_wall_data -= [nil] # ループ処理 for id in mirror_wall_data do @mirror_wall_data[id] = true end end #-------------------------------------------------------------------------- # ● 鏡床データの習得 #-------------------------------------------------------------------------- def self.data return @mirror_wall_data end end #============================================================================== # ■ Numeric #------------------------------------------------------------------------------ #  数値全般を扱う組み込みクラスです。 #============================================================================== class Numeric #-------------------------------------------------------------------------- # ● 最大値の設定 # max : 求められた最大の数値 #-------------------------------------------------------------------------- def to_m(max) if self > max return max else return self end end #-------------------------------------------------------------------------- # ● 最小値の設定 # min : 求められた最小の数値 #-------------------------------------------------------------------------- def to_min(min) if self < min return min else return self end 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 #============================================================================== # ■ Game_Character (分割定義 1) #------------------------------------------------------------------------------ #  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event # クラスのスーパークラスとして使用されます。 #============================================================================== class Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :move_type # 移動タイプ end #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理 # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。 #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :event # イベント end #============================================================================== # ■ Spriteset_Map #------------------------------------------------------------------------------ #  マップ画面のスプライトやタイルマップなどをまとめたクラスです。このクラスは # Scene_Map クラスの内部で使用されます。 #============================================================================== class Spriteset_Map #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :mirror_wall # 鏡の壁イベントの位置情報 #-------------------------------------------------------------------------- # ● オブジェクト初期化 # alias : initialize_Mirror_Wall #-------------------------------------------------------------------------- alias :initialize_Mirror_Wall :initialize def initialize # 鏡の壁イベントの位置情報を定義 @mirror_wall = Table.new($game_map.map.width, $game_map.map.height) # 元の処理を実行 initialize_Mirror_Wall # ループ処理 for character in @character_sprites do # キャラクターがイベントの場合 if character.character.class == Game_Event then # キャラクターの移動タイプが固定の場合 if character.character.move_type == 0 then # イベント名に 鏡 が含まれる場合 if character.character.event.name.include?("鏡") == true then # 位置を取得 x = character.character.x y = character.character.y # 位置を保存 @mirror_wall[x, y] = 1 end end end end end end #============================================================================== # ■ Sprite_Character (分割定義 2) #------------------------------------------------------------------------------ #  キャラクター表示用のスプライトです。 # Game_Character クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Character < Sprite_Base #-------------------------------------------------------------------------- # ● 解放 # alias : dispose_Mirror_Wall #-------------------------------------------------------------------------- alias :dispose_Mirror_Wall :dispose def dispose # 鏡が存在する場合 if @mirror_sprite != nil then # 鏡を解放 @mirror_sprite.bitmap.dispose @mirror_sprite.dispose end # 元の処理を実行 dispose_Mirror_Wall end #-------------------------------------------------------------------------- # ● 鏡床の作成 # alias : mirror_tile_set_Mirror_Wall #-------------------------------------------------------------------------- alias :mirror_tile_set_Mirror_Wall :mirror_tile_set def mirror_tile_set # 元の処理を実行 mirror_tile_set_Mirror_Wall # 鏡を作成 mirror_set end #-------------------------------------------------------------------------- # ● 鏡の作成 #-------------------------------------------------------------------------- def mirror_set # 鏡用のスプライトを生成 @mirror_sprite = self.dup # 座標を調節する @mirror_sprite.y = self.y + (self.oy / 6) @mirror_sprite.z = self.z # 色を白っぽくする @mirror_sprite.tone.red = 64 @mirror_sprite.tone.green = 64 @mirror_sprite.tone.blue = 64 # 不透明にする @mirror_sprite.opacity = 0 # 左右を反転させる @mirror_sprite.mirror = (self.mirror == false) # タイル ID が有効な値の場合 if @tile_id >= 1 then # メソッドを返す return end # キャラクターの向きに応じて分岐 case @character.direction # 下 when 2 then direction = 8 # 左 when 4 then direction = 6 # 右 when 6 then direction = 4 # 上 when 8 then direction = 2 end index = @character.character_index pattern = @character.pattern < 3 ? @character.pattern : 1 sx = (index % 4 * 3 + pattern) * @cw sy = (index / 4 * 4 + (direction - 2) / 2) * @ch @mirror_sprite.src_rect.set(sx, sy, @cw, @ch) end #-------------------------------------------------------------------------- # ● 鏡の壁有効判定 # x : X 座標 # y : Y 座標 #-------------------------------------------------------------------------- def mirror_wall_include?(x, y) if MINTO_MirrorWall.data[$game_map.map.data[x, y, 0]] or MINTO_MirrorWall.data[$game_map.map.data[x, y, 1]] or MINTO_MirrorWall.data[$game_map.map.data[x, y, 2]] return true end return false end #-------------------------------------------------------------------------- # ● 影の更新 # alias : update_mirror_tile_Mirror_Wall #-------------------------------------------------------------------------- alias :update_mirror_tile_Mirror_Wall :update_mirror_tile def update_mirror_tile # 元の処理を実行 update_mirror_tile_Mirror_Wall # 鏡を更新 update_mirror end #-------------------------------------------------------------------------- # ● 鏡の更新 #-------------------------------------------------------------------------- def update_mirror # 現在の位置を取得 x = @character.x y = @character.y @z_plus = -1 # 元々鏡が存在しない場合 if @mirror_sprite == nil then # 処理を終了 return end # 機能が無効化されている場合 if $game_switches[MINTO::Not_MirrorWall_Switch] == true then # 不可視状態にする @mirror_sprite.visible = false # メソッドを返す return end # スプライトセットの有効判定 effective = ($scene.spriteset != nil) # スプライトセットが有効で、且つ一歩上に鏡の壁イベントが存在する場合 if effective and $scene.spriteset.mirror_wall[x, y-1] == 1 then # Y座標補正値を初期化する @y_plus = -48 # 透明度を調節 @mirror_sprite.opacity = (@mirror_sprite.opacity + 6).to_m(160) @z_plus = 999 #@mirror_sprite.wave_amp = 1 #@mirror_sprite.wave_length = 40 #@mirror_sprite.wave_speed = 320 # 一歩上のタイルが鏡の壁以外の場合 elsif mirror_wall_include?(x, (y - 1)) == false then # 不透明にする @mirror_sprite.opacity = 0 # 鏡を不可視状態にする @mirror_sprite.visible = false #@mirror_sprite.wave_amp = 0 #@mirror_sprite.wave_length = 0 #@mirror_sprite.wave_speed = 0 # 処理を終了 return # 一歩上のタイルが鏡の壁の場合 else # Y座標補正値を初期化する @y_plus = -32 # 透明度を調節 @mirror_sprite.opacity = (@mirror_sprite.opacity + 6).to_m(160) #@mirror_sprite.wave_amp = 0 #@mirror_sprite.wave_length = 0 #@mirror_sprite.wave_speed = 0 end # タイル ID が有効な値の場合 if @tile_id >= 1 then # 各情報を更新する @mirror_sprite.src_rect = self.src_rect @mirror_sprite.x = self.x @mirror_sprite.y = self.y + (self.oy / 6) + @y_plus @mirror_sprite.z = self.z - 1 @mirror_sprite.visible = self.visible # メソッドを返す return end # キャラクターの向きに応じて分岐 case @character.direction # 下 when 2 then direction = 8 # 左 when 4 then direction = 6 # 右 when 6 then direction = 4 # 上 when 8 then direction = 2 end # 各情報を更新する index = @character.character_index pattern = @character.pattern < 3 ? @character.pattern : 1 sx = (index % 4 * 3 + pattern) * @cw sy = (index / 4 * 4 + (direction - 2) / 2) * @ch @mirror_sprite.src_rect.set(sx, sy, @cw, @ch) @mirror_sprite.x = self.x @mirror_sprite.y = self.y + (self.oy / 6) + @y_plus @mirror_sprite.z = self.z + @z_plus @mirror_sprite.visible = self.visible @mirror_sprite.update end end #============================================================================== # ■ Scene_Map #------------------------------------------------------------------------------ #  マップ画面の処理を行うクラスです。 #============================================================================== class Scene_Map #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :spriteset # スプライトセット end # 鏡の壁セット MINTO_MirrorWall.mirror_wall_set end