【Tyranoscript】大量のglinkを一気に表示したい
Tyranoscriptでglinkを大量に生成するケース(「姫騎士フィーネの受難」だと街の移動先選択とか)があるとする。
以下のような感じでjumpタグで無理くりループを作って生成すると、結構バラバラ出て来てしまう。
*loop
[iscript]
tf.x = 155 * Math.floor(tf.num / 10);
tf.y = 62 * (tf.num % 10);
[endscript]
[glink color="blue" storage="scene1.ks" size="28" x="&tf.x" width="40" y="&tf.y" height="30" text="&tf.num" target="*selectinterest" ]
[if exp="tf.num < 79"]
@eval exp="tf.num++"
@jump target="*loop"
[endif]
[s]
Tyranoscriptのソースにconsole.log()でタイムスタンプを仕込んで何に時間を食っているのか見てみると、「iscript」や「eval」の実行に10ms弱かかっている。
内部的にjsのeval()を実行していると思うので、まぁそりゃそうかという感じだ。
なのでこいつを取っ払う。
*loop
[glink color="blue" storage="scene1.ks" size="28" x="&(155 * Math.floor(tf.num / 10))" width="40" y="&(62 * (tf.num % 10))" height="30" text="&tf.num" target="*selectinterest" ]
[if exp="tf.num++ < 79"]
@jump target="*loop"
[endif]
[s]
前よりは早くなったが、順番に出てくる感じは消えない。
これは「iscript」や「eval」以外のタグもわずかに時間がかかっているためだろう。
とういうことは、全部のボタンを一気に出したければ、タグを一つにするしかない。
Tyranoscriptのタグをjsから呼び出せる「tyrano.plugin.kag.ftag.startTag」を使って以下のように「iscript」だけに書き換える。
[iscript]
for (let i = 0; i < 80; i++) {
let x = 155 * Math.floor(i / 10);
let y = 62 * (i % 10);
tyrano.plugin.kag.ftag.startTag("glink",
{
color: "blue",
storage: "scene1.ks",
size: 28,
x: x,
width: 40,
y: y,
height: 30,
text: i,
target: "*selectinterest"
}
);
}
[endscript]
[s]
おぉ、できた。
一度に多くの処理を行いたい場合は、無理にタグで頑張らずjsに寄せてしまった方が良さそうだ。
(ゲームの方は次回のアップデートで直そう…)