KAGEX講座(31) – 遅延実行(delayrun)

delayrunコマンドを使うとタグの実行タイミングが遅れます。(遅延実行)

delayrunにはms単位で時間を指定します。指定しただけ実行されるのが遅くなります。
非同期のトランジションやアクションなどと同じく、delayrunのコマンドも改ページで全て実行されます。

@linemode mode=vn

@layer name=カード file=card show
レイヤを表示

@カード xpos=300 time=1000
@カード ypos=300 time=1000 delayrun=1000
1秒間右に移動してから、1秒間上に移動します

@カード resetpos
位置を元に戻しました

@カード rotate=30
@カード rotate=60 delayrun=2000
@カード rotate=90 delayrun=4000
@カード rotate=120 delayrun=6000
@カード rotate=150 delayrun=8000
2秒ごとに30度ずつ回転します

次のページに進むと全て実行されます

また、遅延実行は非同期動作(nosync)でしか使えません。
同期動作(sync)を指定しても強制的に非同期になります。

@linemode mode=vn

@layer name=カード file=card show
レイヤを表示

@カード hide fade=1000 nosync
@カード show fade=1000 nosync delayrun=1000
@カード hide fade=1000 nosync delayrun=2000
@カード show fade=1000 nosync delayrun=3000
レイヤを点滅します

@カード hide fade=1000 sync
@カード show fade=1000 sync delayrun=1000
@カード hide fade=1000 sync delayrun=2000
@カード show fade=1000 sync delayrun=3000
同期実行はできないので先ほどと同じ動作になります。

実行中のファイルと行番号を表示

吉里吉里のキャプションに実行中のksファイル名と行番号を表示できます。こちらも開発中用の機能。
currentfilde-indicater
※first.ks(13)の部分

以下のスクリプトをafterinit.tjsにコピーするだけです。KAGとKAGEXどちらでも使えます。

kag.mainConductor.onTag_org = kag.mainConductor.onTag;
kag.mainConductor.onTag = function() {
	kag.caption = System.title + @" [${curStorage}(${curLine})]";
	return onTag_org(...);
} incontextof kag.mainConductor;
kag.extraConductor.onTag_org = kag.extraConductor.onTag;
kag.extraConductor.onTag = kag.mainConductor.onTag incontextof kag.extraConductor;

実行中のシナリオファイルを開くプラグイン

吉里吉里実行中に現在のksファイルをShift+Sで開くプラグインです。

ダウンロード

KAG/KAGEXどちらでも使えます。ゲーム製作中は結構便利。

秀丸、サクラエディタ、TeraPadなど対応しているテキストエディタなら実行中の行までジャンプします。
対応してほしいエディタがあればコメント欄まで。かぐや姫Studio、KKDEは行指定で開く機能がないので無理です。

吉里吉里2は画面解像度2048pxまで?

吉里吉里2で描画領域の横幅または縦幅が2048を超えると拡大時のスムージングができず表示が汚くなるようです。

吉里吉里の画像の描画にはDirect3D, DirectDraw, GDIの3種類があります。
このうちDirect3Dは2048pxを超えると使えません。おそらくDirectX7のテクスチャサイズ限界。
DirectDrawは環境依存問題があり、Vista以降では結構な環境でスムージングがききません。
参考)Vista さんの罠
参考)吉里吉里 DirectDraw 環境依存問題のメモ
よって2048pxを超える場合にGDIが使われます。GDIのスムージングは非常に低品質で、補完されているのかされてないのかほとんどわかりません。

2048px以上のゲームはなかなかありませんが、高解像度ディスプレイでWindowResizableやKAGEXなどの機能で拡大すると発現します。4Kや8Kのディスプレイが出てくる中ではちょっと厳しそうです。

なお吉里吉里Zは少し試した限り問題ないようです。

バイナリ形式の辞書でメモリリーク?

最新開発版の吉里吉里では配列や辞書をバイナリで読み書きできます。が、読み込んだ辞書が解放されない。

以下のloadBin()を呼ぶたびにメモリ使用量が際限なく増えていきます。load()では大丈夫。明示的にinvalidateしても消えない。詳細は不明。

var dic = %[];
(Dictionary.saveStruct incontextof dic)("dic.tjs", "");
(Dictionary.saveStruct incontextof dic)("bin.tjs", "b");

function load() {
	for (var i = 0; i < 10000; ++i) {
		var d = Scripts.evalStorage("dic.tjs");
	}
}

function loadBin() {
	for (var i = 0; i < 10000; ++i) {
		var d = Scripts.evalStorage("bin.tjs");
	}
}

■追記
吉里吉里Zではこのバグは修正されています。
吉里吉里2は修正されないようなのでバイナリ形式のファイルを繰り返し読み込むのは止めましょう。メモリを使いすぎて最終的にゲームが強制終了します。

mapPrerenderedFontで表示されないメモ

Font.mapPrerenderedFontの説明では”現在選択されているフォント名”に対してレンダリング済みフォントを割り当てることになっていますが、フォント高さなども揃えないと適用されないようです。
あまり使わない機能なのでちょっと詰まった。

layer.font.face = "レンダリングフォント";
layer.font.height = 24;
layer.font.bold = true;
layer.font.mapPrerenderedFont("new_font.tft"); // フォント割り当て


layer2.font.face = "レンダリングフォント";
layer2.drawText(0, 0, "てすと", 0); // レンダリング済みフォントは使われない

layer2.font.height = 24;
layer2.font.bold = true;
layer2.drawText(0, 100, "てすと", 0); // レンダリング済みフォントが使われる