スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

カテゴリ : スポンサー広告

隠れ機能メモSystem.exitOnNoWindowStartup

吉里吉里ドキュメントには載っていませんがSystem.exitOnNoWindowStartupというプロパティがあります。
trueのとき、最初のスクリプト実行中にWindowが生成されなければそのまま終了します。
falseのときは終了せずプロセスに残ります。
デフォルトではtrueです。

これまで使ったこともなく、これからも使いそうにありません。
System.exitOnWindowCloseにちょっと似てます。
スポンサーサイト

カテゴリ : 吉里吉里

windows8でquakeを使うとバグるらしい


ということで試したら再現しました。
Window.setLayerPosを使うと画面外にはみでで表示残っちゃいます。
KAGでは[quake]させるとまずいようです。
KAGEXではsetLayerPosを使っていないので問題ありません。

続報→http://www.biscrat.com/blog/?p=11

// win8x64, フルスクリーンでWindow.setLayerPosを使うと画面外に表示が残るバグ例
// 吉里吉里 2.31.2012.1127

// 全面赤色のレイヤとウィンドウを表示
var win = new Window();
win.layer = new Layer(win, null);
win.layer.setSize(800600);
win.layer.fillRect(0,0,800,600,0xFFFF0000);
win.setInnerSize(800,600);
win.visible = true;
win.fullScreen = true;
// setLayerPosで適当にずらす
win.timer = new Timer(function {
  var p = System.getTickCount() % 100;
  win.setLayerPos(p, p);
}, "");
win.timer.enabled = true;

続きを閉じる▲

タグ : 吉里吉里 KAG TJS

カテゴリ : 吉里吉里

System.getKeyStateの隠れ機能メモ

System.getKeyStateにはリファレンスで省略されている第二引数があります。


System.getKeyState(code, getcurrent=true)
code:状態を取得する仮想キーコード
getcurrent:現在の状態を取得するか

第二引数を省略するか、trueのときはSystem.getKeyStateを呼び出した瞬間にキーが押されていればtrue、押されていなければfalseが返ります。
第二引数をfalseにすると、前回同じキーコードでSystem.getKeyStateを呼び出したときから、今回の呼び出しまでの間に1度でもキーが押されていればtrueになります。


そんなに使うことはないと思っていたのですがContinuouseHandlerでキー取得するには必須でした。
class KeyPolling
{
  function KeyPolling()
  {
    System.addContinuousHandler(onContinuousHandler);
  }
  
  function finalize()
  {
    System.removeContinuousHandler(onContinuousHandler);
  }
  
  function onContinuousHandler(tick)
  {
    if (System.getKeyState(VK_MEDIA_STOP)) {
      Debug.message("停止");
    } else if (System.getKeyState(VK_MEDIA_PLAY_PAUSE)) {
      Debug.message("再開/一時停止");
    } else if (System.getKeyState(VK_MEDIA_NEXT_TRACK)) {
      Debug.message("次のトラックへ");
    } else if (System.getKeyState(VK_MEDIA_PREV_TRACK)) {
      Debug.message("前のトラックへ");
    }
  }
}

var keyPollingObject = new KeyPolling();
マルチメディアキーに対応するメモの続きになりますが、マルチメディアキーはウィンドウがアクティブでなくても反応して欲しいのでWindow.onKeyDownやLayer.onKeyDownは使えません。
Timerを使ってSystem.getKeyStateでも構いませんがここではContinuousHandlerを使っています。

この場合、onContinuousHandlerが呼ばれる合間にだけ一瞬キーを押して離すとメッセージが出力されません。
60fpsだとすれば16ミリ秒程度の短い合間なのですが、実際やってみるとたまにキー入力を無視されていらっとします。
低スペックPCだったり、コマンドライン引数でfps制限をかけたりするとさらに合間が長くなってまずいです。

逆にキーが押しっぱなしになっている場合、押している間ずっとメッセージが出力されてしまいます。
一度押されるごとに一度だけ出力したいです。


これらを解決するために第二引数を使います。
class KeyPolling
{
  function KeyPolling()
  {
    System.addContinuousHandler(onContinuousHandler);
    System.getKeyState(VK_MEDIA_STOP, false);
    System.getKeyState(VK_MEDIA_PLAY_PAUSE, false);
    System.getKeyState(VK_MEDIA_NEXT_TRACK, false);
    System.getKeyState(VK_MEDIA_PREV_TRACK, false);
  }
  
  function finalize()
  {
    System.removeContinuousHandler(onContinuousHandler);
  }
  
  function onContinuousHandler(tick)
  {
    if (System.getKeyState(VK_MEDIA_STOP, false)) {
      Debug.message("停止");
    } else if (System.getKeyState(VK_MEDIA_PLAY_PAUSE, false)) {
      Debug.message("再開/一時停止");
    } else if (System.getKeyState(VK_MEDIA_NEXT_TRACK, false)) {
      Debug.message("次のトラックへ");
    } else if (System.getKeyState(VK_MEDIA_PREV_TRACK, false)) {
      Debug.message("前のトラックへ");
    }
  }
}

var keyPollingObject = new KeyPolling();
onContinuousHandlerが呼び出される前にコンストラクタでSystem.getKeyStateを呼び出しているのに注意してください。
これを忘れると、最初のonContnuousHandlerでkeyPollingがnewされる前のキー入力を拾ってしまいます。

このようにすればキーが一度押されるごとに一度だけメッセージが出力されるようになります。

続きを閉じる▲

タグ : 吉里吉里 TJS

カテゴリ : 吉里吉里

マルチメディアキーに対応するメモ

再生、次のトラック、前のトラックなどのボタンがついているキーボードがありますが、それらのボタンも吉里吉里で扱えます。

ただし仮想キーコードが定義されていないようなので、自分で定義しておきます。
以下をoverride.tjsにでも書いておくだけで十分です。
const
  VK_BROWSER_BACK = 166,        // 戻る
  VK_BROWSER_FORWARD = 167,     // 進む
  VK_BROWSER_REFRESH = 168,     // 更新
  VK_BROWSER_STOP = 169,        // 中止
  VK_BROWSER_SEARCH = 170,      // 検索
  VK_BROWSER_FAVORITES = 171,   // お気に入り
  VK_BROWSER_HOME = 172,        // ホーム
  VK_VOLUME_MUTE = 173,         // 音量ミュート
  VK_VOLUME_DOWN = 174,         // 音量ダウン
  VK_VOLUME_UP = 175,           // 音量アップ
  VK_MEDIA_NEXT_TRACK = 176,    // 次のメディア
  VK_MEDIA_PREV_TRACK = 177,    // 前のメディア
  VK_MEDIA_STOP = 178,          // メディア停止
  VK_MEDIA_PLAY_PAUSE = 179,    // メディア再開/一時停止
  VK_LAUNCH_MAIL = 180,         // メール起動
  VK_LAUNCH_MEDIA_SELECT = 181// メディア選択
  VK_LAUNCH_APP1 = 182,         // アプリケーション1起動
  VK_LAUNCH_APP2 = 183          // アプリケーション2起動
  ;

あとは他のキーと同じようにonKeyDownやgetKeyStateなどで扱えます。
BGM鑑賞などで、次/前のメディア、メディア停止、再開あたりは対応しておくと便利かもしれません。

ちなみにconstというのはvarと全く同じです。
定数になってくれると嬉しいのですが残念ながらただの変数になります。

続きを閉じる▲

タグ : 吉里吉里 TJS

カテゴリ : 吉里吉里

「吉里吉里」と「かざぐるマウス」の相性問題

同人ノベルゲームやエロゲなどで広く使われている吉里吉里エンジンですが、かざぐるマウスと同時に使用すると問題があるようです。

マウスホイールがきかなくなったり、キーボードがきかなくなったりします。
ctrlキー、エンターキーやマウスホイールなどで読み進められないので、ノベルゲームとしては致命的にプレーしずらくなります。
ホイールでバックログを見ることすらできない・・・・・・。

とりあえずの回避方法ですが、かざぐるマウスの「マウスカーソルの位置に入力フォーカスをあわせる」のチェックを外してください。
オフにしてもそこまで困る機能ではない・・・・・・と思います。

kazaguru_krkr.jpg

タグ : 吉里吉里

カテゴリ : 吉里吉里

吉里吉里イベント発生順メモ

「onKeyDownとonKeyPress」や「onMouseDownとonClick」など似たような関数たくさんあるけど、どんな順番で呼ばれるの?というメモ。
前提:イベントシステムについて

まずは結果見てわかりそうなところ
・ウィンドウのactionは、ウィンドウ、レイヤの関数が呼ばれた直後に呼ばれる
ただしレイヤのonHitTestではactionは呼ばれない

・レイヤよりも先にウィンドウのアクションが呼ばれる
Window.onMouseWheelの後にLayer.onMouseWheelなど

・onHitTestは結構呼ばれまくる。
実際のイベントと1対1では対応しない
レイヤの上にマウス置いてるだけでも定期的に呼ばれます
Layer.enabledがfalseだろうが呼ばれます

・なんだか複雑でめんどくさい
呼び出し順に依存するロジックにはしない方が良さそう


以下実際に試した結果。
Window.actionは全て直前のイベントについての呼び出しです。

■レイヤにフォーカスがあるときにマウスホイールを回す
Window.onMouseWheel
Window.action
Layer.onMouseWheel
Window.action

■レイヤにフォーカスがあるときにキーを押す
Window.onKeyDown
Window.action
Layer.onKeyDown
Window.action
Window.onKeyPress
Window.action
Layer.onKeyPress
Window.action

■レイヤにフォーカスがあるときにキーを離す
Window.onKeyUp
Window.action
Layer.onKeyUp
Window.action

■レイヤ上でマウス左ボタンを押す
Window.onMouseDown
Window.action
Layer.onHitTest
Layer.onHitTest
Layer.onMouseDown
Window.action
Window.onMouseMove
Window.action
Window.onClick
Window.action
Layer.onHitTest
Layer.onClick
Window.action

■マウス左ボタンを離す
WIndow.onMouseUp
Window.action
Layer.onMouseUp
Window.action

■レイヤ上でマウスを動かす
Window.onMouseMove
Window.action
Layer.onHitTest
Layer.onMouseMove
Window.action

■レイヤAからレイヤBにマウス移動
Window.onMouseMove
Window.action
LayerB.onHitTest
LayerA.onMouseLeave
Window.action
LayerB.onHitTest
LayerB.onMouseEnter
Window.action
LayerB.onHitTest
LayerB.onMouseMove
Window.action
Window.onMouseMove
Window.action

■レイヤAにフォーカスがあるときにタブキーを押す(レイヤBへフォーカス移動)
Window.onKeyDown
Window.action
LayerA.onSearchNextFocusable
Window.action
LayerB.onBeforeFocus
Window.action
LayerA.onBlur
Window.action
LayerB.onFocus
Window.action
Window.onKeyPress
Window.action
LayerB.onKeyPress
Window.action

■レイヤ上でダブルクリック
Window.onMouseDown
Window.action
Layer.onHitTest
Layer.onHitTest
Layer.onMouseDown
Window.action
Window.onMouseMove
Window.action
Window.onClick
Window.action
Layer.onHitTest
Layer.onClick
Window.action
Window.onMouseUp
Window.action
Layer.onMouseUp
Window.action
Layer.onHitTest
Window.onMouseMove
Window.action
Layer.onHitTest
Window.onDoubleClick
Window.action
Layer.onHitTest
Layer.onDoubleClick
Window.action
Window.onMouseDown
Window.action
Layer.onHitTest
Layer.onHitTest
Layer.onMouseDown
Window.action
Window.onMouseMove
Window.action
Window.onMouseUp
Window.action
Layer.onMouseUp
Window.action


おまけで試すときに使ったコード。ScriptsEx便利
何かイベント起きるたびにコンソールに記録されていきます。
// プラグイン読み込み
Plugins.link("ScriptsEx.dll");

// ウィンドウとレイヤを生成
var win = new Window();
win.visible = true;
var parentLayer = new Layer(win, null);
parentLayer.setPos(006464);
parentLayer.fillRect(0064640xFF0000FF);
parentLayer.visible = true;
var childLayer = new Layer(win, parentLayer);
childLayer.setPos(003232);
childLayer.fillRect(0032320xFF000000);
childLayer.visible = true;


/**
 * イベント関連の関数をメッセージ出力するように上書きする
 * @param obj 上書きするオブジェクト
 * @param msg 出力するメッセージ
 */

function eventOverride(obj, msg)
{
  var keys= Scripts.getObjectKeys(obj);
  for (var i = 0; i < keys.count; ++i) {
    var key = keys[i];
    if (key.substr(0,2) === "on" && obj[key] instanceof "Function") {
      // 名前が"on"で始まる関数を上書き
      obj[key] = function(*) {
        global.Debug.message(msg, funcName, *); // メッセージと関数名、引数を出力
        orgFunc(*); // 元の関数を呼ぶ
      } incontextof %[ msg:msg, funcName:key, orgFunc:obj[key] ];
    }
  }
}
eventOverride(win, "Window:");
eventOverride(parentLayer, "ParentLayer:");
eventOverride(childLayer, "ChildLayer:");
// ウィンドウのactionもメッセージ出力するように上書き
win.actionTargetNames = %[ win => "Window", parentLayer => "ParentLayer", childLayer => "ChildLayer" ];
win.action = function(ev) {
  var target = ev.target;
  var type = ev.type;
  delete ev.target;
  delete ev.type;
  var args = [];
  args.assign(ev);
  global.Debug.message("Window:""Action", actionTargetNames[target], type, args*);
incontextof win;

続きを閉じる▲

タグ : 吉里吉里 TJS

カテゴリ : 吉里吉里

吉里吉里で256x256のアイコンを設定するメモ

吉里吉里で大きいサイズのアイコンを使ってみます。

■アイコンについて
吉里吉里デフォルトのアイコンはお魚ですが、ゲームごとにアイコンを変更できます。
そのアイコンですが、Windows XPでは48x48サイズまでですがWindows Vistaからは256x256サイズのアイコンも表示できます。

大きいサイズのアイコンも準備するとちょっと豪華に見えるので作ってみてもいいかもしれません。
large_icon_sample.jpg
(吉里吉里のお魚アイコンと256x256のアイコンを並べてみる)


実際にどんなサイズのアイコンを準備すればいいのか、以下のガイドラインの「Size requirements」の項目が参考になります。
http://msdn.microsoft.com/en-us/library/aa511280.aspx
英語で面倒ですがアプリケーションのアイコンサイズは「256x256, 64x64, 48x48, 32,32, 24x24, 16x16」となっています。
追加で「128x128, 96x96, 64x64, 40x40, 24x24, 22x22, 14x14, 10x10, 8x8」などもアリのようです。
さらに以下のURLを見ると、192x192, 128x128, 96x96, 72x72について実際に使われているゲームがあるようです。
http://green.ribbon.to/~erog/Note017.html


アイコンの色深度については前述のガイドラインで32-bit, 24-bit, 8-bit, 4-bitが言及されています。
余力があれば全て準備しておいたほうがいいのだと思います。


■アイコンファイルを作る
アイコンファイル(.ico)の作り方はここでは説明しません。
自分の場合は以下で配布されている『@icon変換』などで変換しています。
http://www.towofu.net/soft/
アイコンの作り方は検索すれば色々と出てきます。


■アイコンを設定してみる
吉里吉里ではアイコンを設定するのにkrkrconf.exeというツールが付属しています。
しかし使ってみると、サイズの大きいアイコンは設定できません。
icon_error.jpg
(大きいアイコンを設定しようとするとエラー)


ではどうするかですが、exeのアイコン変更ができる他のツールを使えばいいです。
ここではフリーの「Resource Hacker」を使ってみます。

以下からJapanese版をダウンロードします。
http://www.angusj.com/resourcehacker/

zip形式で圧縮されているので、解凍して「ResHacker.exe」を起動します。
メニューの「ファイル」>「開く」からアイコンを変更したいkrkr.exeを選びます。
開いたら「アクション」>「アイコンを置き換える」から作成したアイコンファイルを選び、置き換えます。
「ファイル」>「保存する」で保存すればOKです。
resource_hacker.jpg


あまり検証などしてませんが大丈夫だと思います。
何か問題などあれば教えてください。

続きを閉じる▲

タグ : 吉里吉里

カテゴリ : 吉里吉里

吉里吉里2/KAG3って何ぞや

吉里吉里とかKAGとかTJSとか色々あるけどなんなの?という話とかいろいろ。


まとめ
吉里吉里リファレンスから引用↓。
「吉里吉里2は、JavaとJavaScriptににたスクリプト言語であるTJS2を用いていろいろな事をやるためのソフトです。」

それじゃあTJSって何?となると今度はTJSリファレンスから引用↓。
「TJS2 は、アプリケーションへの組み込みを目的に開発された、オブジェクト指向のスクリプト言語です。」

それじゃあKAGって何?となると今度はKAGリファレンスから引用↓。
「KAG は Kirikiri Adventure Game の略です。吉里吉里でアドベンチャーゲームやノベルゲームを作るためのスクリプトです。」


これだけで理解できればこれ以上読む必要なっしんぐ。

吉里吉里
とりあえず吉里吉里の本体そのもの(krkr.eXe)はADVを作るためのものではないです。
自分が知ってる限り、吉里吉里製かつADV以外のゲームはSTG、RPG、音ゲ、タイピング、パズルゲなどがあります。
なにゆえADVが多いかというとKAGが存在するおかげです。がKAGの話は後回しにしてもうちょっと吉里吉里本体の話。

吉里吉里はC++という名前のプログラミング言語で作られています。
プログラミング言語というのはコンピュータに命令するために使う言葉です。
身近な例で言うとKAGスクリプトもプログラミング言語のひとつだと思います。

吉里吉里はオープンソースなので吉里吉里自体もC++が使えればカスタマイズできます。
残念ながら今は無料で手に入る開発環境が存在しません。多分。あったら教えてください。
カスタマイズではなく機能拡張することもできます。
吉里吉里プラグインというやつです。拡張子が.dllになってる奴がこれです。
こちらもC++が使えるなら自分で作ることができます。
今はncbindなんていう便利なものがあるので楽チンです。

ついでに吉里吉里2の2って何やねんというと、10年くらい前?に吉里吉里というのがあったんです。
今は吉里吉里2しか使われないので吉里吉里で問題ありません。
吉里吉里3というのも現在開発中ですがいつ完成するのかは知りません。そのうち出来るでしょう。


TJS
んで吉里吉里ですが、これはTJS2というプログラミング言語で制御することができます。
TJS2の2ですが、やっぱり昔TJSというのがあったんでしょう。こちらもTJSだけで通じます。
TJS自体は吉里吉里以外でも使えます。やり方はTJSリファレンスに書いてます。吉里吉里以外で実用している例はちょっと知りませんが。
このTJSを使うと吉里吉里を使ってSTGだったりRPGだったりが作れるわけです。
またついでになりますが、吉里吉里を制御するのにTJS以外のプログラミング言語も使えます。例としてJavaScriptやSquirrelが使えるようになる吉里吉里プラグインがレポジトリに転がってます。

んで、TJSはなかなか難しいです。C++と比較すればかなりマシですが。
勉強したい人は買うなりウェブで頑張るなりすればいいと思います。
ここで、TJSを使わなくてもなんとかするためにKAGというものが存在します。


KAG
KAGは吉里吉里でADVをつくるためのシステムです。
TJSを使って作られています。systemフォルダに入っているファイルが全部それです。
正確にはKAG3の3ですがこれもどうでもいいです。
KAGはKAGスクリプトを読んで、吉里吉里をいい感じに動かしてくれます。
KAGスクリプトというのは、普段.ksファイルに書いてるあれです。

KAGはTJSを使って書かれているので、TJSが使えるならKAGをカスタマイズできます。
カスタマイズではなく機能拡張することもできます。
KAGプラグインというやつです。このブログに置いてあるスライダープラグインもKAGプラグインです。
先ほどの吉里吉里プラグインとは異なります。
吉里吉里プラグインはC++で吉里吉里の機能を拡張します。
KAGプラグインはTJSでKAGの機能を拡張します。
単にプラグインと言われたら、どちらなのかちょっと注意する必要があります。
まあ拡張子が.dllだったら吉里吉里プラグインですね。


KAGEX
ついでにKAGEXって何?という話。
KAGEXは吉里吉里でADVをつくるためのシステムです。
TJSを使って作られています。KAGを大幅に改造してほぼ別物になってしまったものです。
先ほどのKAGを使わず、代わりにKAGEXを使う事もできます。
今回はKAGEXの話は主題ではないのでここまで。



無駄話が多くて分かりづらい話になってしまいました。
とりあえず吉里吉里とKAGの違いが何となく分かってもらえれば。
KAGはTJSで作られたADV用システムです。それで吉里吉里を制御しています。
実際にはKAGのことを吉里吉里と言っていることもあったりします。



参考リンク
吉里吉里/KAGの特徴を理解しよう

続きを閉じる▲

タグ : 吉里吉里 KAG TJS

カテゴリ : 吉里吉里

吉里吉里:レイヤ構造のダンプ

ゲ製吉里吉里スレの過去ログ読んでて気づいた。
shift+F12 → shift+F4でレイヤの情報が全部見れる。。。
いや知ってたけどね。そういえばそんなんあったなーみたいな。
そうは使わないけど知っててすぐ使えれば便利だよねうん。
(リファレンスにも書いてるよー)
ctrl+alt+F12で強制終了も地味に便利かも。

レイヤの名前つけてないとわかりづらいのでskn_sliderでも名前つけるようにしました。
次のバージョン出すのはもうちょっと改良してからにするけど……。


shiftf12.png

タグ : 吉里吉里

カテゴリ : 吉里吉里

吉里吉里とは

吉里吉里 (きりきり) は、TJS2 と呼ばれるスクリプト言語を記述することによって、主にマルチメディアタイトルを作成することができるフリー・オープンソースのソフトウェアです。 また、KAG を使うとノベル・アドベンチャーゲームを比較的簡単に作成することができます。

吉里吉里公式ホームページ(http://kikyou.info/)より

ゲームを作ったりちょっとしたアプリを作るのに使っています。多分始めて使ったプログラミング言語はTJS2。そこそこ慣れているので便利です。知らない方は各自検索してください。

このブログにいくつかプラグインなど置いておきたいと思います。

タグ : 吉里吉里

カテゴリ : 吉里吉里

最新記事
カテゴリ

openclose

記事一覧
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。