フワフワソが「ソラとピヨちゃん」や「宮本県」を作るブログ(フワフワソ・ラウンジnew!)

ラノベとテクノを愛するふわふわがノベルゲームを作っています。あと日常のことやイベントの告知なども。スクリプト関連の記事は自分用の備忘録です

(ティラノスクリプト)タグの要素でtimeとwait入れるときの注意と、時間制限付き選択肢の作り方、[glink]が不安定になるトラブル

timeとwait入れるときの注意

ティラノでは画像や文字表示関連のタグで、表示にかける時間が入れられるようになってます。time=500 とかにしておくと、画像がふんわり表示されていい感じです。

しかしここで、同時にwait=false にしておかないと、他の表示関連のwaitとぶつかったときにバグります。

たとえば常駐ボタンをおいて、その表示関連でwait=trueにしたままだと、

ボタンを連打したときなど、[time=500 wait=true]の処理が終わらないうちにまたあらたな[time=500 wait=true]が発生するのでおかしなことになります。

ボタン関連は必ずwait=false

連打に備えて、timeもなるべく0に近くしたほうがいいと感じました。

 
時間制限付き選択肢の作り方

wikiを拝見したところ、[glink]のあとに[s]の代わりに[wait=10000] などを入れればいいと分かりました。

そこで、カウントダウンの表示ができるように作ってみました。

[glink]のあとに、[jump target=*timer]を置きます。

メッセージレイヤ1で、"f.timer = 15"の秒数をカウントダウンします。

*timer
[eval exp="f.timer = 15"]

[position layer="message1" opacity=0]
[layopt layer=message1 visible="true"]
*timer2
[ptext layer=message1 text=&f.timer x=100 y=400 size=40 name="timer" time=0]
[anim name="timer" opacity=0 time=0]

[anim name="timer" opacity=255 top=400 time=1000]
[eval exp="f.timer = f.timer - 1"]
[wait time=1000]
[freeimage layer=message1]
[if eval exp="f.timer > 0"]
[jump target=*timer2]
[endif]
[jump target=*jikangire]

 

*jikangire

;タイマー消す
[freeimage layer=message1]

;タイマーのスタック消す

[wait_cancel]

時間切れ

[anim]タグはwaitを入れる必要がない(アニメの完了を待たない命令)ので、入っていません。

以下の部分は[glink]をクリックして飛んだ先でも必要です

;タイマー消す
[freeimage layer=message1]

;タイマーのスタック消す

[wait_cancel]

タイマーのスタック消す[wait_cancel]というタグがあったので、一応入れました。必要なのかどうかはよく分からないのですが。タグリファレンス読むとタイマーの途中でジャンプしたら入れた方がいいような気がしました

 

 この記事をなぜ書いたかというと、時間制限の表示を作っていたときに、waitのある常駐ボタン表示とぶつかってめちゃくちゃになったためです。

こうして原因が分かってしまえば簡単なのですが・・・><

ーーと、ここまで書いてから新たな問題が発生しました。[glink]が妙に不安定になってしまいました。

 

 [glink]が不安定になるトラブル

上記のスクリプトで、

1)[glink]で時間制限付き選択肢を表示させる

2)選択肢クリックでジャンプした先で、ちょっとしたメッセージを表示させて、1)のラベルに戻る

というテストをやっていました。

とろこが、[glink]の選択肢をクリックした後の動きが妙に不安定になりました。

[glink]を連打してると、2)のメッセージ表示の途中でフリーズしてしまう事態が発生。

毎回ではないのですが20回に1回くらい起きます。

発生条件を調べたのですが。選択肢外の場所を何回かクリックした後に、選択肢と選択肢外の境目の微妙なところをクリックするとフリーズするような感じがしました。

どうもはっきりとは分かりません。スクリプトの書き方が悪いのかもしれないですが、[glink]の代わりに[button]でやると問題なく動きます。

自分では解決できないので、[glink]を使うのはやめて[button]にすることにしました・・・。

 

 

 

 

 

 

 

 

 

ティラノスクリプトの[glink]レイヤーの注意

miyamotoken.tumblr.com

宮本県の移植をやっていました。

宮本県は、画面上部に常にキャラの顔アイコンを表示しておいて、クリックしたらいつでもtipsが読める、という仕様になっています。

ここはティラノでは、[button]で実装しました。fix=true にしておくことで、テキストウインドウの文章を読みながら、いつでもtipを読むことができます。(=fixレイヤー)

ちなみにティラノ公式のサンプルでは、tipsを表示させる方法は、[button]を押すと「tipsの画像」が「新しい[button]」として表示される方法でした。

これだとtipsを画像で作っておかなくてはいけなくて、文章のささいな変更が面倒なので、自分は[image]で無地の背景を表示、[ptext]でtipsの文章、という方法にしました。

 

注意点ですが、[glink]で選択肢を表示しているときにこれをやると、tips画像とテキストが選択肢の後ろに回ってしまいます。

[glink]のレイヤーが最前面に固定されているためです。(=フリーレイヤー)

解決法はいまのところ見つけられません・・。

[glink]のときはゲーム自体が停止するので、選択肢の前面に画像などを表示する想定になっていないのかもしれません。

tyrano.jp

ちなみにテキストウインドウの前にキャラや画像等を表示させるには、キャラや画像をmessageレイヤに配置すればいいとwikiで拝見しました。

この方法も試したのですが、[glink]で使うフリーレイヤーは、messageレイヤーよりもさらに前にあるみたいでダメでした><

とりあえずの解決として、選択肢の位置にはtipsをかぶせて表示しないようにすることで対応しました。

 

 

 

 

 

 

 

 

 

 

ティラノスクリプトのname属性に変数を使うときの注意

前回の記事で、タグの中のいろんな属性を変数にしておくとfor文で繰り返し処理出来て便利、と書きました。

しかし、[image] 、[glink]、 [button] などの時に使う name= の属性を書く時には、注意が必要です。

name=は文字列を入れるところなので、変数を使うときには文字列変数を入れないとダメです。

つまり、for文で使った数字変数を、そのままname=に入れるとエラーになります。

ここは数字を文字列に変換してから入れたいところですが、その命令がよくわからなくて困っていました。

解決法ですが、文字列に数字をくっつけると、数字の部分も文字列扱いになるようです。

;まずは配列の定義

@eval exp="f.test0=[ ]"
@eval exp="f.test=[ ]"

; =[ と ] の間は本当はスペースない。ブログの表記上こうしないと消えてしまうのでスペース開けてる

[eval exp="f.test0[0] = 13"]
[eval exp="f.i = 15"]
[eval exp="f.test[f.i] = 'nametest'+f.test0[0]"]
[image layer=9 name=&f.test[f.i] folder="image" storage=gazou.png x=360 y=110]
[image layer=9 name=&f.test[15] folder="image" storage=gazou.png x=460 y=110]
[image layer=9 name=nametest13 folder="image" storage=gazou.png x=560 y=110]


実行するとimageフォルダにあるgazou.pngが3つ出ます。

name= の部分に以下のどの書き方をしても成り立つ、という例です

nametest13

&f.test[15]

&f.test[f.i]

 

 これで何ができるかというと、画像やボタンをfor文を使ってちょっとずつ名前を変えながら何十個も一気に定義しておいて、そのあと、特定の一個を[anim]タグで操作する、ということが楽になります。