=begin ■マップ画面軽量化 RGSS2 DAIpage■ v1.0 ●機能● ・画面外のキャラクタースプライトの更新を停止します。キャラクター画像のサイズを 考慮するので更新範囲や画像の大きさを気にする必要はありません。 ・一時消去したイベントを完全に消去し、軽量化します。 ・画像の設定がないイベントのスプライトを作成しません。 ・使用していない天候・ピクチャスプライトの作成・更新をしません。 ・自動実行コモンイベントの起動を「スイッチの変更時」に限定します。  ※仕様として自動実行のコモンイベントはスイッチの変更時に一度実行して終了し、   延々と繰り返されないようになります。通常使用の範囲なら問題ないかと… ・常時行われているマップイベントの起動チェックを条件を満たした時のみに限定。 ※使用するマップや環境によってはほとんど効果が得られない場合があります。 ※大抵の軽量化スクリプト素材に含まれる機能はほぼ内包しています。  かえってパフォーマンスが落ちる事が多いので併用は避けて下さい。 ●再定義している箇所● !再定義が多いです。出来るだけ上のセクションに導入して下さい! Game_Interpreterを再定義。  Game_Temp、Game_Switches、Game_Picture、Game_Map、Game_Event、Spriteset_Map  をエイリアス。  ※同じ箇所を変更するスクリプトと併用した場合は競合する可能性があります。 ●更新履歴●  09/07/30:ブログ上でテスト公開 =end #============================================================================== # ■ Game_Temp #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :map_event_setup attr_accessor :auto_common_event_setup attr_accessor :update_rect #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias dai_map_lite_initialize initialize def initialize dai_map_lite_initialize @map_event_setup = false @auto_common_event_setup = false @update_rect = Rect.new(0, 0, Graphics.width, Graphics.height) end end #============================================================================== # ■ Game_Switches #============================================================================== class Game_Switches #-------------------------------------------------------------------------- # ● スイッチの設定 #-------------------------------------------------------------------------- alias dai_map_lite_switches []= def []=(switch_id, value) dai_map_lite_switches(switch_id, value) $game_temp.auto_common_event_setup = true end end #============================================================================== # ■ Game_Picture #============================================================================== class Game_Picture #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias dai_map_lite_initialize initialize def initialize(number) dai_map_lite_initialize(number) @last_name = @name end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias dai_map_lite_update update def update dai_map_lite_update # 画像ファイル名を監視、スプライトを削除or作成する。 if @last_name != @name && $scene.is_a?(Scene_Map) if @name == "" $scene.spriteset.delete_picture(self) elsif @last_name == "" $scene.spriteset.push_picture(self) end @last_name = @name end end end #============================================================================== # ■ Game_Map #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ● イベントのセットアップ #-------------------------------------------------------------------------- alias dai_map_lite_setup_events setup_events def setup_events dai_map_lite_setup_events @common_events = {} # コモンイベント for i in 1...$data_common_events.size # トリガーが「なし」ではなく、実行内容が空ではない物のみ登録し直す。 if $data_common_events[i].trigger != 0 && $data_common_events[i].list.size > 1 @common_events[i] = Game_CommonEvent.new(i) end end end #-------------------------------------------------------------------------- # ● コモンイベント #-------------------------------------------------------------------------- def common_events return @common_events end end #============================================================================== # ■ Game_Event #============================================================================== class Game_Event #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias dai_map_lite_initialize initialize def initialize(map_id, event) dai_map_lite_initialize(map_id, event) @last_character_name = @character_name @last_tile_id = @tile_id end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias dai_map_lite_update update def update dai_map_lite_update # 画像ファイル名を監視、スプライトを削除or作成する。 if (@last_character_name != @character_name or @last_tile_id != @tile_id) && $scene.is_a?(Scene_Map) if @character_name == "" && @tile_id == 0 $scene.spriteset.delete_character(self) elsif @last_character_name == "" && @last_tile_id == 0 $scene.spriteset.push_character(self) end @last_character_name, @last_tile_id = @character_name, @tile_id end end #-------------------------------------------------------------------------- # ● イベント起動 #-------------------------------------------------------------------------- alias dai_map_lite_start start def start dai_map_lite_start return if @list.size <= 1 $game_temp.map_event_setup = true end end #============================================================================== # ■ Game_Interpreter #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ● 起動中イベントのセットアップ(再定義) #-------------------------------------------------------------------------- def setup_starting_event map_need_refresh return if common_event_setup return if map_event_setup $scene.is_a?(Scene_Map) ? map_auto_common_setup : auto_common_setup end #-------------------------------------------------------------------------- # ● マップのリフレッシュ(分割定義) #-------------------------------------------------------------------------- def map_need_refresh $game_map.refresh if $game_map.need_refresh end #-------------------------------------------------------------------------- # ● 予約中のコモンイベント起動(分割定義) #-------------------------------------------------------------------------- def common_event_setup if $game_temp.common_event_id > 0 # コモンイベントの呼び出し予約? setup($data_common_events[$game_temp.common_event_id].list) $game_temp.common_event_id = 0 return true end return false end #-------------------------------------------------------------------------- # ● マップイベント起動(分割再定義) #-------------------------------------------------------------------------- def map_event_setup return false unless $game_temp.map_event_setup $game_temp.map_event_setup = false for event in $game_map.events.values # マップイベント if event.starting # 起動中のイベントが見つかった場合 event.clear_starting # 起動中フラグをクリア setup(event.list, event.id) # イベントをセットアップ return true end end return false end #-------------------------------------------------------------------------- # ● マップでの自動実行コモンイベント起動(分割再定義) #-------------------------------------------------------------------------- def map_auto_common_setup # スイッチが変わった? return unless $game_temp.auto_common_event_setup $game_temp.auto_common_event_setup = false # マップで登録されたコモンイベントのみ起動チェック。 return if $game_map.common_events.nil? for event in $game_map.common_events.values if event.trigger == 1 and # トリガーが自動実行かつ $game_switches[event.switch_id] == true # 条件スイッチが ON の場合 setup(event.list) # イベントをセットアップ return end end end #-------------------------------------------------------------------------- # ● マップ以外での自動実行コモンイベント起動(分割定義) #-------------------------------------------------------------------------- def auto_common_setup for event in $data_common_events.compact # コモンイベント if event.trigger == 1 and # トリガーが自動実行かつ $game_switches[event.switch_id] == true # 条件スイッチが ON の場合 setup(event.list) # イベントをセットアップ return end end end #-------------------------------------------------------------------------- # ● イベントの一時消去(再定義) #-------------------------------------------------------------------------- def command_214 $game_map.events[@event_id].erase if @event_id > 0 @index += 1 $scene.spriteset.delete_character($game_map.events[@event_id]) $game_map.events.delete($game_map.events[@event_id]) return false end end #============================================================================== # ■ Sprite_Character #============================================================================== class Sprite_Character < Sprite_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias dai_map_lite_initialize initialize def initialize(viewport, character = nil) @update_ox = 0 @update_oy = 0 @update_width = 0 @update_height = 0 dai_map_lite_initialize(viewport, character) dai_map_lite_update rect_update end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias dai_map_lite_update update def update dai_map_lite_update if update? end #-------------------------------------------------------------------------- # ● 転送元ビットマップの更新 #-------------------------------------------------------------------------- alias dai_map_lite_update_bitmap update_bitmap def update_bitmap dai_map_lite_update_bitmap if @tile_id != @character.tile_id or @character_name != @character.character_name rect_update end end #-------------------------------------------------------------------------- # ● 幅とかの更新 #-------------------------------------------------------------------------- def rect_update @update_ox = self.ox * 2 @update_oy = self.oy * 2 @update_width = self.src_rect.width + @update_ox @update_height = self.src_rect.height + @update_oy end #-------------------------------------------------------------------------- # ● フレーム更新実行判定 #-------------------------------------------------------------------------- def update? return Rect.new(@character.screen_x - @update_ox, @character.screen_y - @update_oy, @update_width, @update_height).overlap?($game_temp.update_rect) end end #============================================================================== # ■ Sprite_Picture #============================================================================== class Sprite_Picture < Sprite #-------------------------------------------------------------------------- # ● ピクチャ #-------------------------------------------------------------------------- def picture return @picture end end #============================================================================== # ■ Spriteset_Map #============================================================================== class Spriteset_Map #-------------------------------------------------------------------------- # ● キャラクタースプライトの作成 #-------------------------------------------------------------------------- alias dai_map_lite_create_characters create_characters def create_characters dai_map_lite_create_characters for sprite in @character_sprites if sprite.character.character_name == "" && sprite.character.tile_id == 0 sprite.dispose delete_character(sprite.character) end end end #-------------------------------------------------------------------------- # ● キャラクタースプライトの追加 #-------------------------------------------------------------------------- def push_character(character) for sprite in @character_sprites return if sprite.character == character end sprite = Sprite_Character.new(@viewport1, character) @character_sprites.push(sprite) end #-------------------------------------------------------------------------- # ● キャラクタースプライトの消去 #-------------------------------------------------------------------------- def delete_character(character) for sprite in @character_sprites if sprite.character == character sprite.dispose @character_sprites.delete(sprite) return end end end #-------------------------------------------------------------------------- # ● 天候の作成 #-------------------------------------------------------------------------- alias dai_map_lite_create_weather create_weather def create_weather dai_map_lite_create_weather if $game_map.screen.weather_type != 0 end #-------------------------------------------------------------------------- # ● 天候の解放 #-------------------------------------------------------------------------- alias dai_map_lite_dispose_weather dispose_weather def dispose_weather dai_map_lite_dispose_weather unless @weather.nil? @weather = nil end #-------------------------------------------------------------------------- # ● 天候の更新 #-------------------------------------------------------------------------- alias dai_map_lite_update_weather update_weather def update_weather if $game_map.screen.weather_type != 0 @weather.nil? ? create_weather : dai_map_lite_update_weather else dispose_weather unless @weather.nil? end end #-------------------------------------------------------------------------- # ● ピクチャスプライトの作成 #-------------------------------------------------------------------------- alias dai_map_lite_create_pictures create_pictures def create_pictures dai_map_lite_create_pictures for sprite in @picture_sprites if sprite.picture.name == "" sprite.dispose delete_picture(sprite.picture) end end end #-------------------------------------------------------------------------- # ● ピクチャスプライトの追加 #-------------------------------------------------------------------------- def push_picture(picture) for sprite in @picture_sprites return if sprite.picture == picture end sprite = Sprite_Picture.new(@viewport2, picture) @picture_sprites.push(sprite) end #-------------------------------------------------------------------------- # ● ピクチャスプライトの消去 #-------------------------------------------------------------------------- def delete_picture(picture) for sprite in @picture_sprites if sprite.picture == picture sprite.dispose @picture_sprites.delete(sprite) return end end end end #============================================================================== # ■ Scene_Map #============================================================================== class Scene_Map < Scene_Base #-------------------------------------------------------------------------- # ● スプライトセット #-------------------------------------------------------------------------- def spriteset return @spriteset end end #============================================================================== # ■ Rect #============================================================================== class Rect #-------------------------------------------------------------------------- # ● 重なっているか? #-------------------------------------------------------------------------- def overlap?(rect) return false if self.x >= rect.x + rect.width return false if self.x + self.width <= rect.x return false if self.y >= rect.y + rect.height return false if self.y + self.height <= rect.y return true end end