読者です 読者をやめる 読者になる 読者になる

RPGツクール素材メモ

同人RPGの制作で役立ちそうなスクリプト・プラグイン素材を書き留めておく

イベントの頭上に変数だけでなく、アイコンも複数表示

RGSS3:ネームポップ改変

*注意:バージョンアップしました
イベントの頭上に文字表示、フォント変更も可能に - RGSS3・RPGツクールVXAceメモ


ネームポップ改造の変数表示をアップデート、アイコンも表示できるようにしました。

http://kirara111.sakura.ne.jp/tukulu/namep_v_i.zip

f:id:gamecome:20150122002133j:plain

表示の仕方は

<namepop @I[アイコンインデックス]@>

と入力すればOK。
(*前回Verは(番号)でしたが、文章メッセージ内での表記に合わせて、[番号]という形式に変えました)


f:id:gamecome:20150122002638j:plain
また@で包まれた文章を複数使えるようになったので、アイコン+変数という表示も可能になりました。


一応テキストとしても貼っておきます。。。
[コードを表示する]

#==============================================================================
# ★ RGSS3_ネームポップ Ver1.11
#==============================================================================
=begin

元作者:tomoaky
webサイト:ひきも記 (http://hikimoki.sakura.ne.jp/)

イベント名かイベント実行内容の先頭に『注釈』コマンドで
<namepop 文字列>
と記述してください。
イベントキャラクターの頭上に文字列が表示されます。

イベント名で指定した場合はイベント全ページに適用されますが、
優先度は注釈コマンドの方が高くなっています。

文字を消したい場合は <namepop none> としてください。
=end

=begin
改造:111
webサイト:http://gamecome.hateblo.jp/

2015.1.18
変数を表示できるようにしてみました。

2015.1.22
アイコンも表示できるように。
@@で包む文を複数表示できるように。

変数の値を変えた後は
スクリプトから
update_namepop
と書いて、更新しないと反映されません

=end

#==============================================================================
# □ 設定項目
#==============================================================================
module TMNPOP
  FONT_SIZE = 22          # フォントサイズ
  FONT_OUT_ALPHA = 255    # フォントの縁取り不透明度
  FONT_V_COLOR = Color.new(255 , 255 , 0) # 変数の時のカラー(フォント設定の方が良いかも)
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 =~ /@([Ii|Vv])\[(\d+?)\]@/
      type = $1.upcase
      if type == "I"
        obj[:value] = $2.to_i
        obj[:type] = "Icon"   
      elsif type == "V"
        obj[:value] = $game_variables[$2.to_i].to_s
      end
    end
    obj
  end
   
  #--------------------------------------------------------------------------
  # ○ namepopの開始
  #--------------------------------------------------------------------------
  def start_namepop
    dispose_namepop
    return if @namepop == "none" || @namepop == nil
    @namepop_sprite = ::Sprite.new(viewport)
    h = TMNPOP::FONT_SIZE

    namepop_draws = _variables_split(@namepop)
    # 分けた文字列(アイコン)を描画
    total_width = 0
    tmp_b = Bitmap.new(Graphics.width , h)
    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(h * str.length, h)
        b.font.size = TMNPOP::FONT_SIZE
        b.font.out_color.alpha = TMNPOP::FONT_OUT_ALPHA      
        
        r = b.text_size(str)
        tmp_b.font = b.font
        tmp_b.draw_text(total_width, 0, r.width , r.height , str)  
      end
      total_width += r.width
    }
    # 文字列(アイコン)を結合
    @namepop_sprite.bitmap = Bitmap.new(total_width, h)
    r = Rect.new(0, 0, total_width, tmp_b.height) 
    @namepop_sprite.bitmap.blt(0, 0, tmp_b , r)
    
    @namepop_sprite.ox = @namepop_sprite.width / 2
    @namepop_sprite.oy = h
    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