→スクリプト一覧へ
→「ポップテキスト」スクリプト配布ページへ
【RGSS3】ポップテキスト
マップ上のキャラクターに対して、指定した文字列を様々な方式で表示します。
表示方法
基本的にはスクリプトを実行して表示します。
「CraftLib」スクリプトを導入していれば、
マップ読み込み時にイベントページの一番上に配置した注釈を読み取り、
イベントを実行せずに表示することもできます。
また、表示方式は、比較的簡単に改造や追加が可能な構造になっています。
ポップテキストの使用方法・改造方法は別ページで詳しく解説しています。
更新履歴 | バージョン | 内容 |
---|---|---|
2023/11/23 | v2.0.1 | マップ移動時にテキストが解放されない不具合の修正 |
2023/11/22 | v2.0.0 | テキスト表示中にセーブロードした際に、 表示中のテキストがセーブデータに保持されない不具合の修正 (これにより表示方式のsprite, bitmap周りの管理が変わり、 従来の表示方式との互換性は失われます) |
2023/10/07 | v1.0.1 | 「:eject」方式で表示中、メニュー画面等を開いてから マップに戻るとクラッシュしてしまう不具合の修正 |
2023/09/18 | v1.0.0 | 初版 |
Rubyの正規表現の備忘録
何かと便利だけど何かと忘れがちな「正規表現 / Regexp」のお話。
書き方も色々あるが、自分が使う書き方だけ書いてく。
基本の使い方
正規表現を使う目的は、
「文字列の中から指定したパターンに一致する部分を抽出する」
ことが大体だと思う。ちょっとややこしい文字列内の検索みたいなもん。
まず、単純に正規表現オブジェクトを作るには、見つけたい文字列を // で囲む。
regexp = /Str/
そしてこれを "String"[regexp] という形式で使う。
"I am String"[/Str/] #=> "Str"
任意文字にマッチ
とにかくなんにでもマッチしてほしければ /.*/ と書く。
しかしそのまま使っても意味は無いので、一定の区間にある
全ての文字にマッチしてくれ的な時にあわせて使う感じ。
"abcdefghijk"[/a.*g/] #=> abcdefg .* が b..f にマッチしている
キャプチャ
"[255, 128, 64]"
「 [ ] の中の数字を抽出するとかどうするの? 」
「え、1項目ずつ取ったりするの?」となりそうだが、そんな必要はない。
string = "[255, 128, 64]" if string[/\[(.*),(.*),(.*)\]/] r = $1.to_i #=> 255 g = $2.to_i #=> 128 b = $3.to_i #=> 64 end
抽出したい部分を ( ) で囲う。
マッチするとグローバル変数 $1, $2, $3, ...に、
( )の中の文字列がマッチした順番通りに入っているというわけ。
ちなみに"[ ]"にマッチさせたい場合は
それぞれ \[ \] とエスケープを掛けなければならない。
更に、もっと厳密にマッチさせたいなら以下のように書いたりできる。
string = "[ 255 , 128 , 64 ]" if string[/\[\s*(\d*)\s*,\s*(\d*)\s*,\s*(\d*)\s*\]/] puts $1 #=> 255 puts $2 #=> 128 puts $3 #=> 64 end
空白が余計に入ってても取れるし、数字以外が入ってたら弾いてくれる。
ただ非常にごちゃごちゃして何がしたい正規表現かは見にくい。
要素が2個だったり3個だったり4個だったりと可変長なら、
[ ]内 をまとめて取って、.splitで句切ってあげるのが無難かも。
string = "[255, 128, 64, 32]" if string[/\[(.*)\]/] $1.split(",").each { |val| p val.to_i } #=> 255 128 64 32 end
文字列の置き換え
正規表現でマッチした文字列をそのまま置き換えることもできる。
一回置き換えるだけならこんな感じ。
text = "12345" text[/[12345]/] = "n" puts text #=> n2345
全部置き換えたい場合は .gsub というメソッドを使えば大体いいと思う。
string = "12345" string.gsub!(/([135])/) { $1.to_i + 1 } puts string #=> 22446
普通に表示できない文字を分ける
レアケース。キーボードの入力をWin32APIで取って、
それを文字に変換してテキスト入力ができるよ的なことをしようとした時のお話。
一部のキーは入力に対して\e(エスケープ)とか\b(バックスペース)とか、
文字列に追加しても普通に表示できない文字を送ってくる。
こういうのをうまくフィルターすることが出来ないかととりあえず行き着いたのがコレ。
/\p{Other}/
見慣れない書き方だと思う。「Unicode プロパティによる文字クラス指定」らしい。
Otherというクラスを指定することで、普通に表示できない感じの文字を取得できた。
\P{Other}とpを大文字で書けば反転する。つまり普通に表示できる文字が取れる。
擬似的に半角文字、全角文字を分ける
文字の幅を単純計算したいなーと思い、半角全角で分ければいいという時に困ってしまった。
意外と半角・全角を正確に分ける手筈がないのだ。
それもそのはず、Unicodeの文字、特に東アジアの文字?は
「全角半角のすみ分けが曖昧」な文字があり、そもそもすっぱりと分けることはできない模様。
どうしようと行き着いた先に辿り着いた正規表現がこれだった。
/[。-゚[:ascii:]]/
まーた見慣れない正規表現を持ち出してきたよこの人は…(私だ)
この変顔みたいな正規表現で
- ASCII文字(半角英数字)
- 半角カナ文字
- 半角記号(日本語)
これを振り分けてくれるようだ。
ちなみに、この。と゚は半角だからね!句点と半濁点の半角だからね!
あと本当にどうでもいいけど、半角半濁点の方はキャレットを合わせたり
deleteで消したりした時の挙動がおかしい。謎。
[:ascii:]はPOSIX文字クラスという何某らしい。文字クラスの中でのみ使用可能。
ちなみにこの記事が大変参考になりました。ありがとうございます。
【RGSS3】メッセージ制御文字追加
メッセージ表示で新たな制御文字が使えるようになるスクリプトです。
上記のメッセージは、以下のテキストを元に生成されています。
\FB\CRGB[255,0,0]テストテキスト!\CR\FB ダイスの目は「\FI\#{rand(6)+1}\FI」です。 \CRGB[255,255,255,96]\ORGB[255,255,0,96]だからどうしたってほどでもないけど\CR
追加制御文字
制御文字 | 説明 |
---|---|
\CRGB[R,G,B,A] | 文字の色をRGBとアルファ値で指定し変更します。 アルファ値は省略可能。 例: \CRGB[255,0,0] |
\ORGB[R,G,B,A] | 文字の縁取りの色をRGBとアルファ値で指定し変更します。 アルファ値は省略可能。 例: \ORGB[255,0,0,128] |
\CR | 文字の色、文字の縁取りの色をデフォルトへリセットします。 |
\FB | 文字の太字状態を切り替えます。 例: \FB強調\FB |
\FI | 文字の斜体状態を切り替えます。 例: \FI傾く文字\FI |
\#{ "script_code" } | { } 内の文字をスクリプトとして実行し、 実行結果をテキストとして表示します。 例: \#{rand(6)+1} 1~6のランダムな数字 |
更新履歴 | 内容 |
---|---|
2023/08/27 | 初版 |
【RGSS3】アニメーション改
アニメーションの表示機能を大幅に軽量化します。
また、独自の様々な表示機能を追加します。
追加される機能
- アニメーション表示速度の変更
- アニメーションの表示無効化
- アニメーションの描画のみ無効化
- アニメーションの多重再生
- アニメーションをキャラクターの現在位置に固定して表示
- アニメーションを戦闘中のキャラクターに追随させて表示
- アニメーションの任意位置再生
RGSS3のデフォルトでは、アニメーションの多重再生が出来ず、
またマップ上でアニメーションを再生すると、
再生対象のキャラクターにアニメーションがくっついてきて
一部の演出においては不自然です。
それをなんやかんやして多重表示や固定表示できるようにしました。
これで二刀流キャラで長~~いアニメーションを表示しようとして
一つ目のアニメーションがぶった切られることもありません。
弾を走って避けるとかそういう演出も簡単にできます。
画面上の好きな位置にアニメーションを表示することも可能。
これらの機能は基本、スクリプトを用いて呼び出すことになります。
詳しくはスクリプト内に記載してあるのでそちらを読んでください。
注意点
既存のアニメーション表示機能とは互換性がありません。(全く別物に作り替えちゃった)
そのため他のアニメーション改変スクリプトとは競合が発生すること確定です。
(申し訳ないで~~す;;)
更新履歴 | 内容 |
---|---|
2023/11/16 | スクロール処理の微修正 |
2023/11/15 | ・1アニメーション内で同じレイヤー番号の アニメーションの表示、非表示が切り替わる場合、 次に表示された際そのレイヤーのアニメーションが 表示されなくなる不具合の修正 ・透明度、拡大率をアニメーションごとに 倍率で変更するオプションの追加 ・表示優先度(Z座標)をアニメーションごとに 定数で変更するオプションの追加 ・スクロール時にアニメーションがずれにくくした (暫定。まだずれる場合あり) |
2023/09/03 | アニメーション0番(アニメーション無し)を 追加機能から再生しようとした際クラッシュする不具合の修正 |
2023/08/25 | 初版 |