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
  1 2

  =必要なライブラリ
  ルファー作スクリプト素材共通ライブラリ

  =他の素材との競合の可能性
  !.. 多分大丈夫

  =RPGツクールXPでの導入方法
  Spriteset_Map より下に新セクションを作成して、
  このプログラムをそこにコピーする

  =使い方
  ゲーム中に、イベントコマンド「スクリプト」で、
  $game_screen.lufar_blind_depth = n  # n は整数 #
  という処理を入れると、プレイヤーの周辺 n マス分しかマップが見えなくなります。
  -1 など、負の数にすると暗くなくなります。

  =テクニック
  $game_screen.lufar_blind_xxxx の値を変更すると、
  プレイヤー周辺の明かりのつき方が変化します。
  $game_screen.lufar_blind_shape・・・明かりの形
    文法) $game_screen.lufar_blind_shape = 0
    0・・・ひし形 (初期状態)
    1・・・円形
    2・・・正方形
    3・・・楕円形
  $game_screen.lufar_blind_color・・・暗闇の色
    文法) $game_screen.lufar_blind_color = Color.new(0.0, 0.0, 0.0, 255)
    Color.new(赤成分, 緑成分, 青成分, 濃さ)で指定します。
    それぞれ最大値は 255.0 です。小数点以下は切り捨てるようです。
  $game_screen.lufar_blind_blend_type・・・合成方法
    文法) $game_screen.lufar_blind_blend_type = 0
    1 にすると加算合成、2 にすると減算合成になります。
    通常合成は 0 です。

  =上級テクニック
  Game_Screen#_Lufar_DarkMap_xxxx メソッドを書き換えれば、
  どんなタイミングでどんな暗闇エフェクトを適用するかを
  自動で判断するようにできます。

  =注意
  RPGツクールVXでご利用の際は、
  上記の説明文にある「$game_screen」を「$game_map.screen」と読み替えてください。
  例えば、
    $game_screen.lufar_blind_depth = 7
  は、RPGツクールVXだと
    $game_map.screen.lufar_blind_depth = 7
  となります。

  =更新履歴
  2013/06/05 lufar_blind_depth に非負の数をセットした後にマップイベントで
             負の数をセットすると暗闇が晴れないバグを修正した
             _Lufar_DarkMap_draw_blind の名前を _Lufar_DarkMap_refresh_blind に
             変更した
  2010/04/01 公開

  =再定義しているメソッド (いずれもエイリアス使用)
  Game_Screen#initialize
  Spriteset_Map#initialize
  Spriteset_Map#dispose
  Spriteset_Map#update

  =新規定義しているメソッド
  Game_Screen#_Lufar_DarkMap_need_refresh
  Game_Screen#_Lufar_DarkMap_need_refresh=
  Game_Screen#_Lufar_DarkMap_depth
  Game_Screen#_Lufar_DarkMap_shape
  Game_Screen#_Lufar_DarkMap_color
  Game_Screen#_Lufar_DarkMap_blend_type
  Game_Screen#lufar_blind_depth=
  Game_Screen#lufar_blind_shape=
  Game_Screen#lufar_blind_color=
  Game_Screen#lufar_blind_blend_type=
  Spriteset_Map#_Lufar_DarkMap_update_blind
  Spriteset_Map#_Lufar_DarkMap_refresh_blind
=end
#----------------------------------------------------------------------------
# ◆ Game_Screen クラス
#----------------------------------------------------------------------------
class Game_Screen
  #--------------------------------------------------------------------------
  # ○ 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :_Lufar_DarkMap_need_refresh  # 要リフレッシュフラグ
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias _Lufar_DarkMap_PrototypeOfInitialization initialize
  def initialize(*args)
    _Lufar_DarkMap_PrototypeOfInitialization(*args)
    @_Lufar_DarkMap_depth = -1
    @_Lufar_DarkMap_shape = 0
    @_Lufar_DarkMap_color = Color.new(0.0, 0.0, 0.0)
    @_Lufar_DarkMap_blend_type = 0
    @_Lufar_DarkMap_need_refresh = false
  end
  #--------------------------------------------------------------------------
  # ○ マップの暗さの取得
  #--------------------------------------------------------------------------
  def _Lufar_DarkMap_depth
    @_Lufar_DarkMap_depth
  end
  #--------------------------------------------------------------------------
  # ○ マップの暗さの設定
  #     val : マップの暗さ
  #--------------------------------------------------------------------------
  def lufar_blind_depth=(val)
    return unless val.kind_of?(Integer)
    return val if @_Lufar_DarkMap_depth == val
    @_Lufar_DarkMap_need_refresh = true
    @_Lufar_DarkMap_depth = val
  end
  #--------------------------------------------------------------------------
  # ○ 暗闇の形の取得
  #--------------------------------------------------------------------------
  def _Lufar_DarkMap_shape
    @_Lufar_DarkMap_shape
  end
  #--------------------------------------------------------------------------
  # ○ 暗闇の形の設定
  #     val : 形
  #--------------------------------------------------------------------------
  def lufar_blind_shape=(val)
    return unless val.kind_of?(Integer)
    return val if @_Lufar_DarkMap_shape == val
    @_Lufar_DarkMap_need_refresh = true
    @_Lufar_DarkMap_shape = val
  end
  #--------------------------------------------------------------------------
  # ○ 暗闇の色の取得
  #--------------------------------------------------------------------------
  def _Lufar_DarkMap_color
    @_Lufar_DarkMap_color
  end
  #--------------------------------------------------------------------------
  # ○ 暗闇の色の設定
  #     val : 暗闇の色
  #--------------------------------------------------------------------------
  def lufar_blind_color=(val)
    return unless val.instance_of?(Color)
    return val if @_Lufar_DarkMap_color == val
    @_Lufar_DarkMap_need_refresh = true
    @_Lufar_DarkMap_color = val
  end
  #--------------------------------------------------------------------------
  # ○ 暗闇の合成方法の取得
  #--------------------------------------------------------------------------
  def _Lufar_DarkMap_blend_type
    @_Lufar_DarkMap_blend_type
  end
  #--------------------------------------------------------------------------
  # ○ 暗闇の合成方法の設定
  #     val : 合成方法
  #--------------------------------------------------------------------------
  def lufar_blind_blend_type=(val)
    return unless val.kind_of?(Integer)
    return val if @_Lufar_DarkMap_blend_type == val
    @_Lufar_DarkMap_need_refresh = true
    @_Lufar_DarkMap_blend_type = val
  end
end
#----------------------------------------------------------------------------
# ◆ Spriteset_Map クラス
#----------------------------------------------------------------------------
class Spriteset_Map
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     args : 引数
  #--------------------------------------------------------------------------
  alias _Lufar_DarkMap_PrototypeOfInitialization initialize
  def initialize(*args)
    _Lufar_DarkMap_PrototypeOfInitialization(*args)
    @game_screen = rpgxp? ? $game_screen : $game_map.screen
    @_Lufar_DarkMap_blind_sprite = Sprite.new(@viewport1)
    @_Lufar_DarkMap_blind_sprite.bitmap = Bitmap.new(41, 374)
    @_Lufar_DarkMap_blind_sprite.z = 5000
    @_Lufar_DarkMap_blind_sprite.zoom_x =
    @_Lufar_DarkMap_blind_sprite.zoom_y = 32.0
    @_Lufar_DarkMap_blind_sprite.ox = 20
    @_Lufar_DarkMap_blind_sprite.oy = 14
    @game_screen._Lufar_DarkMap_need_refresh = true
    _Lufar_DarkMap_update_blind
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  alias _Lufar_DarkMap_PrototypeOfDisposition dispose
  def dispose(*args)
    _Lufar_DarkMap_PrototypeOfDisposition(*args)
    @_Lufar_DarkMap_blind_sprite.bitmap.dispose
    @_Lufar_DarkMap_blind_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias _Lufar_DarkMap_PrototypeOfUpdating update
  def update(*args)
    _Lufar_DarkMap_PrototypeOfUpdating(*args)
    _Lufar_DarkMap_update_blind
  end
  #--------------------------------------------------------------------------
  # ○ 暗闇の更新
  #--------------------------------------------------------------------------
  def _Lufar_DarkMap_update_blind
    return unless defined? @_Lufar_DarkMap_blind_sprite
    _Lufar_DarkMap_refresh_blind if @game_screen._Lufar_DarkMap_need_refresh
    @_Lufar_DarkMap_blind_sprite.color.set(
      @game_screen._Lufar_DarkMap_color.red,
      @game_screen._Lufar_DarkMap_color.green,
      @game_screen._Lufar_DarkMap_color.blue)
    @_Lufar_DarkMap_blind_sprite.opacity =
      @game_screen._Lufar_DarkMap_color.alpha
    @_Lufar_DarkMap_blind_sprite.blend_type =
      @game_screen._Lufar_DarkMap_blend_type
    @_Lufar_DarkMap_blind_sprite.x =
      $game_player.screen_x - 16 - @game_screen.shake
    @_Lufar_DarkMap_blind_sprite.y = $game_player.screen_y - 32
  end
  #--------------------------------------------------------------------------
  # ○ 暗闇のリフレッシュ
  #--------------------------------------------------------------------------
  def _Lufar_DarkMap_refresh_blind
    depth = @game_screen._Lufar_DarkMap_depth
    if depth <= 0
      @_Lufar_DarkMap_blind_sprite.bitmap.clear
      return
    end
    bitmap = @_Lufar_DarkMap_blind_sprite.bitmap
    center_x = @_Lufar_DarkMap_blind_sprite.ox
    center_y = @_Lufar_DarkMap_blind_sprite.oy
    color = Color.new(0.0, 0.0, 0.0, 0.0)
    bitmap.height.times do |y|
      bitmap.width.times do |x|
        px = x - center_x
        py = y - center_y
        distance = case @game_screen._Lufar_DarkMap_shape
          when 0 then px.abs + py.abs
          when 1 then Math.hypot(px, py)
          when 2 then [px.abs, py.abs].max
          when 3
            Math.hypot(
              px.to_f / (screen_width / 32 - 1),
              py.to_f / (screen_height / 32 - 1)
              ) * ([screen_width, screen_height].min / 32 - 1)
          end
        color.alpha = [distance * 255.0 / depth, 255.0].min
        bitmap.set_pixel(x, y, color)
      end
    end
    @game_screen._Lufar_DarkMap_need_refresh = false
  end
end

戻る