ティラノスクリプトで文字列の内容を調べる
ティラノで文字列の内容を調べる方法です。
星取表を作っていました。
相撲で勝敗を記録するあれです。文字列変数に勝負の終了ごとに○や●を加えていって、
f.hoshi=f.hoshi+'○'
f.hoshi=f.hoshi+'●'
という感じで試合を繰り返すと、f.hoshiの内容が'○●●○○○'となっていきます。
文字列変数ですから、星取表を表示するにはそのまま変数の内容を表示すればいいのですが、じゃあ何番目の取り組みが○なのか●なのか、みたいに、勝敗の内容を取り出すときには工夫がいります。
変数を別に用意する方法
試合ごとに数字の変数を用意して、勝ったら1、負けたら0、を変数に代入していく方法もあります。(for文でいじりやすいように配列変数を使う)
f.shiai[1]=1
;1試合目勝
f.shiai[2]=0
;2試合目負け
f.shiai[3]=0
;3試合目負け
これだと何試合目が勝ったか負けたかダイレクトに調べることができるのでわかりやすいですが、変数が増えてしまうのが面倒かもしれません。
文字列変数の内容を調べる方法
こちらが本題です。f.hoshiに入っている'○●●○○○'という文字列を直接調べます。
tyrano.wiki.fc2.comwikiから引用させていただきました。
[eval exp="f.itemname='うすよごれたコップ'"]
[if exp="f.itemname.indexOf('コップ')!=-1"]
コップなら持ってる。
[endif]
このように、調べたい変数の後ろに .indexOf('調べたい文字列')をつけると、
調べたい変数の「何文字目」に「調べたい文字列」があるかわかるのです。
上記に引用したサンプルでは、-1文字目以外に 'コップ' があれば、「コップなら持ってる。」のメッセージ表示となります。( !=-1で評価しているので、-1以外なら、となります)
つまり、うすよごれたコップでも、きれいなコップでも、「コップ」という文字列の含まれるアイテムを所有していれば「コップなら持ってる。」になります。
[eval exp="f.itemname='うすよごれたコップ'"]
[if exp="f.itemname.indexOf('コップ')==6"]
6文字目に「コップ」がある。(文字列の先頭は0なので0から数えて6文字目)
[endif]
ちょっと改造しました。調べたい変数のN文字目に「調べたい文字列」があるかどうか。の判定です。==6のところを7とか5にすると、何も起きません。6のときだけ、「6文字目に「コップ」がある。(文字列の先頭は0なので0から数えて6文字目)」という表示になります。
[eval exp="f.itemname='うすよごれたコップ'"]
[eval exp="f.n=f.itemname.indexOf('コップ')"]
文字列の先頭から[l]
[emb exp="f.n"][l]
文字目にコップがある。(文字列の先頭は0なので0から数えて)
また別な改造です。調べたい変数の「何文字目」に「調べたい文字列」があるか、を調べます。結果は、「文字列の先頭から6文字目にコップがある。(文字列の先頭は0なので0から数えて)」となります。
f.itemname='うすよごれたコップ'を、f.itemname='すごくうすよごれたコップ'にすると、「文字列の先頭から9文字目にコップがある。(文字列の先頭は0なので0から数えて)」となるかと思います。
以上の方法を使うと、「f.hoshiに入っている'○●●○○○'という文字列」の何番目が○で何番目が●なのか、を調べることができます。
こういった文字列に対する操作は、吉里吉里のサイトも参考にさせていただきました。
buttonをfix=trueで使いたかったら[call]ではなく[jump]を使う
buttonはfix=trueにすることで常駐ボタンとしていつも表示させておくことができます。
シナリオは分岐などで*ラベルを行ったり来たりする構造になると思いますが、メインのシナリオ(*main)からサブのシナリオ(*sub)に行ったとき、そこで「新たに」常駐ボタンを表示させるには注意点があります。
サブのシナリオ(*sub)に移動するときには、[call]ではなく[jump]でやらなくてはいけません。
[call]でサブのシナリオ(*sub)に飛んで、そこで新たに常駐ボタンの定義[button fix=true]をすると、ボタンが働かなくなります。
これは[button]の仕様で「コール先からリターンするまで全てのボタンは有効にならない」というのが影響してると思われます。
[button]
注意→fixにtrueを指定した場合はコールスタックに残ります。コール先からリターンするまで全てのボタンは有効にならないのでご注意ください
つまり、サブのシナリオ(*sub)を呼び出した時[call]のコールスタックが残っているので、[return]するまではボタンが働かないということですね。
単なるcallだけならcall先でまたcallみたいな、コールスタックを多重にすることも大丈夫ですが、buttonの場合はコールスタックを多重に働かせることはできないように思われます。
おかしな感じもしますが、自分のスクリプトではこうなってしまいますので自分用の注意です。
まとめ
*mainで[button fix=true]を定義して、[call]で*subに飛んでも、ボタンは正常に働きます。
*mainで[button fix=true]を定義して、[call]で*subに飛んで、*subで新たに[button fix=true]を定義すると働かなくなります。
これを回避するには、
*mainで[button fix=true]を定義して、[jump]で*subに飛んで、*subで新たに[button fix=true]を定義する、という手順になります。
ティラノスクリプトはビルドすると速くなる
「ティラノスクリプト 重い」
で検索するとこの記事けっこう上に出てきたので、追記です。
ティラノはビルドすると速くなると思って書いた記事なのですが、訂正です。やっぱり重い。
ビルドで速くなるのは微々たるものです。
ティラノはパッケージングすると起動時に素材の解凍作業を一括で行うため、それがすごい重い感じがします。
ゲーム容量が大きくなればなるほど、解凍にも時間がかかります。
動画やら音楽やらをたくさん入れたゲームには向かなそうだと思いました。
以上は筆者の個人的な体感なので、要検証と言うことでよろしくお願いします。
--------------------------------------
以下は古い記事。
ティラノスクリプトで宮本県の移植&続きの制作をしていました。
システムもc94版から変えて、試行錯誤しながらいい感じに仕上がってきました。
しかし、いったん落ち着いてよく見ると、どうにももっさりしてる感じがしました。
自分のスクリプトの組み方が悪いのかもしれませんが、常駐ボタンをたくさん置いたUIにして、選択肢やらemoアイコンやらいっぱい表示させてたら、ボタンを押したときにさくっと動いてくれないときがあります。
fixレイヤーに10個のボタンと、前景レイヤに最大で16個の画像やアイコン([chara]関連のタグを使用) 選択肢を押すと選択肢が消去され、16個のパラメータ関連画像が一気に全部書き換わります。さすがにこれだけあると重い・・?(実はボタンも、一つのボタンにレイヤを3枚使ってます)
そこで思い出したのが、airnovelは、制作環境よりもビルドした方が速くなると言うこと。ティラノも同じかな?と思って試してみました。
ティラノビルダーによる制作環境から、windows用アプリへのパッケージングです。
結果。みごとに速くなりました。万歳。^o^
ちなみにパッケージングするときに気づいたのですが、
TyranoRider_win_v201で、tyranoscript_v472dで制作したゲームはパッケージングすることができませんでした。(うちの環境では)
ぐぐってみると、ライダーとスクリプトは最新の物にしないとパッケージングできないことがあるとのこと。
TyranoRider_win_v211がリリースされていたので、そちらを使うと一発でパッケージングすることができました。
また、本体の方もtyranoscript_v472eが出ていました。
このブログは、ここまでtyranoscript_v472dを使用して書いています。
うちの環境で発見した不安定な部分も書いてきたのですが、tyranoscript_v472eでは改善されているかもしれないですね。
tyranoscript.blogspot.comアップデートはティラノフォルダを上書きとのことです。
コンフィグの画面をいじったりして(コンフィグにフルスクリーンのボタンをつけるとか)ティラノフォルダ内のファイルを変更してる場合は、単純に上書きでは初期状態に戻ってしまうので注意ですね。
ゲームリリース後のアプデ手順
tyrano.jp簡単そうで助かります。