#==============================================================================
# ★ RGSS3_視界制限 Ver1.2
#==============================================================================
=begin
作者:tomoaky
webサイト:ひきも記 ([url]http://hikimoki.sakura.ne.jp/[/url])
設定した番号のマップだけ視界を制限します。
アクター、職業、武器(防具)、ステートなどのメモ欄にタグを書き込むことで
視界制限のサイズを補正することができます。
例)<視界補正 32>
視界が 32 ドット広がります。
視界補正値の計算をおこなうのは戦闘メンバーのみとなります。
ゲーム変数(初期設定では9番)を使って視界のサイズを補正できます。
実際の視界制限サイズは上記の設定値をすべて加算したものになります。
ただし、マップに視界制限値が設定されていない場合はすべて無効です。
プレイヤーの画面上の座標が常に変わるような状況(1画面分の小さなマップなど)、
視界補正値がリアルタイムに変化する状況などでは頻繁にスプライトの再描画を
実行するため処理が重くなります
動作に必要な画像
Graphics/System/sight_shadow.png
使用するゲーム変数(初期設定)
0009
2013.01.22 Ver1.2
・毎フレーム再描画をおこなっていた処理を改善
・環境によってエラー落ちの原因となる部分を修正
2012.03.07 Ver1.11
・メニューから復帰したときに視界制限が途切れる不具合を修正
2012.02.05 Ver1.1
・タイマーが隠れてしまわないようにZ座標を調整
・ゲーム変数を使って視界制限サイズを補正する機能を追加
2012.01.20 Ver1.0
公開
=end
#==============================================================================
# □ 設定項目
#==============================================================================
module TMBLSIGHT
# 何番のマップをどれだけ視界制限するか
# 例)SIGHT[3] = 128 # 3番のマップの視界を128ドット四方に制限する
SIGHT = {}
SIGHT[1] = 256
VN_SIGHT = 9 # 視界のサイズ補正に利用するゲーム変数番号
end
#==============================================================================
# □ RPG::BaseItem
#==============================================================================
class RPG::BaseItem
#--------------------------------------------------------------------------
# ○ 視界制限の補正値
#--------------------------------------------------------------------------
def sight_power
unless @sight_power
@sight_power = /<視界補正\s*(\-*\d+)\s*>/ =~ @note ? $1.to_i : 0
end
@sight_power
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor
#--------------------------------------------------------------------------
# ○ 視界制限の補正値
#--------------------------------------------------------------------------
def sight_power
feature_objects.inject(0) {|result, object| result + object.sight_power }
end
end
#==============================================================================
# □ Sprite_SightShadow
#==============================================================================
class Sprite_SightShadow < Sprite
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(viewport = nil)
super(viewport)
self.z = 199
self.bitmap = Bitmap.new(Graphics.width, Graphics.height)
@bitmap_shadow = Bitmap.new("Graphics/System/sight_shadow")
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
self.bitmap.dispose
@bitmap_shadow.dispose
super
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
#if TMBLSIGHT::SIGHT[$game_map.map_id]
if TMBLSIGHT::SIGHT[$game_variables[1]]
self.visible = true
w = TMBLSIGHT::SIGHT[$game_map.map_id] # マップに設定された補正値
w += $game_variables[TMBLSIGHT::VN_SIGHT] # ゲーム変数による補正値
$game_party.battle_members.each do |actor|
w = [w + actor.sight_power, 48].max # 戦闘メンバーの補正値
end
x = $game_player.screen_x - w / 2
y = $game_player.screen_y - w / 2 - 16
if w != @last_w || x != @last_x || y != @last_y
@last_w = w
@last_x = x
@last_y = y
self.bitmap.clear
rect = Rect.new(x, y, w, w)
self.bitmap.stretch_blt(rect, @bitmap_shadow, @bitmap_shadow.rect)
color = Color.new(0, 0, 0)
self.bitmap.fill_rect(0, 0, Graphics.width, y, color)
self.bitmap.fill_rect(0, y + w, Graphics.width, Graphics.height - y - w, color)
self.bitmap.fill_rect(0, y, x, w, color)
self.bitmap.fill_rect(x + w, y, Graphics.width - x - w, w, color)
end
else
self.visible = false
end
end
end
#==============================================================================
# ■ Spriteset_Map
#==============================================================================
class Spriteset_Map
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias tmblsight_spriteset_map_initialize initialize
def initialize
tmblsight_spriteset_map_initialize
create_sight_shadow
end
#--------------------------------------------------------------------------
# ○ 視界制限スプライトの作成
#--------------------------------------------------------------------------
def create_sight_shadow
@sight_shadow_sprite = Sprite_SightShadow.new(@viewport2)
update_sight_shadow
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
alias tmblsight_spriteset_map_dispose dispose
def dispose
dispose_sight_shadow
tmblsight_spriteset_map_dispose
end
#--------------------------------------------------------------------------
# ○ 視界制限スプライトの解放
#--------------------------------------------------------------------------
def dispose_sight_shadow
@sight_shadow_sprite.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias tmblsight_spriteset_map_update update
def update
update_sight_shadow
tmblsight_spriteset_map_update
end
#--------------------------------------------------------------------------
# ○ 視界制限スプライトの更新
#--------------------------------------------------------------------------
def update_sight_shadow
@sight_shadow_sprite.update if @sight_shadow_sprite
end
end