# ------------------------------------------------------------------------------ # マップ画面演出効果スクリプト for VXAce 製作者:こま # ------------------------------------------------------------------------------ # マップ画面に以下のような演出効果を適用します。 # #  ズーム/反転/回転/波形 # # // 使用方法 // # #  適用したい演出効果に合わせて、イベントコマンドスクリプトを実行してください。 # # // 利用規約 // # # ・利用はRPGツクールVXAceの正規ユーザーに限られます。 # ・商用・非商用、ゲームの内容を問わず利用可能です。 # ・ゲームへの利用の際、報告や出典元の記載等は必須ではありません。 # ・二次配布や転載は禁止します。 # ・ダウンロードURLへの直接リンクも禁止します。 # ・不具合対応以外のサポートやリクエストは受け付けておりません。 # ・スクリプト利用により生じたいかなる問題においても、一切責任を負いかねます。 # # - <<共通設定>> ------------------------------------------------------------- # # $game_map.effect_refresh_rate = # # [説明] # 効果を適用した際の画面更新頻度。 # 効果適用時にフレームレートがが著しく低下する場合、本設定を60未満にすることで # 軽減させられる可能性があります。 # #(例)$game_map.effect_refresh_rate = 30 # 1秒間に30回更新 #(例)$game_map.effect_refresh_rate = 60 # 1秒間に60回更新 # # デフォルトはVXAceの最大フレームレート(通常は60)と同値です。 # # - <<ズーム:マップ基準>> --------------------------------------------------- # # $game_map.zoom(:map, x, y[, magnification][, duration]) # # [説明] # 指定したマップ座標が左上になるようにズームします。 # # x : マップ上のX座標 # y : マップ上のY座標 # magnification : ズーム率(省略時は前回の設定を維持 : デフォルト 1.0) # duration : ズーム完了までの時間(省略時は即時) # # X座標とY座標はマス単位(グリッド単位)で指定します。 # 左から3マス目、上から4マス目なら、(x, y) = (3, 4)となります。 # 小数点数での指定も可能です。 # # magnificationとdurationは省略可能ですが、以下の点に注意してください。 # # > 小数点数で指定した場合はmagnificationとして認識します。 # > 実数で指定した場合はdurationとして認識します。 # #(例)$game_map.zoom(:map, 32, 16, 2.0, 60) # # この場合、2.0は小数点数なのでmagnificationとして「ズーム率2.0倍」、 # 60は実数なのでdurationとして「ズーム完了までの時間60フレーム」となります。 # # - <<ズーム:画面基準>> ----------------------------------------------------- # # $game_map.zoom(:display, x, y[, magnification][, duration]) # # [説明] # 指定した画面座標が左上になるようにズームします。 # # x : 画面上のX座標 # y : 画面上のY座標 # # その他の項目や使用上の補足については、マップ基準と同様です。 # # - <<ズーム:プレイヤー基準>> ----------------------------------------------------- # # $game_map.zoom(:player, x, y[, magnification][, duration]) # # [説明] # プレイヤーの位置を基準として指定した座標が左上になるようにズームします。 # # x : プレイヤーのX座標からの相対X座標 # y : プレイヤーのY座標からの相対Y座標 # # その他の項目や使用上の補足については、マップ基準と同様です。 # # - <<ズーム:中央指定>> ----------------------------------------------------- # # $game_map.zoom(:center, x, y[, magnification][, duration]) # # [説明] # 指定した座標のマスが中央にくるようにズームします。 # # x : 中央に表示するマスのX座標(マップ基準) # y : 中央に表示するマスのY座標(マップ基準) # # 左から3マス目、上から4マス目のマスを中央に表示したいなら、 # 指定座標は(x, y) = (3, 4)となります。(3.5, 4.5)ではないので注意してください。 # # その他の項目や使用上の補足については、マップ基準と同様です。 # # - <<ズーム:リセット>> ----------------------------------------------------- # # $game_map.zoom(:reset[, duration]) # # [説明] # ズームを解除し、元のマップ画面表示に戻します。 # # duration : ズーム完了までの時間(省略時は即時) # # - <<反転>> ----------------------------------------------------------------- # # $game_map.mirror # $game_map.mirror(duration) # $game_map.mirror(enabled[, duration]) # # [説明] # マップ画面を反転します。 # # enabled : 反転状態(true : 反転/false : 元画面/省略時 : 現在の状態の逆) # duration : 反転完了までの時間(省略時は即時) # # enabledとdurationは省略可能ですが、以下の点に注意してください。 # # > true/falseで指定した場合はenabledとして認識します。 # > 実数で指定した場合はdurationとして認識します。 # # - <<回転>> ----------------------------------------------------------------- # # $game_map.rotate(:absolute, angle[, duration]) # $game_map.rotate(:relative, angle[, duration]) # $game_map.rotate(:reset[, duration]) # # [説明] # マップ画面を回転します。 # # :absolute : 角度を絶対指定(指定した角度で表示) # :relative : 角度を相対指定(現在の角度からさらに回転) # :reset : 回転状態を解除 # angle : 回転角度 # duration : 回転完了までの時間(省略時は即時) # #(例)$game_map.rotate(:absolute, 180, 60) # # - <<波形>> ----------------------------------------------------------------- # # $game_map.wave(amplitude, length, speed[, duration]) # # [説明] # マップ画面を波打たせます。 # # amplitude : 振幅(波の高さ) # length : 周期(波の長さ : デフォルト 180) # speed : 速度(波打つ速さ : デフォルト 360) # duration : 振幅が設定値になるまでの時間(省略時は即時) # #(例)$game_map.wave(10, 180, 360, 60) #(例)$game_map.wave(20, nil, nil, 60) # # durationは振幅にのみ影響し、周期と速度は即時適用されます。 # 設定値にnilを指定すると、前回の設定を維持します。 # # - <<全効果リセット>> ----------------------------------------------------------------- # # $game_map.effect_reset # $game_map.effect_reset(duration) # # [説明] # 全ての効果をリセットします。 # # duration : リセット完了までの時間(省略時は即時) # # 下記スクリプトをすべて実行した結果と同じになります。 # # $game_map.zoom(:reset[, duration]) # $game_map.mirror(false[, duration]) # $game_map.rotate(:reset[, duration]) # $game_wave(0, 180, 360[, duration]) # # ------------------------------------------------------------------------------ class Game_Map # 効果設定 def effect_setting @effect_setting ||= { :zoom => {:x => Graphics.width / 2 + 0.0, :y => Graphics.height / 2 + 0.0, :magnification => 1.0, :fluctuation => {:x => 0.0, :y => 0.0, :magnification => 0.0}, :duration => 0}, :mirror => {:enabled => false, :denominator => 0.0, :duration => 0}, :rotate => {:angle => 0.0, :fluctuation => 0.0, :duration => 0}, :wave => {:amplitude => 0, :length => 180, :speed => 360, :fluctuation => 0.0, :duration => 0}, :refresh_rate => Graphics.frame_rate } end # ズーム def zoom(coordinate_system, x = 0.0, y = 0.0, *option) magnification = effect_setting[:zoom][:magnification] duration = 1 option.each{|opt| magnification = opt if opt.is_a?(Float) duration = opt if opt.is_a?(Fixnum) } magnification = 1.0 if magnification <= 0.0 duration = 1 if duration < 1 x += 0.0 y += 0.0 case coordinate_system when :map x -= display_x y -= display_y when :player x += $game_player.real_x - display_x y += $game_player.real_y - display_y when :center x = (x + 0.5 - display_x) * 32 y = (y + 0.5 - display_y) * 32 when :reset magnification = 1.0 duration = x > 0 ? x.to_int : 1 x = 0.0 y = 0.0 end if coordinate_system != :center x = x * 32 + Graphics.width / magnification / 2 y = y * 32 + Graphics.height / magnification / 2 end effect_setting[:zoom][:fluctuation][:x] = (x - effect_setting[:zoom][:x]) / duration effect_setting[:zoom][:fluctuation][:y] = (y - effect_setting[:zoom][:y]) / duration effect_setting[:zoom][:fluctuation][:magnification] = (magnification - effect_setting[:zoom][:magnification]) / duration effect_setting[:zoom][:x] = x effect_setting[:zoom][:y] = y effect_setting[:zoom][:magnification] = magnification effect_setting[:zoom][:duration] = duration end # 反転 def mirror(*option) enabled = !effect_setting[:mirror][:enabled] duration = 1 option.each{|opt| enabled = opt if opt.is_a?(TrueClass) || opt.is_a?(FalseClass) duration = opt if opt.is_a?(Fixnum) } duration = 1 if duration < 1 || enabled == effect_setting[:mirror][:enabled] effect_setting[:mirror][:enabled] = enabled effect_setting[:mirror][:denominator] = duration / 2.0 effect_setting[:mirror][:duration] = duration end # 回転 def rotate(angle_type, angle = 0.0, duration = 1) duration = 1 if duration < 1 case angle_type when :absolute effect_setting[:rotate][:fluctuation] = (angle - effect_setting[:rotate][:angle]) / duration effect_setting[:rotate][:angle] = angle % 360 + 0.0 effect_setting[:rotate][:duration] = duration.to_int when :relative effect_setting[:rotate][:fluctuation] = angle / duration effect_setting[:rotate][:angle] = (effect_setting[:rotate][:angle] + angle) % 360 effect_setting[:rotate][:duration] = duration.to_int when :reset effect_setting[:rotate][:duration] = angle > 0 ? angle.to_int : 1 effect_setting[:rotate][:fluctuation] = -1 * effect_setting[:rotate][:angle] / effect_setting[:rotate][:duration] effect_setting[:rotate][:angle] = 0.0 end end # 波形 def wave(amplitude, length, speed, duration = 1) duration = duration < 1 ? 1 : duration.to_int effect_setting[:wave][:fluctuation] = 0.0 if amplitude effect_setting[:wave][:fluctuation] = (amplitude - effect_setting[:wave][:amplitude] + 0.0) / duration effect_setting[:wave][:amplitude] = amplitude.to_int end effect_setting[:wave][:length] = length.to_int if length effect_setting[:wave][:speed] = speed.to_int if speed effect_setting[:wave][:duration] = duration end # リセット def effect_reset(duration = 1) duration = duration < 1 ? 1 : duration.to_int self.zoom(:reset, duration) self.mirror(false, duration) self.rotate(:reset, duration) self.wave(0, 180, 360, duration) end # 効果画面リフレッシュレート def effect_refresh_rate=(rate) effect_setting[:refresh_rate] = (rate > 0) ? rate.to_int : Graphics.frame_rate end end class Spriteset_Weather # 悪天候による薄暗さを解除 def clear @viewport.tone.set(0, 0, 0) end # 雨雪表示設定 def visible=(visibility) @sprites.compact.each{|sprite| sprite.visible = visibility} end end class Spriteset_Map alias :km20150805_initialize :initialize def initialize km20150805_initialize create_effect update end alias :km20150805_update :update def update return unless @effect_sprite # 雨雪を表示 @weather.visible = true km20150805_update update_effect end alias :km20150805_dispose :dispose def dispose km20150805_dispose dispose_effect end def effect_setting $game_map.effect_setting end # 生成 def create_effect @effect_sprite = Sprite.new(Viewport.new) @effect_sprite.viewport.z = @viewport1.z + (@viewport2.z - @viewport1.z) / 2 @effect_sprite.bitmap = Bitmap.new(1, 1) @effect_sprite.bitmap.dispose # ズーム設定 @effect_sprite.x = Graphics.width / 2 @effect_sprite.y = Graphics.height / 2 @effect_sprite.ox = effect_setting[:zoom][:x] @effect_sprite.oy = effect_setting[:zoom][:y] @effect_sprite.zoom_x = @effect_sprite.zoom_y = effect_setting[:zoom][:magnification] # 反転設定 @effect_sprite.mirror = effect_setting[:mirror][:enabled] # 回転設定 @effect_sprite.angle = effect_setting[:rotate][:angle] # 波形設定 @effect_sprite.wave_amp = effect_setting[:wave][:amplitude] @effect_sprite.wave_length = effect_setting[:wave][:length] @effect_sprite.wave_speed = effect_setting[:wave][:speed] # 初期化 effect_setting[:zoom][:duration] = 0 effect_setting[:mirror][:duration] = 0 effect_setting[:rotate][:duration] = 0 effect_setting[:wave][:duration] = 0 end # 更新 def update_effect # ズーム効果適用 if effect_setting[:zoom][:duration] > 0 effect_setting[:zoom][:duration] -= 1 if effect_setting[:zoom][:duration] > 0 @effect_sprite.ox = effect_setting[:zoom][:x] - effect_setting[:zoom][:fluctuation][:x] * effect_setting[:zoom][:duration] @effect_sprite.oy = effect_setting[:zoom][:y] - effect_setting[:zoom][:fluctuation][:y] * effect_setting[:zoom][:duration] @effect_sprite.zoom_x = @effect_sprite.zoom_y = effect_setting[:zoom][:magnification] - effect_setting[:zoom][:fluctuation][:magnification] * effect_setting[:zoom][:duration] else @effect_sprite.ox = effect_setting[:zoom][:x] @effect_sprite.oy = effect_setting[:zoom][:y] @effect_sprite.zoom_x = @effect_sprite.zoom_y = effect_setting[:zoom][:magnification] end end # 反転効果適用 if effect_setting[:mirror][:duration] > 0 effect_setting[:mirror][:duration] -= 1 if effect_setting[:mirror][:duration] > effect_setting[:mirror][:denominator] width = (effect_setting[:mirror][:duration] - effect_setting[:mirror][:denominator]) / effect_setting[:mirror][:denominator] else width = (effect_setting[:mirror][:denominator] - effect_setting[:mirror][:duration]) / effect_setting[:mirror][:denominator] @effect_sprite.mirror = effect_setting[:mirror][:enabled] end @effect_sprite.zoom_x = effect_setting[:zoom][:duration] > 0 ? @effect_sprite.zoom_x * width : effect_setting[:zoom][:magnification] * width end # 回転効果適用 if effect_setting[:rotate][:duration] > 0 effect_setting[:rotate][:duration] -= 1 @effect_sprite.angle = effect_setting[:rotate][:duration] > 0 ? @effect_sprite.angle + effect_setting[:rotate][:fluctuation] : effect_setting[:rotate][:angle] end # 波形効果適用 if effect_setting[:wave][:duration] > 0 effect_setting[:wave][:duration] -= 1 if effect_setting[:wave][:duration] > 0 @effect_sprite.wave_amp = effect_setting[:wave][:amplitude] - effect_setting[:wave][:fluctuation] * effect_setting[:wave][:duration] @effect_sprite.wave_length = effect_setting[:wave][:length] @effect_sprite.wave_speed = effect_setting[:wave][:speed] else @effect_sprite.wave_amp = effect_setting[:wave][:amplitude] @effect_sprite.wave_length = effect_setting[:wave][:length] @effect_sprite.wave_speed = effect_setting[:wave][:speed] end @effect_sprite.update if @effect_sprite.wave_amp == 0 end # 元画面表示 @viewport1.visible = true # 適用効果なしなら何もしない if @effect_sprite.zoom_y == 1.0 && @effect_sprite.angle == 0.0 && !@effect_sprite.mirror && effect_setting[:mirror][:duration] == 0 && @effect_sprite.wave_amp == 0 @effect_sprite.bitmap.dispose return end # 更新メイン if @effect_sprite.bitmap.disposed? || Graphics.frame_count % (Graphics.frame_rate / effect_setting[:refresh_rate]) == 0 # マップ画面取得に不要なものを一時的に取り除く(悪天候の薄暗さ解除&ピクチャ非表示&タイマー非表示) @weather.clear $game_map.screen.pictures.each{|picture| @picture_sprites[picture.number].visible = false} tv = @timer_sprite.visible @timer_sprite.visible = false # マップタイルやキャラクターを最前面に表示 z1 = @viewport1.z z2 = @viewport2.z @viewport1.z += 10000 @viewport2.z += 10000 # マップ画面取得 @effect_sprite.bitmap.dispose @effect_sprite.bitmap = Graphics.snap_to_bitmap # 各種表示を元に戻す @viewport1.z = z1 @viewport2.z = z2 @weather.update_screen $game_map.screen.pictures.each{|picture| @picture_sprites[picture.number].visible = true} @timer_sprite.visible = tv end # 元画面の天候、マップタイル、キャラクターは非表示に @viewport1.visible = false @weather.visible = false # スプライト更新(波形効果用) @effect_sprite.update if @effect_sprite.wave_amp != 0 end # 解放 def dispose_effect @effect_sprite.bitmap.dispose @effect_sprite.viewport.dispose @effect_sprite.dispose end end