KAGEX講座(35) – 動画再生(movie)

環境レイヤのmovieコマンドに動画ファイルを指定すると動画再生できます。fileで画像を読み込んだり、deleteでレイヤを削除したりすれば止まります。

@linemode mode=vn

@layer name=動画 movie=テスト.wmv
動画を再生しています。

@動画 delete
停止しました。

再生中の動画はwvタグで待てます。ただしlayer=allにしてください。

@linemode mode=vn

クリックすると動画を再生します。 クリックで再生を飛ばせます。

@layer name=動画 movie=テスト.wmv
@wv layer=all canskip=true

@動画 delete
動画を再生しました。

オープニング動画を再生するスクリプトは例えば次のようになります。

@linemode mode=vn

オープニング動画を再生します。

; スキップとオートモードを停止
@cancelskip
@cancelautomode

; BGM、効果音、ボイスを停止
@bgm stop=3000
@allse stop=3000
@allchar vcond=all stopvoice

; すべての画像を消去して暗転
@begintrans
@allimage hide
@msgoff
@endtrans fade=3000

; トランジションが飛ばされた時のために強制的に停止
@bgm stop
@stopse buf=all

; 再生前にもう一度スキップとオートモードを停止
@cancelskip
@cancelautomode

; 動画を再生
@layer name=動画 movie=オープニング.wmv

; 再生が終わるまで待つ
@wv layer=all canskip=true

; 再生が飛ばされた時のためにレイヤを動画終了時の色に塗る
;   最後が真っ白ならcolor=0xFFFFFFFF 真っ暗なら color=0xFF000000
;   widthとheightは動画のサイズに合わせます
@動画 color=0xFFFFFFFF width=1280 height=720

; 動画レイヤを隠す
@begintrans
@動画 delete
@endtrans fade=3000

; 少し待つ
@wait time=1000

オープニング動画を再生しました。

KAGEX講座(34) – 遅延実行4(ラベル指定)

delayrunコマンドでは数値の代わりにラベル名を指定できます。その場合はBGM、効果音、ボイスを再生中にその名前のラベルを通過すると実行されます。ラベルはループチューナであらかじめ入れておきます。

@linemode mode=vn

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

@se雨
@カード rotate=90 delayrun=ラベル0
効果音を再生し、ラベル0を通過するタイミングで90度回転します。

ボイスやBGMでも同じです。以下はボイスの例です。

@linemode mode=vn

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

@しおり playvoice=ai000001
@カード rotate=30 delayrun=ラベル0
@カード rotate=60 delayrun=ラベル1
@カード rotate=90 delayrun=ラベル2
【しおり】「ボイス再生中です。ラベル通過でレイヤが回転します」

nodelaydoneやdelaydoneも数値の時と同じように使えます。
delayrunコマンド自体はボイス再生中に立ち絵の表情を変えたりするのに使うことが多いです。数値で指定するよりはラベルを入れて調整するほうが楽だと思います。

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