2011/09/16

ゲームループ

ゲームループはどこぞの教本では以下のようなコードになっている。


コンソールプログラムならこれで回し続けるのもいいと思う。
ではWin32アプリだとどうすればいいのか?
実験する前に予想を立ててみた。

Windowsアプリケーションの場合考えないといけないのは次の2点。


  • GetMessage~DispatchMessageでループを回さなければならないこと。

  • キーボード・マウス等の入力を受け付ける場合はWinProcでイベントを処理しなければならないこと。


これをソースコードで実現しようとするなら以下のような作りになるのではないかと考えた。

[cpp]
int WINAPI WinMain(...)
{
...

while( true )
{
if (GetMessage(&msg , NULL , 0 , 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

input();
update();
draw();

}

}

LRESULT CALLBACK WndProc(...)
{

switch( msg )
{
...

case WM_CHAR:
input_charevent(lParam);
case WM_PAINT:
draw_paintevent(hWnd);
break;
}

return DefWindowProc(...);



}
[/cpp]

もう少しオブジェクト指向っぽく書きたいなら、イベントを振り分け管理するEventManagerクラスでも作成し、
ウィンドウを作成する場合にEventManager内に実装したウィンドウプロシージャを登録し、
EventManager.AddListener()で登録したリスナーに対してメッセージを振り分け、
Input・Update・Drawクラス内でそれぞれ処理したいイベントに対して実装でもしてやればいい。


FPSの管理



FPSを管理する場合、予想したゲームループに対してsleepで調整してやればいい。
ただし、それでは入力が完全に止まってしまうか、直前のデータしか保持できないようになるので使い勝手がよくない。
下の処理ではWaitNextFrame内で前のdrawメソッド終了から16msec経過するのを待つ。
16msec以上待機していなければ待たずに抜け出してGetMessageから再び判定を行う。
また、CPU占有率対策のためにsleep(0)を挟み込む処理を行っている予定です。

[cpp]
int WINAPI WinMain(...)
{
...

while( true )
{
if (GetMessage(&msg , NULL , 0 , 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

input();
update();

if( WaitNextFrame(WAIT_16_MSEC) )
{
draw();
}

}

}
[/cpp]


ここでの課題はGetMessageかDispatchMessageの処理がどれぐらいの速度で戻ってくるのか未知数。
そのため、ここでFPS管理しようとすると処理速度が遅くなる可能性がある。

2011/06/02

著作権についての調査メモ

同人・商業に関わらず、イラストレーターにイラストを発注し、それを各種メディアに利用することは多いと思う。
同人系の人はほぼ趣味でやっているせいなのか、著作権についてはほぼ何も意識しないでで依頼して上がってきたイラストを各種媒体に使用しているようにも見受けられるが、これは著作権についてイラストレーターときっちりフォローしておかないと後々問題になりかねない結構危険なことだと調査の次第で発見した。

(ここでのイラストレーターは法人に所属せず、フリーで活躍しているイラストレーターを対象とし、外注契約としてイラストを製作しているケースを対象としています)

また、筆者は法律の専門家でもなければイラストレーターでもありません。イラストを発注する場合に注意すべきことを調べたら著作権について勉強する羽目になったのでこのコラムはその備忘録という位置づけになります。
そのため、このコラム内容の正確性は保証されません。著作権の紹介と個人的な主観が入った予想が一部含まれます。正確性が必要であれば、その他法律の専門家による見解が書いてあるページを参照してください

2011/03/10

ブラウザーゲーム開発のための事前調査

ブラウザゲームおよびネットワークゲームを作るために必要な基礎知識を調べてみた。
まだ実装まで試したわけではないので、何らかの足りない情報、間違っている情報が含まれているかもしれないので注意。

2011/03/03

VC++&MSXMLによるXML操作2




XMLの読込み第2回目


お題目は「C++からMSXMLを初期化、XMLを読み込む」です。

VC++&MSXMLによるXML操作1

#この記事は昔の自blogの記事の転載です。

XMLパーサーの紹介


XMLを使用するためにある既存のパーサーは何通りかある。

  1. MSXML(Microsoft)

  2. Xerces(Apache)

  3. TinyXML

  4. XMLite

本投稿ではMSXMLを利用してXMLを操作していく。