スクリプト/コツ/自由な位置における画像や文字列の使い方

最終投稿者:Nyan mini rurun9 更新:2011/08/20 17:49:07

文字列を自由な位置に表示


文章を画面に表示する場合に、speak() を使うとメッセージウインドウが出てその中に文章が出せます。
メッセージウインドウの位置や大きさを変える事ももちろん可能ですが、
コレとは別に、メッセージウインドウを使わずに、文字列を自由な位置に配置する事ができます。
setVariable( "テキスト1", createText(512-160, 10, 160, 22) )
setText( getVariable("テキスト1"), "夢見る少女じゃいられない" )
speak( "こちらはメッセージウインドウ" )
deleteText( getVariable("テキスト1") )

これで画面に"夢見る少女じゃいられない"という文字列が現れ、
メッセージウィンドウに"こちらはメッセージウインドウ"と
表示されます。

このプログラムの動作を解説していきたいと思います。

#一行目
setVariable( "テキスト1", createText(512-160, 10, 160, 22) )

まず「テキストを表示する場所」を作り、その番号を"テキスト1"という基本変数に入れています。
画面の左上が原点(0,0)で、RPGの場合画面の大きさは 横512×縦384 (1マスは32×32)です。
ノベルゲームの画面は少し広くて 横800×縦600 です。
座標の縦方向は下にいくと数値が大きくなる点には注意して下さい。

今回の例では「テキスト1」と名付けた場所を、
x座標(512-160)、 y座標10、の位置から
幅160、高さ22 の範囲に設定しています。
この段階では名前と範囲を決めただけなので何も見えません。

直接x座標を 352 ではなく敢えて 512-160 と計算式を書いているのは、
RPGの画面が横幅512なので、おおよその位置を数値を見て想像できるかもしれないから、です。
数値は計算式でも変数であっても大丈夫、という事ですね。

createText関数の返り値は「テキストを表示する場所」を表わす番号です。
createTextが実行された順に自動で1,2,3,…と割り振られます。
この時点では初めてなので、変数"テキスト1"の中身は1の筈です。
では何故わざわざ変数に表示場所番号を入れたのか、というと、
あとで表示する内容を変えたり、必要なくなったら削除する、といった操作を指定して行うのを簡単にしている為です。
自動で付けられた番号が一体何番なのか、を毎回確認する必要がなくなるので、createTextの番号は変数に入れる事をお勧めします。
#二行目
setText( getVariable("テキスト1"), "夢見る少女じゃいられない" )

setText関数は「テキストを表示する場所」番号を指定して、文字列を表示します。
「テキストを表示する場所」番号は基本変数"テキスト1"に保存してありますので
getVariable関数で取得しています。

#三行目
speak( "こちらはメッセージウインドウ" )

speakでメッセージウインドウに文章を表示すると、ボタンが押されるまで画面が止まります。
これを利用してスクリプトの実行を止めることで、テキスト表示が画面からすぐに消えないようにしています。
(敢えてspeakで止めるのは、激しく画面を更新するような処理が直後につづく場合の対策です)

#四行目
deleteText(getVariable("テキスト1"))

これは「テキストを表示する場所」を削除しています。
(場所がなくなっても書いた字は残っています。逆に言えば、RPGではイベント終了時にテキストを消し忘れると画面がごちゃごちゃになります)
場所番号は変数"テキスト1"に入れてあるので、呼んでいます。
仮に複数のテキストが画面に表示されていても、指定した番号のみを削除できます。
画面上の全ての「テキストを表示する場所」をまとめて消すdeleteTextAll()もあります。

「テキストを表示する場所」はそのままで、書かれた文字だけを書き換える、もしくは消したい場合には
#書いてある文字だけを消す
setText( getVariable("テキスト1"), " " ) #半角スペースなので見えない
speak("さっきの消したよ")

#違う文字列を書き直す
setText( getVariable("テキスト1"), "祇園精舎の鐘の声" )
speak("諸行無常の響きあり")

とすると文字列だけを入れ替える事ができます。
表示するのは文字列なので、改行は \n 、カンマで区切っていくつか並べる事ができる、などのルールはspeakと変わりません。

またこの配置テキストの文字の色と大きさは、
createTextで場所をつくる直前に指定されていた色になります。
一度場所がつくられた後に変更しても反映されません。なので必ず
setTextFontColor(r,g,b)
a=createText(~)

というような順序で使いましょー。
また、テキストを表示する場所が、表示する文字列よりも狭い場合は何も見えない事があります。
文字の色、大きさ、改行高さの他、場所の広さにも気をつけましょー。


画像を自由な位置に表示

サウンドノベル用の立ち絵を表示する方法として
showLeftImage( )
showCenterImage( )
showRightImage( )
がありますが、コレは位置が三択な上に、あくまでも人物の立ち絵用な為に、画像の下端が画面下にくっつくように表示されます。
なので画像を出す場合は、自由な位置に貼り付ける事がほとんどになると思います。

テキストの表示と似た手順なのですが、画像の方は「どんな内容を」の部分に画像ID番号を指定するだけなので、結果1行で済むから簡単です。
ただし、マップシーンのリソースエディタで、あらかじめ使用する画像を登録しておく必要があります。
画像を自由な位置に表示するにはたとえば以下のように書きます。
setVariable("画像1", showImagePosition( (512-160)/2, 64, 74) )
speak("画像を表示したよ。")
hideImagePosition(getVariable("画像1"))

これで画面に画像が表示され、
メッセージウィンドウに"画像を表示したよ。"と
表示されます。

このプログラムの動作も解説していきたいと思います。
#一行目
setVariable("画像1", showImagePosition( (512-160)/2, 64, 74) )

showImagePositionをスクリプトに書くと
x座標(512-160)/2、y座標64、の位置に画像の左上を合わせて表示されます。
最後の 74 は画像ID番号です。

そして、showImagePositionの返り値には「画像を表示する場所」の番号が自動で割り振られます。
あとで指定して削除などを行うためにsetVariable関数で変数"画像1"に保存しています。
尚、テキスト表示場所番号と画像表示場所番号は異なり、それぞれ1から順に自動でつけられるものですので、やはり変数に格納することをお勧めします。
#三行目
hideImagePosition(getVariable("画像1"))

「画像を表示する場所」を削除しています。
テキストとは異なり、表示した画像を消したい場合は、場所ごと削除します。

同じ場所に何枚も貼り付けると、後から表示した方が上に重なって増えていくだけです。
(たとえ大きさの関係で見えなくなっても、なくなったワケではありません)

背景の全画面画像だけ残したまま、まとめて全部消せるhideImageAllWithoutBG()もあります。


変数について

ここでは、基本変数を使いました。
以下のようにローカル変数を使うことでも実現可能ですが、
id = showImagePosition( (512-160)/2, 64, 74 )

ローカル変数はゲームを保存したときに変数の内容が保存されません。
ゲームを保存したときに保存される基本変数を使うことを推奨します。

つまりロードしてゲーム途中からだと、ローカル変数で画像とかを表示していた場合は、テキストや画像が表示されていないままゲームが進行する可能性があるかもね、という話です。

変数に限った話ではありませんが、RPGだとイベントスクリプト終了時に表示した画像なんかは勝手に消えますが、置いたテキストやキャンバス上のスプライトはそのままだったりするのでご注意ください。

詳しくは
スクリプト/変数
仕様/プレーデータのセーブロード
を参照してください。


画面の重なり方について

画面手前側から奥に向かって次のような優先順位があります。

メッセージウインドウ
テキストエリア
イメージ画像
スプライトのキャンバス
背景の全画面画像
(RPGのゲーム画面)

コメントする

コメントするには、ログインする必要があります。

コメント一覧

User icon mini 退会したユーザー(投稿日:2011/08/18 02:50, 履歴)
warp関数使うとテキストが勝手に消えましたw
Zararu128x128 mini dycoon(投稿日:2010/01/22 21:12, 履歴)
ご指摘ありがとうございます。
ここの記述における座標系は左上が原点です。

> ついでに、画像の縮小拡大、センタリングがあると
> 素材を加工してアップロードしなくて楽になります。

これについては検討させていただきます。

よろしくお願いします。
User icon mini wanderingdj(投稿日:2010/01/22 04:18, 履歴)
xとyの基準は画面左下なのか、左上なのか。
案外基本的な事だと思うのですが、記述が抜けてませんか?

┌─────┐
│     │
│このへん │
└─────┘
画像をあつかうソフトだと左下が基準の場合が多いのですが
明記して欲しいです。

ついでに、画像の縮小拡大、センタリングがあると
素材を加工してアップロードしなくて楽になります。
検討をお願いします。