地上の洞窟

どこにも行かず、液晶と「にらめっこ」し続ける人の物語。

【RGSS3】ポップテキストの使用・改造

ポップテキストの使用・改造
「ポップテキスト」スクリプトの使い方・改造方法を解説します

→スクリプト一覧へ
→「ポップテキスト」スクリプト配布ページへ


使用方法

設定項目

UNPOP_ON_EVENT_NEW_PAGE
UNPOP_ON_EVENT_NEW_PAGE = true

true → 有効 | false → 無効

有効な場合、イベントページが切り替わる際、
そのイベントに表示されているポップテキストを全て削除します。

DEFAULT_FONT_SIZE
DEFAULT_FONT_SIZE  = 16

数値で指定

テキスト表示の大きさを設定します。

DEFAULT_FONT_BOLD
DEFAULT_FONT_BOLD = true

true → 太字 | false → 通常

テキスト表示を太字に設定します。

DEFAULT_HALF_WIDTH_RATE
DEFAULT_HALF_WIDTH_RATE = 0.6

0以上、1以下の数値で指定

文字幅の計算に使用する倍率です。
フォントサイズを1とした時に、半角文字の幅はどれぐらいになるのか?を指定します。
半角文字の描画で問題が発生してしまう場合、この値を大きくしてください。

表示方式一覧

名称 説明
default 基本の表示方式です。キャラクターの頭上に指定文字列を常時表示します。
name defalutとほぼ同じですが、
プレイヤーの近くにいる時だけ指定文字列を表示します。
eject キャラクターの頭上からテキストが飛び出して行き、
一定時間経つと減速しながらフェードアウトします。


表示スクリプト

PopText.character(character, text, setup = :default)
引数 説明
character Game_Character系列 表示対象のキャラクター
text String 表示する文字
setup Symbol 表示方式の名称(省略した場合:default)

キャラ、文字、表示方式を指定して表示します。

PopText.character($game_player, "プレイヤー")


PopText.player(text, setup = :default)
引数 説明
text String 表示する文字
setup Symbol 表示方式の名称(省略した場合:default)

プレイヤーに対して、文字と表示方式を指定して表示します。

PopText.player("+324G", :eject)


PopText.event(id, text, setup = :default)
引数 説明
id Integer 表示対象のイベントのID
text String 表示する文字
setup Symbol 表示方式の名称(省略した場合:default)

指定したIDのイベントに、文字と表示方式を指定して表示します。

PopText.event(0, "イベント", :name)


PopText.unpop(character)
引数 説明
character Game_Character系列 表示を削除するキャラクター

指定したキャラクターに表示されているテキストを全て削除します。

PopText.unpop($game_player)


PopText.unpop_player

プレイヤーに表示されているテキストを全て削除します。

PopText.unpop_player


PopText.unpop_event(id)
引数 説明
id Integer イベントのID

指定したIDのイベントに表示されているテキストを全て削除します。

PopText.unpop_event(0)



注釈を使用した表示方法

注釈で表示
注釈で表示

「CraftLib」スクリプトが導入されている場合、テキストを表示したいイベントの
イベントページの一番上に「注釈」を置き、その中で表示を指定することで、
イベントページの読み込み時に自動的にテキストを表示することができます。
(nameの表示などに適しています。)

以下は表示の指定方法です。

PopText[UNPOP]

現在のイベントに表示されているテキストを削除します。
UNPOP_ON_EVENT_NEW_PAGEが無効の場合、イベントページが切り替わっても、
切り替わる前のページで表示されていたテキストは引き続き表示されるため、
異なるテキストを表示する場合には、これを先に使用します。

PopText[UNPOP]


PopText[text, setup = :default]
引数 説明
text String 表示する文字
setup Symbol 表示方式の名称(省略した場合:default)

現在のイベントに文字と表示方式を指定して表示します。

PopText["冒険者A", :name]


改造方法

「ポップテキスト」スクリプトは、
表示方式の追加や改造が比較的簡単に行える構造となっています。(たぶん)

表示方式は内部的には、以下の二つに分けて管理されています。

モジュール名 説明 実行タイミング
Setup 指定文字からスプライト・ビットマップを生成する
表示位置の更新に使う変数を用意する、等
表示開始時
シーン遷移時*1
Control スプライト・ビットマップの表示や位置決めを行う
表示終了時に自らテキストの削除を行う、等
毎フレーム

これらのメソッドを名称で管理して呼び出しているので、
ユーザー独自で設定した表示方式も簡単に呼び出せます。

v2.0.0からの注意点

v2.0.0からセーブデータに表示方式のデータが保存されるようになりました。
(逆になぜ今までそうしなかったのか)

そのため、表示方式内で扱うデータに以下の制約がかかります。

「@インスタンス変数」に格納して扱うデータは、
セーブデータとして保存できるデータである必要がある。

(具体的には、RubyのMarshal.dumpが実行できるデータ)

以下、保存できないデータの一例です。

  • Sprite, Bitmap
  • ブロック付きHash, Procなど

その他詳細はRuby公式リファレンスの「Marshal」の項を参照してください。

docs.ruby-lang.org

文字色の変更

文字色の変更
文字色の変更

警告などを表すために文字色を変更したい場合があると思います。
その場合の改造例を紹介します。

まずは標準の表示方式「default」をコピーし、これを元に編集しましょう。
スクリプト本体にある「上級者向け設定」の項目にある、
module Setup → def default の所に定義されています。

module PopText
  module Setup
    def default
      # 基準サイズの設定
      @size = DEFAULT_FONT_SIZE

      # スプライト・ビットマップの作成
      create_graphic

      # フォントの設定
      font = bitmap.font
      font.size = @size
      font.bold = DEFAULT_FONT_BOLD

      # テキストの描画
      draw_text_defalut

      # 位置の設定
      sprite.ox = bitmap.width / 2
      sprite.oy = 32 + bitmap.height + 2
      sprite.z = 1000

      # コントロールの設定
      @control = :control_default
    end
  end
end

これに対して以下の変更を行います。

  • メソッド名の変更 default → warning
  • fontの色を再設定(文字色を赤、縁の色を白に)
module PopText
  module Setup
    # ☆ メソッド名の変更
    def warning
      # 基準サイズの設定
      @size = DEFAULT_FONT_SIZE

      # スプライト・ビットマップの作成
      create_graphic

      # フォントの設定
      font = bitmap.font
      font.size = @size
      font.bold = DEFAULT_FONT_BOLD
      
      # ☆ fontの色を再設定
      font.color.set(255, 0, 0, 255)
      font.out_color.set(255, 255, 255, 224)

      # テキストの描画
      draw_text_defalut

      # 位置の設定
      sprite.ox = bitmap.width / 2
      sprite.oy = 32 + bitmap.height + 2
      sprite.z = 1000

      # コントロールの設定
      @control = :control_default
    end
  end
end

これを以下の注釈などで呼び出します。

PopText["警告!", :warning]

これで、先ほどのような赤文字・白縁取りの警告が表示されます。

表示位置の変更

表示位置の変更
「キャラの役割」を表示したい

キャラの名前に加えて「武器屋・防具屋・アイテム屋」など、
特殊な役割を持つキャラクターに対して、更に文字を表示したい場合があると思います。
しかし、そのまま二つのテキストを表示すると、テキストは重ねて表示されてしまいます。
そのため、テキストの位置をずらして表示するための改造例を紹介します。

まず、「文字色の変更」でやったことと同じように、defaultをコピーして用意します。

module PopText
  module Setup
    def default
      # 基準サイズの設定
      @size = DEFAULT_FONT_SIZE

      # スプライト・ビットマップの作成
      create_graphic

      # フォントの設定
      font = bitmap.font
      font.size = @size
      font.bold = DEFAULT_FONT_BOLD

      # テキストの描画
      draw_text_defalut

      # 位置の設定
      sprite.ox = bitmap.width / 2
      sprite.oy = 32 + bitmap.height + 2
      sprite.z = 1000

      # コントロールの設定
      @control = :control_default
    end
  end
end

テキストの位置は、この中の「# 位置の設定」にて行われています。
sprite.ox, sprite.oyは、それぞれスプライトの原点を表し、
スプライト上のどの位置を0, 0地点とするかを意味します。
これをずらすことによって、テキストの位置を調整しています。

sprite.oy = 32 + bitmap.height

この式内の値は以下の情報を表しています。

  • 32 → キャラのスプライトの高さ
  • bitmap.height → テキストの縦幅

原点が下にずれると実際の表示は上にずれます。
今回はキャラの名前の上に役職を表示したいので、
もう一行分、テキストの縦幅分ずらしたいというわけです。

それを踏まえた上で、以下の改造を行います。

  • メソッド名の変更 defalut → name_job
  • 計算式変更 sprite.oy
  • (おまけ)文字色変更 白 → 緑
  • (おまけ)コントロールの変更 :control_default → :control_name*2
module PopText
  module Setup
    # ☆ メソッド名の変更
    def name_job
      # 基準サイズの設定
      @size = DEFAULT_FONT_SIZE

      # スプライト・ビットマップの作成
      create_graphic

      # フォントの設定
      font = bitmap.font
      font.size = @size
      font.bold = DEFAULT_FONT_BOLD
      font.color.set(0, 255, 0, 255) # ☆ 文字色変更

      # テキストの描画
      draw_text_defalut

      # 位置の設定
      sprite.ox = bitmap.width / 2
      sprite.oy = 32 + bitmap.height * 2 # ☆ 計算式変更
      sprite.z = 1000
      
      @control = :control_name # ☆ コントロールの変更
    end
  end
end

これで以下の注釈で設定すれば、冒頭の画像のようになります。

PopText["[アイテム屋]", :name_job]
PopText["アイ", :name]


更新処理の改造

更新処理の改造
プカプカと浮かぶような表示を作る

エストを受けることの出来るキャラクターなど、
より一層強調してテキスト表示を行いたい場合、
文字自体にアニメーションを追加する方法があります。

今回はプカプカと水の上に浮いてるかのような、
控え目に主張するアニメーションを追加する改造例を紹介します。

まずは下準備として、
PopText::Setupにfloating、PopText::Controlにcontrol_floatingを用意します。

module PopText
  module Setup
    def floating

    end
  end
  
  module Control
    def control_floating

    end
  end
end

処理の仕様を考えます。

  1. 基本的な文字の描画はdefaultと全く同じ
  2. 一定速度で、一定範囲内を行ったり来たりする

1.に関しては、defaultと全く同じであるなら
新たに用意したfloatingメソッド内で、そのままdefaultを呼び出すことが可能です。

2.に関しては、「一定速度」で「一定範囲内」を「行ったり来たり」を実現するために、
Setupでいくつかの変数を用意する必要がありそうです。
そこで、実際に用意する変数が以下の通りです↓

名称 説明
@offset 現在の移動量
@max @offsetの上限
@min @offsetの下限
@speed 1フレームに移動する量
@rise 上昇中/下降中の判定フラグ

Setupのメソッドは、メニューを開くなどしてシーンが遷移するたびに呼び出されますが、
メニューが開く度にこれらの経過がリセットされてしまうと、おかしなことになってしまいます。
そのため、これらの変数は一度設定したらリセットされないように、
値が存在しない場合にのみ設定するようにします。

Controlのメソッドは、
control_defaultがキャラクターの位置を基準にテキストの位置を設定してくれるメソッドなので、
これを元に、後から@offsetの分だけ座標を調整する仕組みにしようと思います。

以上を踏まえたコードが以下のものになります。

module PopText
  module Setup
    def floating
      default
      @control = :control_floating
      unless @offset
        @offset = 0
        @max = 2
        @min = -2
        @speed = 4 / 40.0
        @rise = false
      end
    end
  end
  
  module Control
    def control_floating
      control_default
      @rise = true  if @offset <= @min
      @rise = false if @offset >= @max
      if @rise
        @offset += @speed
      else
        @offset -= @speed
      end
      sprite.y -= @offset
    end
  end
end

floatingでdefaultを実行して基本的な文字の描画・位置設定を済ませたのち
各種変数のセットアップを行っています。

更新処理にはcontrol_floatingを使うので、
@control = :control_floating として上書きしています。

そして、実際の更新処理では、
現在の移動量@offsetの値が上限・下限に触れているかを判定し、
触れているならば、@riseを切り替えるという処理をした後、
@offsetに@speedを@riseによって加算または減算し、
最後にスプライトのY座標 sprite.y から@offsetを減算しています。

これらの改造を追加したのち、以下のように注釈を用いるなどすることで、
冒頭の画像のような表示が可能になります。

PopText["QUEST", :floating]


メソッド・変数の詳細

ポップテキストで内部的に使用しているメソッドや変数を解説します。
これらのメソッドと同名のメソッドや変数をSetup・Controlで使用してしまうと、
不具合の原因となるため注意してください。

インスタンス変数

@character

表示対象となるキャラクターが入っています。
もし、テキストをunpopの対象とされたくない場合は、
@characterをnilにすることで、削除の対象外となります。

@text

表示するテキストが入っています。
文字列への変換はされていないので、必要に応じてto_sを呼び出すなどしてください。

@width

ビットマップの幅が代入される変数です。
create_graphicの前に値を設定しておけば、生成されるビットマップの幅を指定することができます。

@height

ビットマップの高さが代入される変数です。
create_graphicの前に値を設定しておけば、生成されるビットマップの高さを指定することができます。

@size

フォントのサイズを代入しておく変数です。
@width, @heightを自動計算する場合に使用されます。

@setup

セットアップ用のメソッドの名前が代入される変数です。

@control

更新用のメソッドの名前を代入しておく変数です。

@remove

テキストの削除判定です。
removeメソッドが実行された際にtrueになります。
削除時は@removeをtrueにする以外にも様々な処理を介しているので、
この変数の値を自分で変更することは非推奨です。

@graphic_holder

sprite, bitmapを保管するためのGraphicHolderクラスを格納している変数です。
sprite, bitmapはそのままではセーブできないため、このようなクラスを用いて隔離しています。
この変数の値を自分で変更することは非推奨です。

メソッド

PopText.viewport

spriteに設定する用のviewportを返します。

sprite

テキストを表示するためのスプライトを返します。

bitmap

テキストを表示するためのビットマップを返します。

self.sprite=(sprite)

テキストを表示するためのスプライトを設定します。

self.bitmap=(bitmap)

テキストを表示するためのビットマップを設定します。

need_refresh?

セーブデータがロードされた際にrefreshを呼び出すためのフラグです。
通常、このメソッドを自分で使用する必要はありません。

create_graphic

スプライトとビットマップを生成し、それぞれspriteとbitmapに代入します。
spriteには自動的にPopText.viewportが設定され、
bitmapのサイズは、@width, @heightの指定がない場合、@sizeを元に自動計算されます。
これらの指定がきちんと行われないまま呼び出されるとクラッシュします。

default_width

@widthの自動計算用メソッドです。

default_height

@heightの自動計算用メソッドです。

draw_text_default

bitmapにdraw_textを実行します。
幅いっぱいに@textを中央寄せで描画します。
@textの改行には非対応です。対応する予定もないです。

refresh

@setup, @controlに登録されたメソッドを呼び出します。

update

@controlに登録されたメソッドを呼び出します。毎フレーム自動的に呼び出されます。
このメソッドを自ら呼び出すことは非推奨です。

dispose

bitmap, spriteを解放します。
このメソッドを自ら呼び出すことは非推奨です。

remove

表示中のテキストを削除します。Setup, Controlから自ら呼び出すことが可能です。

まとめ

→スクリプト一覧へ
→「ポップテキスト」スクリプト配布ページへ

この説明を読んで、もし不明な点などがあれば、コメントなどから是非ご質問ください。
また、改造する場合に関しては、ツクール本体のマニュアルや、
スクリプト自体を読み込むことも役に立つと思います。

さて、残りは余談。
このスクリプトはPopTextとかいう名前だけど、改造次第ではテキスト以外にも、
画像とか色々表示できたりしちゃう優れものー・・・いや優れては無いか。

しかし、こんな改造前提みたいな面構えのスクリプト
良かったんだろうかという話はあったりする。
改造とか普通の人はしないし不具合の原因になるだけじゃないかじょのいこって。

更にどうでもいいですが、こういうドキュメントを作るのはゲロ大変ですね…。
もうやりたくねー(ォィ

*1:メニューからマップに戻った際など

*2:表示が常時表示から近づくと表示になる