Arrayに関数を追加しても使えない?

Array.assignStructやDictionary.assignStructで二次元配列などをコピーすると、中に入っている分の配列はシステム側で新しく作成されます。そのような配列には追加した分の関数が反映されません。

以下のコードのERRORという部分では「testFuncが見つかりません」というエラーがでます。
(Array.testFunc incontextof bar[0])(); のように直接呼ばない形なら使えます。

// Array に関数を追加
Array.testFunc = function() { Debug.message("testFunc called"); };

var foo = [];
foo.testFunc(); // OK

foo[0] = [];
foo[0].testFunc(); // OK

var bar = [];
bar.assignStruct(foo);
bar.testFunc(); // OK

bar[0].testFunc(); // ERROR

assignStruct以外にも(const)を付けた場合や関数の可変長引数としての配列の場合などにも駄目なようです。

Array.testFunc = function() { Debug.message("testFunc called"); };

var foo = (const)[];
foo.testFunc(); // ERROR

[].saveStruct("array.tjs");
var bar = Scripts.evalStorage("array.tjs");
bar.testFunc(); // saveStructで保存すると(const)が付くので ERROR

function func(args*) {
  args.testFunc(); // ERROR
}
func();

saveStruct.dllのArray.save2など、プラグインで追加されるものについても同様です。

Layer.type = ltBinder

吉里吉里のリファレンスには書いてませんがレイヤタイプにはltBinderというのがあります。


parentが違うレイヤ間の合成は見た目が変になったりしますがparentのレイヤタイプをltBinderにしておけば防止できたりします。
続きを読む

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

吉里吉里のキャプションに実行中の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は行指定で開く機能がないので無理です。

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

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

以下の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); // レンダリング済みフォントが使われる

windows8でquakeを使うとバグるやつ

Windows8で吉里吉里/KAGの[quake]タグを使うとフルスクリーン時に画面が乱れます。(以前の記事参照)

これは吉里吉里設定ツールで「フルスクリーン切り替え方法」の部分を”ddraw”から”cds”に変更すると防げるようです。詳しいことは調べていませんがお手軽に直せるので設定してしまってもいいかもしれません。

ゲームにエンジン設定ツールが同梱されていればプレイヤー側でも変更できます。フルスクリーンで遊ぶとおかしくなる場合はお試しください。