#==============================================================================
# ★ RGSS3_ネームポップ Ver1.11
#==============================================================================
=begin
元作者:tomoaky
webサイト:ひきも記 ([url]http://hikimoki.sakura.ne.jp/[/url])
イベント名かイベント実行内容の先頭に『注釈』コマンドで
<namepop 文字列>
と記述してください。
イベントキャラクターの頭上に文字列が表示されます。
イベント名で指定した場合はイベント全ページに適用されますが、
優先度は注釈コマンドの方が高くなっています。
文字を消したい場合は <namepop none> としてください。
=end
=begin
改造:111
webサイト:[url]http://gamecome.hateblo.jp/[/url]
2015.1.18
変数を表示できるようにしてみました。
2015.1.22
アイコンも表示できるように。
@@で包む表記を複数利用できるように。
2015.1.26
フォント変更も利用できるように。
変数の値を変えた後は
スクリプトから
update_namepop
と書いて、更新しないと反映されません
=end
module TMNPOP
def self.create_font(params = nil)
font = Font.new()
if(params)
params.each{|key , value|
font.send(key.to_s + "=", value)
}
end
font
end
end
#==============================================================================
# □ 設定項目
#==============================================================================
module TMNPOP
FONT_SIZE = 22 # フォント指定しない場合の、フォントサイズ
FONT_OUT_ALPHA = 255 # フォント指定しない場合の、フォントの縁取り不透明度
#
# 見本のフォント(それぞれFONT(0)~FONT(4)で指定、追加も可能)
#
FONT = [
self.create_font() ,
self.create_font({:out_color => Color.new(255,0,0,128) }) ,
self.create_font({:size => 32 , :bold => true , :shadow => true}) ,
self.create_font({:italic => true , :outline => false ,
:color => Color.new(120,120,255,255) }) ,
self.create_font({:size => 18 , :out_color => Color.new(255,255,255,128) ,
:bold => true , :shadow => true , :color => Color.new(0,0,0,255) })
]
end
#==============================================================================
# ■ Game_Character
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :namepop # ポップアップテキスト
attr_accessor :will_namepop_update
#--------------------------------------------------------------------------
end
#==============================================================================
# ■ Game_Event
#==============================================================================
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# ● イベントページの設定をクリア
#--------------------------------------------------------------------------
alias tmnpop_game_event_clear_page_settings clear_page_settings
def clear_page_settings
tmnpop_game_event_clear_page_settings
@namepop = nil
@will_namepop_update = false
end
#--------------------------------------------------------------------------
# ● イベントページの設定をセットアップ
#--------------------------------------------------------------------------
alias tmnpop_game_event_setup_page_settings setup_page_settings
def setup_page_settings
tmnpop_game_event_setup_page_settings
@namepop = nil
@namepop_sprite_strs = nil
if @list
@namepop = $1 if /<namepop\s*(\S+?)>/i =~ @event.name
@list.each do |list|
if list.code == 108 || list.code == 408
@namepop = $1 if /<namepop\s*(\S+?)>/i =~ list.parameters[0]
else
break
end
end
end
end
end
#==============================================================================
# ■ Sprite_Character
#==============================================================================
class Sprite_Character < Sprite_Base
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
alias tmnpop_sprite_character_dispose dispose
def dispose
dispose_namepop
tmnpop_sprite_character_dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias tmnpop_sprite_character_update update
def update
tmnpop_sprite_character_update
update_namepop
if @character.namepop != @namepop or @character.will_namepop_update
@namepop = @character.namepop
@character.will_namepop_update = false
start_namepop
end
end
#
# @~@と普通の文字とを分割する
#
def _variables_split(namepop)
tag_on = false
str = ""
strs = []
namepop.each_char do |char|
if char == "@"
if tag_on
str += char
char = ""
end
strs << str.clone
str = ""
tag_on = !tag_on
end
str += char
end
strs << str # 最終の@から行末まで
strs.delete("")
strs
end
#
# 変数、アイコン変換
#
def _namepop_change(str)
obj = {:value => str , :font => nil , :type => "String"}
if str =~ /@.+?@/
str.upcase!
str.delete!("@")
# 変数(V[])を先に置換 *但し変数を囲む変数は置換されない
str.gsub!(/V\[(\d+?)\]/){|text|
$game_variables[$1.to_i]
}
# 個別タグがまだある場合、反映
str.scan(/((I|V|FONT)\[(\d+?)\])/).each{|tmp|
if tmp[1] == "I"
obj[:value] = tmp[2].to_i
obj[:type] = "Icon"
return obj
end
if tmp[1] == "FONT"
obj[:font] = TMNPOP::FONT[tmp[2].to_i]
str.sub!(tmp[0] , "")
elsif tmp[1] == "V"
obj[:value] = $game_variables[tmp[2].to_i]
str.sub!(tmp[0] , "")
end
}
obj[:value] = str
end
obj
end
#--------------------------------------------------------------------------
# ○ namepopの開始
#--------------------------------------------------------------------------
def start_namepop
dispose_namepop
return if @namepop == "none" || @namepop == nil
@namepop_sprite = ::Sprite.new(viewport)
namepop_draws = _variables_split(@namepop)
# 分けた文字列(アイコン)を描画
total_width = 0
best_height = 0
tmp_b = Bitmap.new(Graphics.width , Graphics.height)
namepop_draws.each{|str|
obj = _namepop_change(str)
if obj[:type] == "Icon" # アイコン描画
icon_index = obj[:value]
icon_bitmap = Cache.system("Iconset")
r = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
tmp_b.blt(total_width, 0, icon_bitmap, r)
else # 文字列描画
str = obj[:value]
b = Bitmap.new(1, 1)
if obj[:font]
b.font = obj[:font]
else
b.font.size = TMNPOP::FONT_SIZE
b.font.out_color.alpha = TMNPOP::FONT_OUT_ALPHA
end
tmp_b.font = b.font
r = b.text_size(str)
# 縦が中央揃えになるよう調節
height_adjust = best_height == 0 ? 0 : (best_height - r.height) / 2
tmp_b.draw_text(total_width, height_adjust, r.width , r.height , str)
end
total_width += r.width
best_height = r.height if r.height > best_height
}
# 文字列(アイコン)を結合
@namepop_sprite.bitmap = Bitmap.new(total_width, best_height)
@namepop_sprite.bitmap.blt(0, 0, tmp_b , @namepop_sprite.bitmap.rect)
@namepop_sprite.ox = @namepop_sprite.width / 2
@namepop_sprite.oy = best_height
tmp_b.clear
update_namepop
end
#--------------------------------------------------------------------------
# ○ namepopの更新
#--------------------------------------------------------------------------
def update_namepop
if @namepop_sprite
@namepop_sprite.x = x
@namepop_sprite.y = y - height
@namepop_sprite.z = z + 200
end
end
#--------------------------------------------------------------------------
# ○ namepopの解放
#--------------------------------------------------------------------------
def dispose_namepop
if @namepop_sprite
@namepop_sprite.bitmap.dispose
@namepop_sprite.dispose
@namepop_sprite = nil
end
end
end
#
# ネームポップを更新させる
#
class Game_Interpreter
def update_namepop
$game_map.events.each_value{|event|
event.will_namepop_update = true
}
end
end