大寒ソフト 2022/08/05 22:21

【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に寄せてしまった方が良さそうだ。
(ゲームの方は次回のアップデートで直そう…)

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索