ティラノスクリプトの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]タグで操作する、ということが楽になります。
ティラノスクリプトを触る(ラベルに変数を使う、for文で繰り返し処理、配列など)
宮本県の移植でティラノスクリプトの仕様を調べていました。
nscripterに比べて簡単にできるところもあれば面倒になったところもありました。
●簡単になったところ
とにかくすべてが高機能。普通のノベルゲームを作るなら簡単だし演出も多彩
画面サイズもいろんなモニタに自在に合わせてくれる印象
html5とjavascriptをベースにして、吉里吉里のkagを実装してるらしい
スタックが破棄できる(nscripterはできなかった)のでサブルーチンからreturnせずに別なところへ行ける
●面倒になったところ
基本的にはkagライクなティラノスクリプトで組むのですが、ちょっと改造しようとするとティラノスクリプト以外の知識も必要になります
・サンプルのメニュー画面をカスタマイズするにはhtmlの知識がいる
(フルスクリーンとウインドウの切り替えがなくて、メニューに付けようとしたら意外とめんどくさかった)
・ボタンにホバーで複数の画像をつけるなどするには、javascriptの知識がいる
(素のティラノスクリプトだと、ホバーの座標変えたり複数画像出したりできない)
・for文がない
こんな面倒さを感じましたが、いずれもやり方を公開してくださってる方がいましたので、なんとかなりそうです。とても助かります、ありがとうございます。
【ティラノスクリプト】マウスカーソルが載ったときに何かする - memo
https://rimane-novels.net/tyrano-menu-screen_full-981/
ーー以下個人的備忘録のようなものです。
●仕様を調べてみた例など
・ラベルには変数が使える
&(エンティティ)を使う
[eval exp="f.label = '*jumpsaki'"]
[call target=&f.label]成功の表示の後に表示される文。[p]
*jumpsaki
成功[p]
[return]
・ラベルは変数や文字列を合体させて作ることができる
f.label という変数にjumpsakiという文字列を代入
それを*という文字列と合体させて、さらに_1という文字列も合体させて、f.label2に代入
f.label2に&(エンティティ)を付けると、それが*jumpsaki_1 として使えます
[eval exp="f.label = 'jumpsaki' "]
[eval exp="f.label2 = '*'+ f.label+'_1' "]
[call target=&f.label2]成功の表示の後に表示される文。[p]
*jumpsaki_1
成功[p]
[return]
こうやってラベル名を操作できると、同じ処理をさせるサブルーチンが作りやすくなります。処理は同じだけどジャンプ先だけ違う、みたいなことが可能になります。
(nscripterではたぶんできなかった)
・for文プラグインはとても便利
たとえば、前景レイヤー1~9まで表示する処理は次のようになります
[for name=f.i from=1 to=9]
[layopt layer=&f.i visible="true"]
[nextfor]
これくらいなら以下のように繰り返しコピペしていって9個並べてもいいのですが、
[layopt layer=1 visible="true"]
[layopt layer=2 visible="true"]
[layopt layer=3 visible="true"]
[layopt layer=4 visible="true"]
こういうことを沢山やっていると、コピペして数字を直してる途中で間違えたりしてしまいます。特に長いゲームを作ってると疲れたり、忘れたり、どうしてもミスが発生するので、なるべくコピペはしない方向でやっていきたいと考えています。
★ちなみに上記の例で、ホントは前景レイヤー0番からfor文でやりたかったのですが、
レイヤー0はなぜか変数だとエラーになります。仕方がないのでこれだけは直接書きます。
[layopt layer=0 visible="true"]
・for文と配列を組み合わせるとさらに便利
配列には宣言が必要なので、まず最初にfirst.ksなどでこれをやる
[eval exp="f.chara=[]"]
たとえばキャラが5人いてそれぞれに好感度などがある場合
普通にやると、キャラ1~5の好感度を変数 f.chara1~f.chara5などと定義するわけですが、ここに配列を使って
キャラ1~5の好感度を変数 f.chara[1]~f.chara[5]と定義
すると、for文で一気に5人分の好感度を0にしたりできる
[for name=f.i from=1 to=5]
[eval exp="f.chara[f.i] = 0"]
[nextfor]
同様に、好感度が10以上になったらジャンプ、みたいな判定をするときも、判定のためのサブルーチンを5人分まとめてやることができます
[for name=f.i from=1 to=5]
[if exp="f.chara[f.i] >= 10"][jump target=*jumpsaki][endif]
[nextfor]
・&(エンティティ)がいるときといらないとき
変数の中身を他のタグで参照するときには&を付けるわけですが、いるときといらないときがあります。
・配列の要素(添え字)には&いらない
f.chara[f.i] 正解
f.chara[&f.i] まちがい
・変数の中身を評価したりするタグには&いらない(もとから変数を使うようにできているタグ)
[eval exp="tf.flag1 = f.flag2"] 正解
[eval exp="tf.flag1 = &f.flag2"] まちがい
・何らかの命令のタグで、通常、変数を使わないところに変数を使うときには&がいる
[call target=&f.label2] 正解
[call target=f.label2] まちがい
ティラノとは全然関係ないのですが、制作にはこのマウスを使っています。
fpsゲーマーではないのでゲーミングマウスとかいらないだろと思ってたのですが、
ボタンが9個あって自由にショートカットを割り当てる機能があり、すごく便利です
【PUBG JAPAN SERIES 2018推奨ギア】ゲーミングマウス ロジクール G300s プログラム可能ボタン 左右対称
- 出版社/メーカー: ロジクール
- 発売日: 2015/03/06
- メディア: Personal Computers
- この商品を含むブログを見る
nscripterのトラブルについて
「宮本県」制作にあたって久々にNscripterを触りました。
いくつかトラブルに出くわしたので個人的備忘録です
(あくまで個人的体験談なので、間違いがあるかもしれません)
・文字スプライトはセーブされない
strspまたはstrsphで読み込んでおいた文字スプライトは、セーブ→ロードで消えてしまう。
キャラ紹介用の説明画面や、ライフゲージを文字スプライトでやっていたので、ロード後に消えてしまいました。
解決策は、
1)文字部分を画像スプライトで作っておき、lspやlsphで表示する。(画像スプライトはセーブされる)
もしくは、
2)loadgosub を定義節に入れて、ロード後に文字スプライト読み込みルーチンに飛ばす
・oggのファイル名を間違えると、「アラートなしで2~3回目に」Nスクが落ちる。
アラートがないので、なぜ落ちたのか?がすぐには分かりません
しかもoggの再生2~3回目なので、問題がoggにあることがすぐには分かりません
さらに、アーカイブ化する前の状態(制作中のむきだしのoggファイルを使ってる状態)だと、このトラブルが発生しないと思われます(うちの場合はそうでした)
なのでNスクが落ちる原因がなかなか特定できず・・やっかいでした。
セーブ/ロードを使って、同一シーンを2回以上繰り返し=oggが2回以上再生、になった時もこれが発生します。
・800x600よりも大きい画面サイズに対応できるようになったものの、hdサイズなどにすると、ウインドウモードの時に画面からはみ出す。
しかもはみ出し方が変で上部のメニューバーが隠れちゃってるので、移動もできない・・
うちの環境依存かもしれませんが、どうしようもないのでhdサイズはあきらめました。