同人ゲーム制作支援net

講座 > 吉里吉里/KAGチョイ技集

私はずっと吉里吉里/KAGでノベル・アドベンチャーゲームを作ってきたのですが、
いろいろと便利なチョイ技を考え(あるいは人から教えてもらい)、取り入れてきました。
それらを公開したいと思いますので、よろしければ参考にしてください。
今後、不定期で追加していきます。

■KAG
  1. バージョン情報をシンプルに
  2. [l]タグと[r]タグを合成
  3. 文字が浮かび上がる
  4. 背景をぼかす
  5. 背景を一部だけ拡大
  6. キャラ画像を拡大
  7. キャラ画像を暗くする
  8. 音楽ファイル名をシステム変数に代入
  9. オートセーブ New
  10. 近日更新
■TJS
  1. カーソルを瞬間移動
  2. メッセージ履歴のボタンを変更
  3. メッセージ履歴表示時にメッセージを隠す
  4. メッセージ履歴表示時に背景画像を使う
  5. スクリーンモード切り替えのショートカット
※サンプル内の空白はスペースキーで空けていますが、実際のTJSファイルではTabで空けてください。

1.バージョン情報をシンプルに

about.ksに記述することで、バージョン情報のダイアログを作ることができますが、
特に凝ったことをする必要はないという場合は、以下のようにすれば、
Windows標準のシンプルなダイアログにすることができます。

@eval exp="System.inform('作品名 Var1.00 (C)サークル名 2010', 'バージョン情報')"

2.[l]タグと[r]タグを合成

クリック待ちの[l]と改行の[r]タグは、セットで使用することが多いです。
いっそのこと、このふたつをマクロで合成してしまいましょう。
全画面のノベルゲームでは、なかなか重宝すると思います。

@macro name=lr
@l
@r
@endmacro

【使用例】
簡単にクリック待ちと[lr]
改行を処理できます。[lr]
わっほう。

3.文字が浮かび上がるマクロ

文字がじんわりとクロスフェードで浮かび上がる演出をマクロで実現できます。
リファレンスで「普通は使いません」などと書かれる[ch]タグを使用します。
回想シーンなど、幅広いシーンで活用できるかと思います。

@macro name=text_emerge
@current layer=message0 page=back
@locate x=%x y=%y
@ch text=%text
@trans time=400 method=crossfade
@wt
@current layer=message0 page=fore
@endmacro

【使用例】
@text_emerge text="浮かび上がります。" x=0 y=100
@text_emerge text="また浮かび上がります。" x=0 y=200
@text_emerge text="またまた浮かび上がります。" x=0 y=300

4.背景をぼかす

立ち眩みしたなどの演出をしたい時に、背景を簡単にぼかす方法があります。
[base_blur]というマクロを作り、その中でdoBoxBlur関数を使用します。
ただし栞にこのぼかした情報は記録されませんので注意してください。

@macro name=base_blur
@eval exp="kag.fore.base.doBoxBlur(3, 3)"
@endmacro

【使用例】
@base_blur
背景にブラーがかかります。

5.背景を一部だけ拡大

背景を一部だけ拡大してみるマクロです。zoom.ksと違って不透明度も変化できます。
座標と、そこからの幅と高さを指定すると、その部分が切り取られて拡大されます。
これも拡大した情報は栞には記録されませんので注意してください。

@macro name=base_pzoom
@image storage=%file page=back layer=base
@eval exp="kag.fore.base.stretchBlend(0, 0, 800, 600, kag.back.base, mp.x, mp.y, mp.width, mp.height, 255, stNearest, true)"
@endmacro

【使用例】
@base_pzoom file=○○○○.jpg x=0 y=100 width=400 height=300
座標(x=0,y=100)から幅400、高さ300の領域を拡大しました。不透明度は255です。

6.キャラ画像を拡大

曲がり角でぶつかった、などの演出に使えるキャラ画像を拡大するマクロです。
項目5と違うのは、operateStretchという関数を使っていることです。
以下は幅400、縦600ピクセルのキャラ画像を使用するという前提です。

@macro name=chara_pzoom
@image storage=%file page=back layer=0 visible=true
@eval exp="kag.fore.base.operateStretch(mp.x, mp.y, mp.width, mp.height, kag.back.layers[0], 0, 0, 400, 600, omAuto, 255, stNearest)"
@endmacro

【使用例】
@chara_pzoom file=○○○○.png x=0 y=-100 width=800 height=1200
幅800、高さ1200に拡大したキャラ画像を座標(x=0,y=-100)に表示しました。不透明度は255です。

7.キャラ画像を暗くする

夜の屋外では、普通に立ち絵を表示するより、少し暗くすると雰囲気が出ます。
吉里吉里では[image]タグの輝度を調整することによりこれを実現できます。
以下は一例ですので、好みで調整したり、ガンマ値にも変更を加えてみてください。

@image storage=○○○○.png page=fore layer=0 visible=true rceil=190 gceil=190 bceil=190

8.音楽ファイル名をシステム変数に代入

音楽鑑賞モードをつけたけど、まだ作中に未登場の曲のタイトルは表示させたくないという場合、
システム変数によって表示と非表示を判定させることになります。
マクロを使えば、初回再生時にファイル名がシステム変数に代入されます。

@macro name=bgm
@playbgm storage=%file
@if exp="sf[mp.file] == void"
@eval exp="sf[mp.file] = 1"
@endif
@endmacro

【使用例】
@bgm file=bgm01
「sf.bgm01」というシステム変数に1が代入されました。これを音楽鑑賞モードで使用します。

9.オートセーブ

商業ゲームではたまにあるオートセーブ、前回終了したところから再開できる機能。
[save]タグを毎回記入するのは面倒なので、マクロで実現しましょう。
ページが切り替わるごとに使う[cm]タグと合成すればよいのです。

@macro name=cm2
@cm
@save place=20 ask=false
@endmacro

【使用例】
*page1|
@cm2
栞番号20にオートセーブされます。
@p
*page2|
@cm2
タイトル画面で栞番号20をロードするようにすればOK。
@p

11.カーソルを瞬間移動

ゲーム終了時など、はい/いいえのダイアログを出す時、ボタンのすぐ近くに
カーソルを瞬間移動させ、プレイヤーの手間を省く方法があります。
YesNoDialog.tjsのYesNoDialogWindow関数の最後に、以下のように記述します。

function YesNoDialogWindow(message, cap)
{



    //ウィンドウサイズの半分の値を入力する
    kag.fore.base.cursorX = 400, kag.fore.base.cursorY = 300;
}

function finalize()
{
    super.finalize(...);
}

12.メッセージ履歴のボタンを変更

メッセージ履歴のボタンは、デフォルトでは「≪ 前ページ」「次ページ ≫」という風に
横に並ぶ形でなっています。これを縦配列にしてみたいという場合は、
HistoryLayer.tjsのmakeButtons関数を書き換えます。

function makeButtons()
{



    else
    {
        prevPageButton.left = width-controlHeight;
        prevPageButton.top = controlHeight-2;
        prevPageButton.width = controlHeight;
        prevPageButton.height = (height-controlHeight+2) \ 2;
        prevPageButton.caption = "▲";
        prevPageButton.color = 0x808080;
        prevPageButton.visible = true;
        prevPageButton.hint = "前ページ";

        nextPageButton.left = width-controlHeight;
        nextPageButton.top = controlHeight-2 + prevPageButton.height;
        nextPageButton.width = controlHeight;
        nextPageButton.height = (height-controlHeight+2) \ 2;
        nextPageButton.caption = "▼";
        nextPageButton.color = 0x808080;
        nextPageButton.visible = true;
        nextPageButton.hint = "次ページ";
    }

13.メッセージ履歴表示時にメッセージを隠す

メッセージ履歴を表示する時、デフォルトだとメッセージレイヤーがそのままになっており、
履歴文章と被って見栄えが悪い感じです。しかしこれを一時的に隠してしまえます。
HistoryLayer.tjsを以下のように書き換えましょう。

function clearBack(n)
{
    // 背景を塗りつぶす
    if(n === void)
    {
        face = dfAlpha;
        fillRect(0, 0, width, height, 0xc8000000);
        kag.fore.messages[0].visible = false;
    }



function hide()
{
    window.hideHistory();
    kag.fore.messages[0].visible = true;
}

14.メッセージ履歴表示時に背景画像を使う

メッセージ履歴を表示する時、専用の背景画像を使いたいという場合があると思います。
そんな時は、config.tjsで「ページ単位での閲覧を行う」をtrueにした上で、
HistoryLayer.tjsのclearBack関数に一行だけ加筆します。

function clearBack(n)
{
    // 背景を塗りつぶす
    if(n === void)
    {
        face = dfAlpha;
        fillRect(0, 0, width, height, 0xc8000000);
        loadImages("画像ファイル名.拡張子");
    }

15.スクリーンモード切り替えのショートカット

スクリーンモードの切り替えは、通常は上部のメニューから行いますが、
商業ゲームのように「ALT+Enter」でショートカットキーを割り当てる方法があります。
AfterInit.tjsというファイルを新たに作り、その中に関数を書き込みます。
おさかな定食。のらんか様に教えていただいたテクニックです。

function DisplayChange(key, shift)
{
    //ALT&エンターキーが押されたとき
    if(key == VK_RETURN && shift == ssAlt)
    {
    //フルスクリーンならウィンドウモードにする
        if(kag.fullScreened == true)
            kag.windowedMenuItem.click();
    //ウィンドウモードならフルスクリーンにする
        else if(kag.fullScreened == false)
            kag.fullScreenMenuItem.click();
        return true;
    }
}

//キーフックに登録
kag.keyDownHook.add(DisplayChange);



Copyright (C) 同人ゲーム制作支援net All Rights Reserved.