吉里吉里2/KAG3 覚え書き

自分がゲーム制作において調べたkag変数や作ったルーチンの覚え書きをここに記載しておきます。
覚え書きなので説明は大分端折っていますが、吉里吉里2/KAG3を使う上で参考になる所があったらご利用下さい。

横に書いている(2.20/3.20)等は吉里吉里2/KAG3の動作確認バージョンです。(2.20/3.20)は吉里吉里2 Ver2.20・KAG3 Ver3.20で動作確認しているという事です。バージョンによって期待した動作がしないとかいう事も十分考えられますので確認して下さい(新しければ使えるという物でもありません(^^;)

ちなみに自分が改めて調べる手間を省く意味もありますので、リファレンスに載ってる事も記載していますのであしからず(^^;。

【ウインドウ/レイヤー関連】

・ウインドウサイズ横・縦 (2.20/3.20)
例:
[emb exp="kag.scWidth"]:[emb exp="kag.scHeight"]

・現在のウインドウモード(フルスクリーンか否か) (2.20/3.20)
例:
[emb exp="kag.fullScreened"]

・現在のマウスカーソル位置 (2.20/3.20)
例:
[emb exp="kag.fore.base.cursorX"]:[emb exp="kag.fore.base.cursorY"]

画面解像度横・縦(2.20/3.20)
例:
[emb exp="System.screenWidth"]:[emb exp="System.screenHeight"][r]

ウインドウを画面中央に配置(2.20/3.20)
例:
起動後にウインドウを移動させる場合
[iscript]
var left=(System.screenWidth-kag.scWidth)\2;
var top=(System.screenHeight-kag.scHeight)\2;
if (left<0)left=0;
if (top<0)top=0;
kag.setPos(left,top);
[endscript]

ウインドウ表示前に位置決定する場合
Mainwindow.tjsの470行目付近に水色スクリプトを追加する
// ウィンドウを表示
if(ismain){
left=(System.screenWidth-this.width)\2;
top=(System.screenHeight-this.height)\2;
if (left<0)left=0;
if (top<0)top=0;
this.setPos(left,top);
}

if(ismain) visible = true;

ウインドウを前回終了時と同じ位置に配置する(2.20/3.20)
Mainwindow.tjsの470行目付近に水色スクリプトを追加、
// ウィンドウを表示
if (ismain){
if (sflags.scLeft !== void){
left=sflags.scLeft;
top=sflags.scTop;
if (left<0)left=0;
if (top<0)left=0;
if (left+this.width>System.screenWidth)left=System.screenWidth-this.width;
if (top+this.height>System.screenHeight)top=System.screenHeight-this.height;
this.setPos(left,top);
}
}

if(ismain) visible = true;

それと540行目付近 onCloseQuery関数に水色スクリプトを追加

function onCloseQuery()
{
sflags.scLeft=kag.left;
sflags.scTop=kag.top;

saveSystemVariables();


・画像サイズ横・縦 (2.20/3.20)
例:前景レイヤー0の表画面の画像サイズ表示
[emb exp="kag.fore.layers[0].width"]:[emb exp="kag.fore.layers[0].height"]

・前景レイヤーを指定座標に移動する (2.20/3.20)
例:前景レイヤー0をマウスカーソル位置に移動する
[eval exp="kag.fore.layers[0].left=kag.fore.base.cursorX"]
[eval exp="kag.fore.layers[0].top=kag.fore.base.cursorY"]

・メッセージレイヤを消すのと同時に顔絵も消す(2.20/3.20)
例:
[layopt layer=0 autohide=true]

・loadImagesのストレージを変数で指定する(2.20/3.20)
例:
[iscirpt]
var i='test';
kag.fore.layers[0].loadImages(%[storage:i]);
[endscript]

・メッセージレイヤーもmoveタグで自動移動出来る(2.20/3.20)
・メッセージレイヤーもlayoptタグのopacity属性で半透明に出来る(2.20/3.20)

前景レイヤーの拡大縮小(2.20/3.20)
例:
[iscript]
function zoom_layer(elm,zoom)
{
var layer= new Layer(kag,kag.fore.base);
layer.assignImages(kag.fore.layers[elm]);
var Width=layer.imageWidth;
var Height=layer.imageHeight;
kag.fore.layers[elm].setSize(Width*zoom,Height*zoom);
kag.fore.layers[elm].stretchCopy(0,0,Width*zoom,Height*zoom,layer,0,0,Width,Height);
};
[endscript]

[image storage="test" layer=0 left=0 top=0 visible=true]
[eval exp="zoom_layer(0,0.5)"]
;第一引数が対象レイヤー番号、第二引数が拡大率(1以上で拡大、1未満で縮小)


【フォント/メニュー関係】

・ユーザーが選択したフォント名
 (2.20/3.20)
例:
[emb exp="kag.chDefaultFace"]
または
[emb exp="kag.current.userFace"]

・現在設定されているデフォルトフォント名 (2.20/3.20)
例:
[emb exp="kag.current.defaultFace"]

・袋文字の強調度設定 (2.20/3.20)
例:
[eval exp="kag.current.edgeEmphasis=1024"]
またはconfig.tjsのメッセージレイヤ追加設定に下記を記述
edgeEmphasis = 1024;

メニューの「フォント」設定を、すぐに(次の文字表示から)反映されるようにする(2.20/3.20)
例:(但しフォントを変えられてはまずい時、例えばスクリプト側からフォント指定している場合等はメニュー選択不可にする等の必要あり)
MainWindow.tjsのonChChangeFontMenuItem関数に水色のスクリプトを追加する
function onChChangeFontMenuItem(sender)
{
selectFont();
saveSystemVariables();
for(var i = kag.fore.messages.count-1; i >= 0; i--)
kag.fore.messages[i].lineLayer.font.face = chDefaultFace;
for(var i = kag.back.messages.count-1; i >= 0; i--)
kag.back.messages[i].lineLayer.font.face = chDefaultFace;

}

メニューの「フォント」設定を一時的に選択不能にする(2.20/3.20)
例:
[eval exp="kag.chChangeFontMenuItem.enabled = false"]\
(trueにすれば選択可能になる)

gvolumeプラグインのサブメニューをタグから選択する(2.20/3.20)
例:
[eval exp="global.gvolume_object.onMenuClick(global.gvolume_object.volumeMenu.children[0].children[0])"]
(children[0]の配列番号はメニューの番号:一番上から0)


【リンク/ボタン関係】

現在設置されているリンクの数(2.20/3.20)
例:
[emb exp="kag.fore.messages[0].numLinks"]

選択されたリンクのリンク番号(2.20/3.20)
例:
[emb exp="kag.fore.messages[0].lastLink"]
(onenterやonleaveでもきちんと記録されている)

特定のレイヤーのリンクをロックする(2.20/3.20)
例:
[eval exp="kag.fore.messages[0].setSelProcessLock(true)"]

・リンクでブラウザ起動 (2.20/3.20)
例:
[link exp="System.shellExecute('http://www.piass.com/kpc/')"]推進委員会本部[endlink]

リンクの不透明度を変更する(2.20/3.20)
例:
[eval exp="kag.fore.messages[0].links[0].opacity=220"]



【その他】

・現在のストレージ名
 (2.20/3.20)
例:
[emb exp="kag.conductor.curStorage"]

・現在のラベル名 (2.20/3.20)
例:
[emb exp="kag.conductor.curLabel"]

・スクリプトのシナリオ解析モード (2.20/3.20)
例:シナリオ解析モードをKAG2.x互換にする
[eval exp="kag.conductor.ignoreCR=false"]

・ファイルの有無確認 (2.20/3.20)
例:(セーブフォルダの中に data0.bmp というファイルが存在するか確認し、存在する場合は表示する)
[if exp="Storages.isExistentStorage(kag.saveDataLocation+'/data0.bmp')==1"]
[locate x=200 y=200][graph storage="&kag.saveDataLocation + '/data0.bmp'" char=false]
[endif]

栞のファイル名(2.20/3.20)
例:(栞1のファイル名)
[emb exp="kag.getBookMarkFileNameAtNum(1)"]

・ゲーム終了時にYes/Noで確認するか (2.20/3.20)
例:(終了確認なしにする)
[eval exp="kag.askOnClose=false"]
またはconfig.tjsのウインドウや動作の追加の設定に
askOnClose=false;
と設定する

・現在演奏中のBGMファイル名 (2.20/3.20)
例:
[emb exp="kag.bgm.playingStorage"]

・現在実行中のトランジション数 (2.20/3.20)
例:
[emb exp="kag.transCount"]


効果音再生で、スキップ中は再生しない(2.20/3.20)
例:
[playse storage="se" cond="kag.skipMode<=1"]\

・タグで「次の選択肢/未読まで進む」メニューを実行する (2.20/3.20)
例:
[eval exp="kag.skipToNextStopMenuItem.click()"]
(右クリックサブルーチン中では使用不能)

・メッセージ履歴を消去する (2.20/3.20)
例:
[eval exp="kag.historyLayer.clear()"]

メッセージ履歴の文字色を変える(2.20/3.20)
例:
[eval exp="kag.historyLayer.historyColor=0x00ff00"]

一時変数、システム変数を全て消去(void)する(2.20/3.20)
例:
一時変数消去[eval exp="(Dictionary.clear incontextof kag.tflags)()"]
システム変数消去[eval exp="(Dictionary.clear incontextof kag.sflags)()"]

文字を表示する際、1文字ずつ効果音をならす(2.20/3.20)
例:
[macro name="tws"]
[eval exp="tf.text=mp.text"]
[call target="*text_with_se"]
[endmacro]

[tws text="さて、どうだろうか"][p]
[tws text="うまくいくと良いけど"]
[s]

*text_with_se
[eval exp="tf.temp1=tf.text.length,tf.temp2=0,kag.clickCount=0"]
*text_with_se1
[eval exp="kag.skipMode=1" cond="kag.clickCount && kag.skipMode==0"]
[eval exp="tf.temp3=tf.text.substring(tf.temp2,1),tf.temp2++"]
[emb exp="tf.temp3"]
[if exp="!kag.skipMode"][playse buf=0 storage="test"][ws buf=0][endif]
[jump target=*text_with_se1 cond="tf.temp1 != tf.temp2"]
[return]

システムメニューを一時的に利用不可にする(2.20/3.20)
例:
[eval exp="kag.systemMenu.enabled = false"]


「前に戻る」メニューを一時的に利用不可にする(2.20/3.20)
例:
通過履歴データを消します[p]
[iscript]
var historyOfStore_back=[];
historyOfStore_back=kag.historyOfStore;
kag.historyOfStore=[];
[endscript]
[p]
通過履歴データを戻します[p]
[iscript]
kag.historyOfStore=historyOfStore_back;
historyOfStore_back='';
[endscript]


・既読の時は「次の選択肢/未読まで進む」メニューを使えるようにし、未読の時は「次の選択肢/未読まで進む」メニューを使えないようにする (2.20/3.20)
例:
afterinit.tjsに以下のように記述する。
f.nextSkipStatus=falseで既読でも「次選択肢」を無効のままに出来る(スクリプト中から制御可)


kag.onConductorLabel=function(label,page)
{
// コンダクタがラベルを通過した
if(!usingExtraConductor)
{
incRecordLabel(true);
setRecordLabel(conductor.curStorage, label);
}
setUserSpeed();
if(!usingExtraConductor)
{
if(!getCurrentRead() && skipMode != 4)
{
cancelSkip(); // 未読なのでスキップを停止
nextSkipEnabled=false; //「次選択肢」を禁止
}
else if(f.nextSkipStatus==true)nextSkipEnabled=true; //「nextskip」がtrueの時「次選択肢」を許可
currentLabel = label;
}
if(page !== void && page !== '')
{
if(page[0] == '&') page = (page.substring(1))!;
currentPageName = page;
}
if(page !== void)
{
pushHistoryOfStore();
stablePosibility = false;
dm(conductor.curStorage + " : ラベル/ページ : " + label + "/" + currentPageName);
if(usingExtraConductor) throw new Exception("右クリックサブルーチン内/extraCondutor"
"サブルーチン内では保存可能なラベルを記述できません");
storeFlags(), storeLabelPassed = true, setMenuAccessibleAll();
if(recordHistoryOfStore == 1) // 1 : 保存可能なラベルごと
setToRecordHistory();
}
return true;
};
f.nextSkipStatus=true;


メニューバーにフォント太文字選択を付ける(2.20/3.20)
例:
Afterinit.tjsに以下のように記述する

function onFontBoldMenuItemClick(sender)
{
    sender.checked = !sender.checked;
        sf.fontBold= !sf.fontBold;
        fontBold_set();
        }
        
function fontBold_set(){
        var messages;
        messages = kag.fore.messages;
        for(var i = messages.count-1; i >= 0; i--)
        messages[i].defaultBold=sf.fontBold;
        messages = kag.back.messages;
        for(var i = messages.count-1; i >= 0; i--)
        messages[i].defaultBold=sf.fontBold;
        }

if (sf.fontBold===void)sf.fontBold= kag.fore.messages[0].defaultBold;
kag.characterMenu.add(kag.fontBoldMenu = new KAGMenuItem(this, "太文字", 0, onFontBoldMenuItemClick, false));
kag.fontBoldMenu.checked = sf.fontBold;
fontBold_set();


現在の年月日日時を表示する(2.20/3.20)
例:
[iscript]
var date = new Date();
tf.年 = date.getYear();
tf.月 = date.getMonth()+1;
tf.日 = date.getDate();
tf.時 = date.getHours();
tf.分 = date.getMinutes();
tf.秒 = date.getSeconds();
tf.曜日 = date.getDay();
delete date;
[endscript]

[emb exp="tf.年"]年
[emb exp="tf.月"]月
[emb exp="tf.日"]日
[if exp="tf.曜日==0"](日)[endif]
[if exp="tf.曜日==1"](月)[endif]
[if exp="tf.曜日==2"](火)[endif]
[if exp="tf.曜日==3"](水)[endif]
[if exp="tf.曜日==4"](木)[endif]
[if exp="tf.曜日==5"](金)[endif]
[if exp="tf.曜日==6"](土)[endif][r]
[emb exp="tf.時"]時
[emb exp="tf.分"]分
[emb exp="tf.秒"]秒


ロード時に、ロード前とロード後が同じ音楽の時でも演奏し直すようにする(2.20/3.20)
例:
afterinit.tjsに以下を記述する
var restoreFlags2=kag.restoreFlags;
kag.restoreFlags=function(f, clear = true, elm = void){
bgm.stop();
restoreFlags2(...);
};





「自動で読み進む」「スキップ」をサブルーチンで実行する(2.20/3.20)
例:
これらはサブルーチン中では呼び出し出来ないので、ステータスを記録し、サブ
ルーチンを抜けたらタイマーでステータスを確認し、実行する。

[iscript]
var menuCheckTimer = new Timer (menuCheck, '');
menuCheckTimer.interval = 20;
function menuCheck {
    if (tf.autoMode==1)kag.autoModeMenuItem.click();
    if (tf.autoMode==2)kag.skipToNextStopMenuItem.click();
    menuCheckTimer.enabled = false;  // タイマー停止
}
@endscript
[rclick call=true jump=false target=*test]
(右クリックで自動で読み進んでみます)[p]
さてどうかな[p]
どうだろうねぇ[p]
うまくいくかなぁ[p]
どうだろうねぇ[p]
[s]

*test
(右クリックサブルーチン中。手抜きでメニューは省略(^^;)
[eval exp="tf.autoMode=1,menuCheckTimer.enabled=true"]
[return]



・ファイルから迷路マップデータを読み込み、二次配列変数に入れる(2.20/3.20)
例:(X:20 Y:15の二次配列データに。ファイルはCSVで、各要素は ','で区切っているとする)
[iscript]
var mapdata=[]; //迷路マップデータ
var temp=[];
var temp2=[];

temp.load('map1.csv'); //マップデータ読み込み

for (var i2=0;i2<15;i2++){ //マップデータを配列関数にセット
temp2.split(',,,,,,,,,,,,,,,,,,,',temp[i2],false);
mapdata[i2]=[];
for (var i1=0;i1<20;i1++){
mapdata[i2][i1]=temp2[i1];
}
}

・重複ナシランダム(配列消去法 ←勝手に名付けた(^^;)(2.20/3.20)
例:(0〜19までの数字で3つ数字をランダムで取る:重複ナシ)
[iscript]
tf.rdata=[];
for (var i1=0;i1<20;i1++){ //このi1<20を変更すればランダム幅の設定が可能
tf.rdata[i1]=i1;
}
tf.temp=intrandom(0,tf.rdata.count-1);
tf.dataA=tf.rdata[tf.temp];
tf.rdata.erase(tf.temp);
tf.temp=intrandom(0,tf.rdata.count-1);
tf.dataB=tf.rdata[tf.temp];
tf.rdata.erase(tf.temp);
tf.temp=intrandom(0,tf.rdata.count-1);
tf.dataC=tf.rdata[tf.temp];
tf.rdata.erase(tf.temp);
[endscript]
[emb exp="tf.dataA"]:[emb exp="tf.dataB"]:[emb exp="tf.dataC"]
[s]

・線分交差判定する関数(2.20/3.20)
例:
[iscript]
function cross_check(x1,y1,x2,y2,x3,y3,x4,y4)
{ //2線分が交差しているかどうか判定(交差時trueを返す)
if (((x1 - x2) * (y3 - y1) + (y1 - y2) * (x1 - x3)) * ((x1 - x2) * (y4 - y1) + (y1 - y2) * (x1 - x4)) > 0)return false;
if (((x3 - x4) * (y1 - y3) + (y3 - y4) * (x3 - x1)) * ((x3 - x4) * (y2 - y3) + (y3 - y4) * (x3 - x2)) > 0)return false;
return true;
}
[endscript]
[emb exp="cross_check(10,10,40,40,20,20,60,60)"]

SWish2のフラッシュデータからKAGシナリオラベルにジャンプする(2.20/3.20)
例:
フラッシュ側にて、アクション → アクションの追加 → FS Command → コマンドに Eval → 引数にkag.process('first.ks','*title'); 等と記載する


ミニゲームサンプル集(ソーススクリプトは恥ずかしいので非公開(^^;)
 (中身 追いかけっこ、ブロック崩し、2Dダンジョン、ボタン押し加速移動)
・RPGツクール素材を使った改ページマークサンプル


<もどる>

E-Mail:感想・質問その他はこちらへ

演奏中の曲:グノシエンヌ1番/EricSatie