Permanent
Creation

RPGツクールXP/VX用のRGSS素材です。
一部英語版対応です。 (A few materials can be used for English RPG MAKER XP/VX.)
競合率はルファーの独断と偏見なのでたまにハズレます。


スクリーンショット
↑スクリーンショット (クリックで拡大)
#==============================================================================
# ■ 画面のズームぼかしエフェクト
#------------------------------------------------------------------------------
#  画面に「ズームぼかし」という効果をかけます。
# (C) ルファー
# WebSite https://tkoolerlufar.pages.dev/
#==============================================================================

=begin
  =対応RGSS
  2

  =他の素材との競合の可能性
  ... きっとない

  = 簡単な使い方。
  Graphics.zooming_blur = true  でぼかしを始め、
  Graphics.zooming_blur = false でぼかしを終えます。

  = ちょっと凝った使い方
  * Graphics.zooming_blur_strength = (数値) でぼかしの強さを変えられます。
  大きいほど強いぼかしになり、0 にするとぼかさなくなります。
  既定では 128 です。
  204 くらいにすると、一瞬何が書いてあるかわからなくなります。
  * Graphics.zooming_blur_ratio = (数値) でぼかしの拡大率を変えられます。
  * Graphics.zooming_blur_cycle = (数値) でぼかし効果の更新周期を変えられます。
  処理が重いと感じたら、大きめの値をセットしてみてください。
  公開当初のバージョンと同じ効果が欲しいときは 1 に設定してください。
  既定では 2 です。

  = 注意事項
  ズームぼかしの状態はセーブされません。
  ズームぼかしをONにしてる間はイベントが終わらないなどして
  セーブさせないようにしてください。

  = おまけ機能
  Lufar.zooming_blur_origin = (数値) で、ぼかしの「原点」を変えられます。
  原点を変えると、例えば左上隅を原点にすると、
  左上に向かってズームするようにぼけます。
  原点の数値はパソコンのテンキーボードに対応しており、5 が中心です。
  つまりこう。
  +-+-+-+
  |7|8|9|
  +-+-+-+
  |4|5|6|
  +-+-+-+
  |1|2|3|
  +-+-+-+

  = テクニック
  * Graphics.zooming_blur_ratio を 1 に設定すると
  線形モーションぼかし ('90年くらいの LCD みたいな残像効果) になります。
  * Graphics.zooming_blur_strength を 0 からちょっとずつ増やせば
  ちょっとずつぼかしが強くなります。
  * Graphics.zooming_blur_origin を 0 に設定すれば
  Graphics.zooming_blur が true のままでもぼかしをかけなくなります。

  =更新履歴
  2015/01/31 注意事項を追加、パフォーマンス改善、他軽微なバグを修正
  2013/02/10 説明文を若干訂正、演出を微調整
  2013/02/08 プロパティ追加、既定値を微調整
  2010/04/13 公開

  =再定義しているメソッド (いずれもエイリアス使用)
  Graphics.update

  =新規定義しているメソッド
  Graphics._Lufar_ZoomingBlur_MakeTemporaryScreenSprite
  Graphics._Lufar_ZoomingBlur_Valid?
  Graphics.zooming_blur
  Graphics.zooming_blur=
  Graphics.zooming_blur_ratio
  Graphics.zooming_blur_ratio=
  Graphics.zooming_blur_strength
  Graphics.zooming_blur_strength=
  Graphics.zooming_blur_cycle
  Graphics.zooming_blur_cycle=
  Graphics.zooming_blur_origin
  Graphics.zooming_blur_origin=
=end
#----------------------------------------------------------------------------
# ◆ Graphics モジュール
#----------------------------------------------------------------------------
module Graphics
  #--------------------------------------------------------------------------
  # ○ クラス変数
  #--------------------------------------------------------------------------
  @@_Lufar_ZoomingBlur_TemporaryScreenSprite = nil
  @@_Lufar_ZoomingBlur_ZoomingBlur = false
  @@_Lufar_ZoomingBlur_RatioOfZoomingBlur = 1.0625
  @@_Lufar_ZoomingBlur_StrengthOfZoomingBlur = 0x80
  @@_Lufar_ZoomingBlur_CycleOfZoomingBlur = 2
  @@_Lufar_ZoomingBlur_OriginOfZoomingBlur = 5
  #--------------------------------------------------------------------------
  # ○ ズームぼかし用一時画面スプライトの作成
  #--------------------------------------------------------------------------
  def self._Lufar_ZoomingBlur_MakeTemporaryScreenSprite
    # 必要ならばスプライトを作成
    self._Lufar_ZoomingBlur_WhenSpriteExists(false) do
      @@_Lufar_ZoomingBlur_TemporaryScreenSprite = Sprite.new
    end
    # 設定を反映
    @@_Lufar_ZoomingBlur_TemporaryScreenSprite.z = 0x7fffffff
    self.zooming_blur_ratio = self.zooming_blur_ratio
    self.zooming_blur_strength = self.zooming_blur_strength
    self.zooming_blur_origin = self.zooming_blur_origin
  end
  #--------------------------------------------------------------------------
  # ○ ズームぼかし用一時画面スプライトが存在するときのみイテレータを実行
  #     flag : 偽だと逆にスプライトが存在しないときのみ実行する
  #--------------------------------------------------------------------------
  def self._Lufar_ZoomingBlur_WhenSpriteExists(flag = true)
    yield if !flag == (
             @@_Lufar_ZoomingBlur_TemporaryScreenSprite.nil? or
             @@_Lufar_ZoomingBlur_TemporaryScreenSprite.disposed?)
  end
  #--------------------------------------------------------------------------
  # ○ ズームぼかしフラグの取得
  #--------------------------------------------------------------------------
  def self.zooming_blur
    @@_Lufar_ZoomingBlur_ZoomingBlur
  end
  #--------------------------------------------------------------------------
  # ○ ズームぼかしフラグの設定
  #     flag : 設定する値
  #--------------------------------------------------------------------------
  def self.zooming_blur=(flag)
    # フラグが立ったらスプライト作成
    if @@_Lufar_ZoomingBlur_ZoomingBlur = flag
      self._Lufar_ZoomingBlur_WhenSpriteExists(false) do
        _Lufar_ZoomingBlur_MakeTemporaryScreenSprite
      end
    # フラグが倒れたらスプライト解放
    else
      self._Lufar_ZoomingBlur_WhenSpriteExists do
        unless @@_Lufar_ZoomingBlur_TemporaryScreenSprite.bitmap.nil? or
               @@_Lufar_ZoomingBlur_TemporaryScreenSprite.bitmap.disposed?
          @@_Lufar_ZoomingBlur_TemporaryScreenSprite.bitmap.dispose
        end
        @@_Lufar_ZoomingBlur_TemporaryScreenSprite.dispose
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ ズームぼかし倍率の取得
  #--------------------------------------------------------------------------
  def self.zooming_blur_ratio
    @@_Lufar_ZoomingBlur_RatioOfZoomingBlur
  end
  #--------------------------------------------------------------------------
  # ○ ズームぼかし倍率の設定
  #     val : 設定する値
  #--------------------------------------------------------------------------
  def self.zooming_blur_ratio=(val)
    unless val.is_a?(Numeric) and val >= 1
      raise(val.is_a?(Numeric) ? ArgumentError : TypeError,
        "1以上の数で指定してください(#{val.inspect})", caller)
    end
    @@_Lufar_ZoomingBlur_RatioOfZoomingBlur = val
    # スプライトがあれば設定を即反映
    self._Lufar_ZoomingBlur_WhenSpriteExists do
      @@_Lufar_ZoomingBlur_TemporaryScreenSprite.zoom_x =
      @@_Lufar_ZoomingBlur_TemporaryScreenSprite.zoom_y =
        self.zooming_blur_ratio
    end
  end
  #--------------------------------------------------------------------------
  # ○ ズームぼかし強度の取得
  #--------------------------------------------------------------------------
  def self.zooming_blur_strength
    @@_Lufar_ZoomingBlur_StrengthOfZoomingBlur
  end
  #--------------------------------------------------------------------------
  # ○ ズームぼかし強度の設定
  #     val : 設定する値
  #--------------------------------------------------------------------------
  def self.zooming_blur_strength=(val)
    unless val.is_a?(Integer) and val.between?(0x00, 0xfe)
      raise(val.is_a?(Integer) ? ArgumentError : TypeError,
        "0以上254以下の整数で指定してください(#{val.inspect})", caller)
    end
    @@_Lufar_ZoomingBlur_StrengthOfZoomingBlur = val
    # スプライトがあれば設定を即反映
    self._Lufar_ZoomingBlur_WhenSpriteExists do
      @@_Lufar_ZoomingBlur_TemporaryScreenSprite.opacity =
        self.zooming_blur_strength
    end
  end
  #--------------------------------------------------------------------------
  # ○ ズームぼかし周期の取得
  #--------------------------------------------------------------------------
  def self.zooming_blur_cycle
    @@_Lufar_ZoomingBlur_CycleOfZoomingBlur
  end
  #--------------------------------------------------------------------------
  # ○ ズームぼかし周期の設定
  #     val : 設定する値
  #--------------------------------------------------------------------------
  def self.zooming_blur_cycle=(val)
    unless val.is_a?(Integer) and val > 0
      raise(val.is_a?(Integer) ? ArgumentError : TypeError,
        "1以上の整数で指定してください(#{val.inspect})", caller)
    end
    @@_Lufar_ZoomingBlur_CycleOfZoomingBlur = val
  end
  #--------------------------------------------------------------------------
  # ○ ズームぼかし原点の取得
  #--------------------------------------------------------------------------
  def self.zooming_blur_origin
    @@_Lufar_ZoomingBlur_OriginOfZoomingBlur
  end
  #--------------------------------------------------------------------------
  # ○ ズームぼかし原点の設定
  #     val : 設定する値
  #--------------------------------------------------------------------------
  def self.zooming_blur_origin=(val)
    unless val.is_a?(Integer) and val.between?(0, 9)
      raise(val.is_a?(Integer) ? ArgumentError : TypeError,
        "0以上9以下の整数で指定してください(#{val.inspect})", caller)
    end
    @@_Lufar_ZoomingBlur_OriginOfZoomingBlur = val
    # スプライトがあれば設定を即反映
    self._Lufar_ZoomingBlur_WhenSpriteExists do
      @@_Lufar_ZoomingBlur_TemporaryScreenSprite.visible =
        self.zooming_blur_origin != 0
    end
  end
  #--------------------------------------------------------------------------
  # ○ プロパティのエイリアス
  #--------------------------------------------------------------------------
  instance_eval do
    alias lufar_zooming_blur  zooming_blur
    alias lufar_zooming_blur= zooming_blur=
    alias lufar_zooming_blur_ratio  zooming_blur_ratio
    alias lufar_zooming_blur_ratio= zooming_blur_ratio=
    alias lufar_zooming_blur_strength  zooming_blur_strength
    alias lufar_zooming_blur_strength= zooming_blur_strength=
    alias lufar_zooming_blur_cycle  zooming_blur_cycle
    alias lufar_zooming_blur_cycle= zooming_blur_cycle=
    alias lufar_zooming_blur_origin  zooming_blur_origin
    alias lufar_zooming_blur_origin= zooming_blur_origin=
  end
  #--------------------------------------------------------------------------
  # ○ ぼかし有効判定
  #--------------------------------------------------------------------------
  def self._Lufar_ZoomingBlur_Valid?
    # フラグが立っていても、その他のパラメーターが無効ならぼかし無効
    zooming_blur and
    zooming_blur_strength > 0 and
    zooming_blur_origin > 0
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  unless defined? _Lufar_ZoomingBlur_Update
    instance_eval do
      alias _Lufar_ZoomingBlur_Update update
    end
  end
  def self.update
    # フレーム更新
    _Lufar_ZoomingBlur_Update
    # ぼかしが無効ならここまで
    return unless _Lufar_ZoomingBlur_Valid?
    # ぼかし更新周期でなければここまで
    return if (self.frame_count - 1) % zooming_blur_cycle != 0
    # 一時画面スプライトがないか解放されていれば作り直す
    self._Lufar_ZoomingBlur_WhenSpriteExists(false) do
      _Lufar_ZoomingBlur_MakeTemporaryScreenSprite
    end
    # 名前の短いローカル変数に参照をセット
    temporary_screen_sprite = @@_Lufar_ZoomingBlur_TemporaryScreenSprite
    # ビットマップが解放されていれば作り直す
    if temporary_screen_sprite.bitmap.nil? or
       temporary_screen_sprite.bitmap.disposed?
      bmp = Bitmap.new(self.width, self.height)
    # 画面解像度が変えられていればビットマップを作り直す
    elsif self.width  != temporary_screen_sprite.bitmap.width or
          self.height != temporary_screen_sprite.bitmap.height
      temporary_screen_sprite.bitmap.dispose
      bmp = Bitmap.new(self.width, self.height)
    else
      bmp = temporary_screen_sprite.bitmap
    end
    # ぼかしを更新
    temporary_screen_sprite.bitmap = self.snap_to_bitmap
    bmp.dispose
    # スプライトの矩形を更新
    temporary_screen_sprite.x = Graphics.width  *
      ((zooming_blur_origin - 1) % 3) / 2
    temporary_screen_sprite.y = Graphics.height *
      ((9 - zooming_blur_origin) / 3) / 2
    temporary_screen_sprite.ox = temporary_screen_sprite.bitmap.width  *
      ((zooming_blur_origin - 1) % 3) / 2
    temporary_screen_sprite.oy = temporary_screen_sprite.bitmap.height *
      ((9 - zooming_blur_origin) / 3) / 2
    temporary_screen_sprite.zoom_x =
    temporary_screen_sprite.zoom_y = zooming_blur_ratio
  end
end

戻る