Layer.type = ltBinder

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


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

KAGEX講座(33) – 遅延実行3(delaycancel)

delaycancelタグでは実行待ちの遅延実行を全て消去します。delaydoneタグや改ページでの強制実行ではその時点で全ての遅延実行が実行されますが、delaycancelでは実行されません。よく注意して使わないとバグの元になります。一応紹介しましたがdelaycancelが必要なことはまず無いので使わないのがいいです。

@linemode mode=vn

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

@カード rotate=30
@カード rotate=60 delayrun=2000
@カード rotate=90 delayrun=4000
@カード rotate=120 delayrun=6000
@カード rotate=150 delayrun=8000
2秒ごとに30度ずつ回転[l]
@delaycancel
クリックした時点で残っている遅延実行は消去され、それ以上回転しません。

KAGEX講座(32) – 遅延実行2(nodelaydone)

delayrunコマンドは改ページで強制的に全て実行されます。改ページしても継続したい場合はnodelaydoneをつけます。アクションでnowaitをつけるのと同じような効果です。
また、nodelaydoneをつけた遅延実行も「@delaydone all」で全て実行されます。

@linemode mode=vn

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

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

次のページに進んでもそのままです

@delaydone all
全ての遅延実行コマンドを強制的に実行します

「@delaydone」は「all」を付けないとnodelaydoneが指定されていない遅延実行のみ強制的に実行できます。

@linemode mode=vn

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

@カード rotate=30
@カード rotate=60 delayrun=2000
@カード rotate=90 delayrun=4000
@カード rotate=120 delayrun=6000
@カード rotate=150 delayrun=8000
2秒ごとに30度ずつ回転[l]
@delaydone
改行で遅延コマンドを強制実行しました

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は修正されないようなのでバイナリ形式のファイルを繰り返し読み込むのは止めましょう。メモリを使いすぎて最終的にゲームが強制終了します。