ブログ移転します
新URL : http://www.biscrat.com/blog/
このブログは残しておきますが新しい記事は書きません。
RSSなど購読している方は変更よろしくお願いします。
カテゴリ : 雑記
System.getTickCountのオーバーフロー
結果としてはしないっぽい。
それがオーバーフローするとTVPTickCountBiasに記録され、System.getTickCountで得られる値には64bitになっています。
ということで吉里吉里を100年つけっぱなしでも特に問題ないようです。
カテゴリ : TJS
tjsで循環参照とか
循環参照があるとメモリリークします。
詳細は参照カウント、循環参照などで検索してください。
tjsを使っていると結構簡単に起きます。
吉里吉里製のゲームをずっと起動していると使用メモリがどんどん増えていったりします。
例えば以下の短いコードでもメモリリークします。
var t = new Timer(this);
}
for (var i = 0; i < 10000; ++i)
var obj = new C();
Cをnewしたら明示的にinvalidateしなければなりません。
カテゴリ : 雑記
隠れ機能メモSystem.exitOnNoWindowStartup
trueのとき、最初のスクリプト実行中にWindowが生成されなければそのまま終了します。
falseのときは終了せずプロセスに残ります。
デフォルトではtrueです。
これまで使ったこともなく、これからも使いそうにありません。
System.exitOnWindowCloseにちょっと似てます。
カテゴリ : 吉里吉里
tjsで名前空間を使うメモ
コンテキスト指定ができるのは開発版のみです
参考:吉里吉里安定版と開発版の違いメモ
Plugins.link("ScriptsEx.dll"); // Scripts.getObjectContextを使う
class Namespace {} // ネームスペースとして使うクラス
Scripts.execStorage("a.tjs",,Namespace);
Scripts.execStorage("b.tjs",,Namespace);
Debug.message("new Namespace.A()");
var a = new Namespace.A();
Debug.message("new Namespace.B()");
var b = new Namespace.B();
Debug.message('a instanceof "Namespace.A" == ' + (a instanceof "Namespace.A"));
Debug.message('a instanceof "A" == ' + (a instanceof "A"));
Debug.message('Scripts.getClassNames(a).join(", ") == ' + Scripts.getClassNames(a).join(", "));
Debug.message('Scripts.getClassNames(b).join(", ") == ' + Scripts.getClassNames(b).join(", "));
if (Scripts.getObjectContext(this) != Namespace) { throw new Exception(); }
class A {
function A() { Debug.message("A()"); }
}
if (Scripts.getObjectContext(this) != Namespace) { throw new Exception(); }
class B extends Namespace.A {
function B() { super.A(); Debug.message("B()"); }
}
コンテキストにNamespaceを指定しているので、AとBはNamespaceの中で定義されます。
a.tjsとb.tjsではScripts.getObjectContextを使ってNamespaceコンテキストで呼ばれているかチェックしています。
ミスがないようにチェックしているだけなので無くても動きます。
あとはNamespace.AやNamespace.Bで使えます。
ただしinstanceofでは"Namespace.A"ではなく"A"となります。
少し面倒なのでinstanceofの代わりに適当な関数を作ってもいいかもしれません。
このスクリプトを実行すると、Debug.messageの出力は以下のようになります。
A()
new Namespace.B()
A()
B()
a instanceof "Namespace.A" == 0
a instanceof "A" == 1
Scripts.getClassNames(a).join(", ") == A
Scripts.getClassNames(b).join(", ") == B, A
実際はこんなことをせずにNamespace_Aのようなクラス名にしてしまうのがいいと思います。
カテゴリ : TJS
KAGEXの表情欄についてメモ
その欄には名前欄に指定されたキャラクタの立ち絵が表示されます。
http://www.biscrat.com/krkr/files/face_sample.zip
サンプルを見て以下の説明を読むと大体わかると思います。
表情欄を使用するには以下の4つのことが必要です。
1.envinit.tjs で characters を定義
2.envinit.tjs の positions で出, 立, 顔, 消, 無を定義
3.envinit.tjs で faceLevelName を定義
4.[position]タグで表情欄の位置を指定
1.envinit.tjs で characters を定義
まずは立ち絵が表示できる状態にしてください。説明は省きます。
ブログ内のKAGEX講座などを参考にしてください。
2.envinit.tjs の positions で出, 立, 顔, 消, 無を定義
サンプルに入ってるenvinit.tjsのpositionsをコピペして使います。
出, 立, 顔, 消, 無のコマンドを使って、立ち絵と表情欄の表示/非表示の状態を切り替えます。
立ち絵の表示/非表示はshow/hideコマンドを使っても変更できますが、こちらのコマンドを使う方が便利です。
出:立ち絵を表示します。このキャラクタを表情欄に表示するようになります。
立:立ち絵を表示します。このキャラクタを表情欄に表示しなくなります。
顔:立ち絵を非表示にします。このキャラクタを表情欄に表示するようになります。
消:立ち絵を非表示にします。このキャラクタを表情欄に表示しなくなります。
無:立ち絵を非表示にします。このキャラクタを表情欄に表示しなくなります。
消と無の違いについては説明しません。消を使っていれば問題ありません。
@しおり 通常 夏制服 喜 出
; "しおり"が名前欄に指定されているので表情欄にしおりの画像が表示される
【しおり】「しおりのセリフ」
; 名前欄が指定されていないので表情欄にも表示されません
地の文。
; "しおり"が名前欄に指定されているので、ここでも表情欄にしおりの画像が表示される
【しおり】「しおりのセリフ2」
; 立ち絵は表示されたままだが、表情欄には表示されない
@しおり 立
【しおり】「しおりのセリフ3」
; 立ち絵は非表示、表情欄にのみ表示
@しおり 顔
【しおり】「しおりのセリフ4」
3.envinit.tjs で faceLevelName を定義
立ち絵の表示レベルについてまだ説明していないため、いい加減な説明だけします。
何のことかわからなければサンプルのfaceLevelNameの行をコピペすればいいです。
これがないと表情欄には何も表示されません。
前提として、立ち絵定義の image, faceImage について現在の表示レベルに合わせて"LEVEL"の部分が置換され、立ち絵として表示される画像のファイル名が決まります。
立ち絵ではなく表情欄の画像の場合、"LEVEL"はfaceLevelNameの定義と置換されます。
これによって表情欄用の特別な画像を使うこともできます。
4.[position]タグで表情欄の位置を指定
[position]タグではメッセージレイヤや名前欄の位置、サイズなどを指定できます。
これに加えて、表情欄の位置とサイズも指定できます。これにはfacewidth, faceheight, faceorigin, faceleft, facetopという5つの属性を使います。
まず facewidth と faceheight で表情欄のサイズを指定します。それぞれ幅と高さです。
立ち絵の画像が読み込まれ、このサイズの領域に表示されます。
以下の例では赤色の枠が立ち絵画像のサイズで、黄色の枠が表情欄のサイズになっています。
表情欄に表示されるのは黄色の枠の内側のみです。
このように、表情欄が画像のサイズより小さい場合は左上部分が切り取られて表示されます。

次に、 faceorigin で表情欄の表示原点を指定します。0~8の数値が指定できます。
表示原点は表情欄上の座標です。次に説明する faceleft と facetop との関係で表情欄の位置を決定します。
0~8でそれぞれ以下の画像の位置になります。
0が表情欄左上、1が表情欄上中央、・・・・・・と時計回りに回って、最後の8が表情欄中央となります。

最後に、 faceleft と facetop で表情欄の位置を指定します。
メッセージレイヤ左上からの距離を指定します。
ここで指定した位置が、先ほど faceorigin で指定した表示原点の位置となります。
下記の画像は"faceorigin=5"のときの例です。

faceleft と facetop は同じでも "faceorigin=7"とすれば以下のようになります。

カテゴリ : KAGEX
吉里吉里でwindows8対応する話
少しでもWindows8を意識するなら安定版(version 2.32 revision 2)を使ってはいけません。
安定版はWindows8が出る前の古すぎるバージョンなので修正されていないバグなどがあります。
吉里吉里本体(krkr.eXe)なら以下のURLから簡単にダウンロードできます。
https://sv.kikyou.info/svn/kirikiri2/trunk/kirikiri2/bin/win32/
開発版を使う場合はwuvorbis.dllやkrmovie.dllなどのdllも本体に合わせたバージョンを使いましょう。
先ほどのURLからダウンロードできるものを使えばOKです。
「plugin/」の中に入っているものもありますので必要なものをダウンロードしておきましょう。
逆に安定版を使っている場合はリポジトリからダウンロードしても使えない場合があります。
最新のdllプラグインや吉里吉里の機能が使えないのはとっても損ですね。開発版を使いましょう。
好んで安定版を使う理由はありません。
なおKAGの[quake]のバグは現在の安定版/開発版どちらでも発生します。
こちらも待っていれば開発版では修正されるかもしれません。
◆関連記事
windows8でquakeを使うとバグるらしい
吉里吉里安定版と開発版の違いメモ
タグ : 吉里吉里
カテゴリ : 雑記
windows8でquakeを使うとバグるらしい
吉里吉里2とWindows8での問題。Win8 x64・HD4000・仮想フルスクリーンで「画面揺れ(quake)」させると画面外(黒帯部分)にはみ出した画像が残ったままになる。同一H/WでOSのみWin7 x64だと現象が発生しないのを確認。
— ないしょさん (@Naisy0) 2013年3月22日
ということで試したら再現しました。
Window.setLayerPosを使うと画面外にはみでで表示残っちゃいます。
KAGでは[quake]させるとまずいようです。
KAGEXではsetLayerPosを使っていないので問題ありません。
続報→http://www.biscrat.com/blog/?p=11
// 吉里吉里 2.31.2012.1127
// 全面赤色のレイヤとウィンドウを表示
var win = new Window();
win.layer = new Layer(win, null);
win.layer.setSize(800, 600);
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;
カテゴリ : 吉里吉里
吉里吉里の署名を一気に付けるメモ2
setlocal
if "%~1"=="" goto HELP
set PRIV="%~dp0秘密鍵.txt"
set SIGN="%~dp0krkrsign"
:REPEAT
if exist "%~f1\" (
for /R "%~f1" %%I in (*) do %SIGN% -sign "%%I" %PRIV%
) else if exist "%~f1" (
%SIGN% -sign "%~f1" %PRIV%
)
if "%~2"=="" goto END
shift
goto REPEAT
:HELP
echo 署名を付けるファイルを指定してください。
:END
endlocal
同じフォルダには「krkrsign.exe」と、使用する秘密鍵を貼り付けた「秘密鍵.txt」も置いておきます。
あとはファイルを「署名.bat」にドラッグ&ドロップすればすべて署名されます。
フォルダをドロップすれば中身が全て署名されます。
複数ファイルを一気にドロップできるのでなかなか使いやすくなりました。
タグ : 吉里吉里
カテゴリ : 雑記
C83 冬コミ情報
私個人は一般参加なので3日目同人ソフトや企業ブースのあたりをふらふらしている予定です。
催眠、MC(マインドコントロール)系の男性向け18禁エロゲ。
幼馴染みの女の子またはお姉ちゃんに催眠術をかけて性的なイタズラができます。
絵も声もかわいい。そしてとってもエロいです。催眠術すごい。夢があります。
また新たなジャンルに目覚めてしまいました。
シナリオは普段から催眠音声などを書いている方らしく本格的っぽいです。
知識ないので何とも言えませんが色々あるようですね。
ブログで体験版も上がっているので要チェック。
システムはまあ普通です。特別には何もありませんが必要な機能はついています。
■granat様、すり替えられた果実の破片(3日目東U-02b)

幽明心理ADV。15歳以上向け。ループ物。"海の街"の三日間から抜け出します。
システム提供のみで全体の内容をまだちゃんと把握しておらずコメントしづらいのですが。
とにかく分岐分岐分岐。
最初に仕様もらってちょっと笑いました。これどうやってクリアするの?
今はそこから仕様削ってとても簡単になっていますが、それでも非常に難しいです。
granatさんのゲームは同人ノベルで一番難しいなんて言われてましたがまさにですね。
前回の夏コミで出した体験版もダウンロードできるので是非。
一周目のみでまだ難しいも何もないのですが、シナリオには興味もってもらえると思います。おもしろいです。
システムはミチユキ画面など地味に面倒なことをやっているのですがここでは省略。
機会があれば紹介するかも?
■とらいあんぐる!様、Triagain(3日目東T-55a)

男性向け18禁純愛ノベル。ボーイミーツガール。3キャラ攻略可。
かわいく綺麗にまとまってます。
絵、音、シナリオとも高品質に仕上がっていると思います。
強い癖もないので安心して遊べるのではないでしょうか。
まずは体験版をどうぞ。
今回はトラブルが発生したようで修羅場ってましたね。
間に合わないんじゃ無いかと思いきや一気呵成に完成しました。
システムはいつも通り、それなりに便利だと思います。
このくらい完成度上がってくるともう一歩付けたい機能もあるのですがそこまで手が及ばず。
とりあえず任意点ジャンプは早急に対応ですなー。
クイックジャンプ、バックジャンプなど名前は定まっていないようですが、あるのに慣れてしまって無いシステムが気になるように。
3作品とも全く別方向なようですがそれぞれ面白いです。
コミケ参戦される方はぜひスペースの方に寄ってみてください。
よろしくお願いします。
カテゴリ : 告知
吉里吉里の署名を一気に付けるメモ
ファイル破損チェックツールを使うには必須ですが、ファイルが増えると署名を付けるのも面倒なので一気につける方法です。
krkrsign.exeがあるのと同じフォルダに、『署名.bat』を新規作成し、テキストエディタで開きます。
開いたら以下の一行をコピペして保存しておきます。
for /R %1 %%I in (*.exe, *.xp3, *.dll, *.tpm) do %~dp0krkrsign -sign "%%I" %~dp0"秘密鍵.txt"
次にkrkrsign.exeを通常通り起動して、公開鍵と秘密鍵を生成します。
生成された秘密鍵の方をコピーして『秘密鍵.txt』を新規作成、コピーした鍵の内容を貼り付けて保存しておきます。
この『秘密鍵.txt』は『署名.bat』と同じフォルダにおいておきます。
あとは署名を付けたいファイルが入ったフォルダを『署名.bat』にドラッグ&ドロップするだけです。
『秘密鍵.txt』に書かれた秘密鍵を利用して、ドロップされたフォルダ内のファイルに署名が付けられます。
ただし、署名が付けられるのは拡張子がexe, xp3, dll, tpmのファイルのみになります。
ファイルが破損することは滅多にありませんが、皆無ではなくたまにあります。
インストールしたのに動かない、というときには必要になるので、ファイル破損チェックツールと署名はしっかりゲームに同梱しておくことをオススメします。
タグ : 吉里吉里
カテゴリ : 雑記
MysticThumbs用TLGプラグイン
MysticThumbsを使って吉里吉里のTLG画像をサムネイル表示出来るようになるプラグインです。
https://github.com/sakano/MysticThumbsTlgPlugin
MysticThumbsを使うとエクスプローラ上でPhotoshopやIllustratorその他いろいろなファイルがサムネイル表示出来るようになります。
このプラグインを入れればtlgも表示出来るようになります。
↓エクスプローラでサムネが見れます。便利

MysticThumbs自体は有料で25ドルほどかかりますが、それだけの価値はあるかと思います。
プラグイン自体はphotoshopプラグインサンプルに入っている、libtlgを使ってtlg読み込んで表示しているだけです。
簡単にtlg読み書きできるので、そこらへん必要な人にはlibtlgもおすすめです。
カテゴリ : プラグイン配布
System.getKeyStateの隠れ機能メモ
System.getKeyState(code, getcurrent=true)
code:状態を取得する仮想キーコード
getcurrent:現在の状態を取得するか
第二引数を省略するか、trueのときはSystem.getKeyStateを呼び出した瞬間にキーが押されていればtrue、押されていなければfalseが返ります。
第二引数をfalseにすると、前回同じキーコードでSystem.getKeyStateを呼び出したときから、今回の呼び出しまでの間に1度でもキーが押されていればtrueになります。
そんなに使うことはないと思っていたのですがContinuouseHandlerでキー取得するには必須でした。
{
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();
Timerを使ってSystem.getKeyStateでも構いませんがここではContinuousHandlerを使っています。
この場合、onContinuousHandlerが呼ばれる合間にだけ一瞬キーを押して離すとメッセージが出力されません。
60fpsだとすれば16ミリ秒程度の短い合間なのですが、実際やってみるとたまにキー入力を無視されていらっとします。
低スペックPCだったり、コマンドライン引数でfps制限をかけたりするとさらに合間が長くなってまずいです。
逆にキーが押しっぱなしになっている場合、押している間ずっとメッセージが出力されてしまいます。
一度押されるごとに一度だけ出力したいです。
これらを解決するために第二引数を使います。
{
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();
これを忘れると、最初のonContnuousHandlerでkeyPollingがnewされる前のキー入力を拾ってしまいます。
このようにすればキーが一度押されるごとに一度だけメッセージが出力されるようになります。
カテゴリ : 吉里吉里
マルチメディアキーに対応するメモ
以下をoverride.tjsにでも書いておくだけで十分です。
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と全く同じです。
定数になってくれると嬉しいのですが残念ながらただの変数になります。
カテゴリ : 吉里吉里
吉里吉里を簡単に再起動する方法
いちいち既に起動している吉里吉里を終了して、起動しなおすのは面倒です。
windowsのバッチファイルを使って簡単に再起動できるようにしてみます。
バッチファイルの内容は参考リンクそのままです。
バッチファイルというのは拡張子が.batのファイルで、windowsのコマンドを自動実行することができます。
今回は吉里吉里本体の再起動するためにコマンドを使います。
吉里吉里本体(krkr.exe)とKAGのプロジェクトフォルダ(dataフォルダ)は同じフォルダにあることが前提です。
そのフォルダに新しく「再起動.bat」ファイルを作成して、テキストエディタで開いて以下のコマンドを書きます。
tasklist | findstr "krkr.exe"
if errorlevel 1 goto START
if errorlevel 0 taskkill /f /im "krkr.exe"
:START
start "" "krkr.exe"
テキストエディタのマクロやショートカットなどに登録しておくと便利かと思います。
簡単に解説すると、「tasklist | findstr "krkr.exe"」でkrkr.exeが起動しているか調べています。
「if errorlevel 1 goto START」では、起動していない場合に「:START」の行までジャンプします。
「if errorlevel 0 taskkill /f /im "krkr.exe"」で、起動していた場合にkrkr.exeを強制終了します。
最後の「start "" "krkr.exe"」でkrkr.exeを起動しています。
もし「krkr.exe」の名前を「ゲーム名.exe」と変更しているのであれば、3つある"krkr.exe"を全て"ゲーム名.exe"」と書き換えます。
また、プロジェクトフォルダについてです。
吉里吉里本体と同じフォルダに"data"フォルダがあれば、自動的にプロジェクトフォルダとして読み込まれます。
ない場合は「フォルダ/アーカイブの選択」ウィンドウが出てきてめんどくさいです。
プロジェクトフォルダは"data"フォルダとして置いておくのを推奨しますが、何らかの信念があって他の場所にプロジェクトフォルダを起きたい場合、バッチファイルでそのプロジェクトフォルダを指定できます。
例えばプロジェクトフォルダが「C:\krkr\project」フォルダなら、最後の「start」のコマンドが「start "" "krkr.exe" "C:\krkr/project"」のようになります。
解説はここまで。残りは再起動について補足なので上記のバッチファイル使うだけなら読まなくても大丈夫。
先の方法だとtaskkillで強制終了しているのでセーブデータが書き出されなかったりして問題あったりします。
実際は開発中ならそれほど困らないと思います。
/fをはずすと通常の終了になりますが、終了確認ダイアログがでてきて嬉しくありません。
正しく動作させるならKAGに手を入れて確認ダイアログを飛ばすようにするといいかもしれないですね。
それなら通常終了でセーブも大丈夫な気がします。
もっと頑張るなら再起動時のみ確認ダイアログ省略するように?
既存のmessenger.dllあたり使うと比較的簡単にできそうです。
通信させる必要があるのでちょっと面倒ですが。
普段はデバッグモードで起動させておいて、デバッグモード時のみダイアログ飛ばすようにする、くらいがちょうど良さそうです。
そもそも開発中に再起動する事自体が無駄なので、そこから何とかしたいですね。
現状のKAGEX/KAGEZレベルでも再起動が必要になる場面はほとんどありません。
カテゴリ : KAG