2008年7月31日木曜日

マスタリングDirectXを読んでみた3

0 コメント


PART7 ユーザからの操作を受け取る(DirectInput)(23:00)


これも会社と電車で読み終わってしまった。


内容を簡単にまとめてみる。




  • DirectInputは、DirectXのなかでももっとも取り扱いが簡単

  • DirectInputの入力方法


    • 直接入力。シューティングゲームなどに向いている。

    • バッファード入力。RPGなどリアルタイム性でないもに向いている。




利用手順



  • 初期化


    • DirectInputオブジェクトの生成

    • CreateDiveceメソッドに入力機器の種類を指定して、データを受け取ることができる状態にする。



  • データ読み取り


    • SetDataFormatメソッドに入力機器に合わせたデータフォーマットを指定し、データを受けとる準備をする。

    • GetDeviceStateメソッドでデバイスからのデータを受け取る。

    • Acquireメソッドでデバイスを取り戻す。



  • 開放


    • 使用していたデバイスをUnacquireメソッドで停止

    • DirectInputデバイスコネクタを開放

    • DirectInputオブジェクトを開放




キーボードとマウス



  • マウスもキーボードも処理の流れはほぼ同じ。

  • 注意点としては、マウスの座標データは絶対座標ではなく、相対座標。


ジョイパッド



  • EnumDevicesメソッドでジョイパッドの数を数える。このメソッドにコールバック関数を渡し、パッド単位でデバイスを作成していく。

  • EnumObjectsメソッドでジョイパッド上のオブジェクト(方向キー、ボタンなど)を数え、コールバック関数を呼び出す。











PART8 効果音を追加する(DirectSound)(23:30)


バッファ


プライマリバッファ

最終的な音の状態を保持するバッファ。スピーカにつながっていると考えてよい。

セカンダリバッファ

音声を収めておくバッファ。



WAVファイル

WAVファイルを読み込むためには、DirectSoundが読み出してくれるわけではなく、直接関係ない、マルチメディア入出力関数を使用しなくてはならない。


処理手順



  • 初期化


    • DirectSoundデバイスを取得する。

    • DirectSoundの協調レベルを設定する。

    • CreateSoundBufferメソッドを使ってプライマリバッファを取得する。

    • プライマリバッファのフォーマットを指定し、SetFormatメソッドでプライマリバッファに適用する。

    • QueryInterfaceメソッドでプライマリバッファから3Dリスナーインターフェースを取得する。



  • WAVファイルの読み込み


    • mmioOpen関数を使って開き、WAVファイルに収められている波形データのフォーマットを確認する。

    • セカンダリバッファを作成し、波形データのフォーマットと同じ形式にする。

    • WAVファイル内の波形データを読み込む準備をする。

    • WAVファイル内の波形データをセカンダリバッファへ読み込む。



  • 音声の再生


    • GetStatusメソッドを使って指定された音声バッファが再生可能かどうか確認する。

    • 再生可能であればPlayメソッドで再生する。



  • 開放


    • バッファに関する構造体を開放する。

    • DirectSoundオブジェクトを破棄する。





マスタリングDirectXプログラミング

マスタリングDirectXプログラミング










2008年7月29日火曜日

マスタリングDirectXを読んでみた2

0 コメント


PART6 ウィンドウとモデルの表示(Direct3D)...続き(23:30)


昨日は飲み会の次の日ということで一日ダウン。日曜日がつぶれた。。。


しかしPart6の残りの部分は電車の中と会社の休み時間でほとんど読み終えたのだった。


ビルボードの表示

ビルボードの角度を決める処理。キモの部分



// ビルボードがカメラの方向を向くようにする
D3DXVECTOR3 vecDir = gLookatPt - *camPos; // 視線
D3DXMatrixRotationYawPitchRoll( &theRotMatrix , 0.0f , -atanf( vecDir.y / vecDir.z ) , 0.0f );


ピッチ(X軸の角度)をカメラの向きから計算している。角度で出してもいいけど、カメラ行列からうまく抜き出せば計算もいらないし、お得なはず。自分が作るときはそうしよう。


レンダリングステート

レンダリングステートは描画物ごとにパターンがある程度きまってくるので、そのパターンごとに自分で設定関数を用意しておく。


そのパターン




  • モデル描画時

  • アルファつき描画、画面情報描画

  • 加算合成描画


の3パターン。


フルスクリーン

フルスクリーン時のデバイスロスト対応だが、CreateBertexBufferメソッドなどで使われているD3DPOOL_MANAGEDを使用すればすべての管理をD3Dがやってくれるので、復帰処理も超簡単になる。具体的にはDevice->Restメソッドを呼ぶだけでよい。そうか昔の俺はこの機能を使っていたんだな。


ここまでの所感。

なんかソースコードがよろしくない。構造体にtheModelsとつけてるのに関数の引数にもtheArgという具合にtheをつけてる。かと思えばaArgとaを冠したところもあり、ネーミングルールが変。単数形しか扱わないのに、複数形の名前がついてるし。初心者を相手にしてるんだからこの辺は気をつけてほしかったな~。まつもとゆきひろも「名前重要」っていってることだし。


昔やってたことだけあって、特別理解できないというところはない。簡単な表示くらいだったらすぐできそうな気がする。とりあえずいくつかサンプル組んだらochaglを移植するか。しかし問題はC++だよな。これ読み終わったらじっくり復習しよう。


ところでD3DXVECTOR3はクラスなんだっけ?NormalizeやLengthもメンバ関数ではなく、通常の関数と用意されている。これはなんだか嫌なので、コーディング段階に入ったら、D3DXVECTOR3を継承してラッピングするか自作しよう。


(ここまで23:55)



マスタリングDirectXプログラミング

マスタリングDirectXプログラミング










2008年7月26日土曜日

マスタリングDirectXを読んでみた

0 コメント


PART1 はじめに(10:00)


DirecXが世間一般にどうとらわれてるか書かれている。


あとソースをプリントアウトしたほうがいいとある。うんこれは納得。仕事でもよくプリントアウトして紙に出して読むよ。書き込みながらね。そんで検索とかは画面のエディタ使いながらとか。





初めてDirecXやった2とか3のころは確かに、すぐにハングアップして再起動しまくりだったけど、DirectX7あたりから大分扱いやすくなった気がするな~。しかしそれでもやっぱり普通のプログラミングに比べたらハングすることが多いしやっぱ敷居高いんだろうな。





「SDKのアップデートは慎重に」とある。BugFixとかでも、微妙に関数の引数が入れ替わって動かなくなることもあるらしい。やっぱライブラリでラッピングする必要があるか?


PART2 DirectXとはなんなのか?(10:10)


DirectXは大変だよとう脅し?見たいな感じ。覚悟してねみたいなw


DirectXとGDIの違い


GDI

CPUメインで描画。各グラフィックボードの共通の描画機能のみを使うため、ボードごとの差異がない。

DiretX

ドライバを直接操作して描画。CPUを使わない。ある機能がない場合はエミュレーション(HEL)する。



11:00 - 11:00 部屋かたづけ


PART3 クラスを知ろう(11:20)


クラスは大変だよって話。クラスについては散々ならしてるから基本は大丈夫だな。


しかしクラスは難しい難しいって若干大袈裟な気もする。


インスタンスで確保される領域はメンバ変数のみ。メンバ関数のコード量が多くてもメモリ使用量は増えない。言われてみれば当たり前のことだが、しばらくCやってないとメモリまわりのこと気にしないからこんなことも忘れかけてる。。。


C++で記述するときのメリットデメリット。


変数初期化時はNULLを代入すること。javaでは自動的に初期化されるからこの慣習忘れてたなぁ。気をつけよう。


次章からやっとDirectXの本題だ^^





PART4 思いつきに形を与えるために(11:55)


DirectX始まると思ったらまだ始まらないw。ゲームを作るうえでの心構えでした。




  • 現在はさまざまなゲーム開発の知識が散乱している

  • これらを寄せ集めればなんとがゲームが開発するよ

  • でも自分プログラムの中でこれらを活用できるようになるまでには多大な労力が必要だよ。

  • これらの情報は「いつか必ず役に立つ情報」としてストックされる。

  • 結局、それらの情報を活用できずにプログラムに飽きることが多い。


見たいな感じ。そのとおりですね。反省します。




  • 頭の中だけで思い描いて開発始めても多くの場合失敗する

  • まずは頭の中の設計図を紙に書こう!パソコンじゃないよ。

  • ゴールをこまめに設定する。いきなり市販ゲームクオリティは無理


たしかに趣味プロでは、頭の中だけでまともに書き出すことは少なかった気がするな。これも反省だわ。


PART5 最小限のDirectXアプリケーション(12:25)


CreateDeviceメソッドの話


CreateDevice(
D3DADAPTER_DEFAULT, // シングルモニタの場合、これで決まり
D3DDEVTYPE_HAL, // HALを使うよ
hWnd, // ウィンドウハンドル
D3DCREATE_HARDWARE_VERTEXPROCESSING, // フラグ
&g_D3DPParamas, // デバイス初期化のパラメータ
&g_pD3DDevice // 生成したデヴァイスを格納するための変数
)




  • &g_D3DPParamasで指定したパラメータは後から変更できない。たとえば色深度などがそう

  • ウィンドウモード実行中のアプリでコンパネから色深度変更した場合でも、アプリの色深度はかわらない。

  • ウィンドウをリサイズしても、描画領域の画像サイズは変更されない


BeginSceneとEndSceneメソッド



  • BeginSceneメソッドを呼び出すと、DirectXアプリ以外のアプリ(スレッド)がいったん動きを止めるらしい

  • その動きが止まってる間に描画処理を実行する

  • ちなみにその描画処理はバックバッファに対して実施される

  • で、終わったらEndSceneを呼び出す。これでほかのアプリ(スレッド)が再開される


これは知らなかった。


フルスクリーンモードの話



  • フルスクリーンにするにはいったんデバイスを開放しなくてはならない。

  • その後、もう一度モデルやテクスチャを再確保する必要があり、かなり面倒

  • できれば、ソースコード上のフラグ定数などで静的に切り替えるのが、バグを抑えるという意味でお勧め

  • もしくはプログラム起動後に、タイトル画面などでモードをユーザに選択させるなど。


ALT+Enterでの切り替えはやめたほうがいいかな。でも昔作ったプログラムはALT+Enterで動的に切り替えてた気がする。。。


PART6 ウィンドウとモデルの表示(Direct3D)(13:30)


カメラの設定


D3DXMatrixPerspectiveFovLH( &matProj,
D3DX_PI/4, // 視野角
tmpAspect,// アスペクト比
1.0f, // 最近接距離
800.0f ); // 最遠方距離



アスペクト比

よこ/たて。忘れてたな。

視野角

2PI=360度。PI=180度。だからD3DX_PI/4は45度。復習復習。

最短距離、最長距離

Zバッファの0は最短。1は最長。



メッシュの表示


D3DXLoadMeshFromX(filename // ファイル名
D3DXMESH_SYSTEMMEM, // メッシュを作成するときのオプションフラグ
theDevice, // デバイス
NULL, // 隣接製データをうんたらかんたら。よくわからん
&pMaterials, // マテリアル配列を受け取るためのポインタ
NULL, // エフェクト配列のためのポインタ
&(aModels->objNumOfMaterials), // マテリアル配列の数
&(aModels->objMesh)) // 受け取るメッシュオブジェクトへのポインタ


この関数を使って、マテリアル情報を取得し、マテリアルとテクスチャ情報をコピーして使いまわす。


モデルの表示部分。マテリアルごとにDrawSubsetを呼び出す。



VOID drawMesh( LPDIRECT3DDEVICE9 theDevice, int objNum )
{
SetupObjMatrixMulti( theDevice , objNum ); //オブジェクトの表示用行列を設定
int theType = g_Object[objNum].MdlType; //オブジェクトのモデルの種類

// マテリアルの数だけループ
for(DWORD j0=0; j0 < g_ObjModels[theType].objNumOfMaterials ; j0++ )
{
// サブセットにマテリアルとテクスチャを設定。
theDevice->SetMaterial( &(g_ObjModels[theType].objMeshMaterials[j0]));
theDevice->SetTexture( 0, g_ObjModels[theType].objMeshTextures[j0] );

// メッシュ・サブセットの描画。
g_ObjModels[theType].objMesh ->DrawSubset( j0 );
}
}





今日はここまで。いまから飲み会だわ。あんま進まなかったな~。(15:30)



マスタリングDirectXプログラミング

マスタリングDirectXプログラミング










2008年7月25日金曜日

JoglをやめてDirectXやろうかなw

0 コメント


やっぱJoglはやってる人いなくて寂しいですよw


今までJoglでいろいろ組んできたけれども、どうもモチベーションがあがらない。


その理由としては




  • Javaは起動が遅い

  • ライトワンスというけれども、結局プラットフォームにより挙動が変わる

  • ほとんどの人がWindowsユーザなのにJavaを使う意味って・・・

  • コントローラが使えない。無理やりつかうこともできるが、そしたらJava使う意味なくね?

  • 仕事でJavaやってるんだらか趣味プロではC++のほうがよくね?


てな感じです。


そんな中、ひっさし振りにCのコードを見る機会があった。



++*arg


やばい!忘れてる!間接参照が先だっけ?ポインタ演算が先だっけ?


いくら5年以上もCプログラム組んでないからって、新人でもわかるんじゃないか?やばいでしょさすがに


プログラマとして基礎教養であるCが読めないなんて恥ずかしすぎて外も歩けませんw





そんな風に感じてるころにちょうどOKIさんの記事読んだ。


ここ数年Windowsの開発シーンはさっぱり追ってなかったけどいつの間にかVisiualStudioが無償になっているとは!


世の中はオープンソースでソフト無料という流れになってるから、天下のMicrosfotも無料にせざるを得ないのかな。しかも今日TrueSpaceという3Dソフトが無償になったし!これなんかモーション生成もサポートしてるみたいだから今後はDirectXで開発する上で欠かせないツールになるかも。


というわけで急にC++というかDirectXがやりたくなりました(たぶんOKIさんの記事読まなかったらあと3年はVCやる気にならなかったでしょう。感謝!)。


まずは、C++の復習しなくちゃなんだけど今はとにかくDirectXをやりたい!このやる気の火をともしたらもったいない!


そこでとりあえず入門書を買ってきて読むことにした!


これです。



マスタリングDirectXプログラミング

マスタリングDirectXプログラミング







本屋でざっと読んでみたところ、最低限のDirectXの機能に解説を絞り込んでるようなので、ひっさし振りのリハビリにちょうどよさそう。それにこの本の作者、以前読んだことのある「ゲームのアルゴリズム 思考ルーチンと物理シミュレーション」の「ねおだ 如」さんの本である。この本は、内容も面白かったけど、イラストもすごく好きで良かった。なんかタッチが暖かいのです。


ということで、この週末に一気に読み進めます。


ルールとしては、


1.とにかく手を動かす。


2.わからないことは些細なことでもメモする。


3.途中で脱線しない。オリジナルのコードは書かない。サンプルの改造はOK


3については今までよくこれやって、結局本を最後まで読まなくなる、というパターンがあったので。


さあ読むぞ~w





しかし明日飲み会だorz





2008年7月18日金曜日

タスクシステムって駄目なの?

0 コメント


以下の2chスレッドの話題。



【タスクシステム総合スレ part2】
tp://pc11.2ch.net/test/read.cgi/gamedev/1196711513/

なんだかこのスレを読んでると




  • タスクシステム信者 → 素人ダサ!

  • タスクシステムを否定するもの → タスク以外のやり方選ぶ俺様すげーw


って感じで相変わらず2chらしいw


昔から2chのゲ製技版は俺様気質のやつが多くてなぜか気分が悪くなるのですよ。


だからあんまり読まないんだけど久しぶりに読み漁ってしまった。面白かったーw。


とりあえずPACというアーキテクチャ知らなかったorz。勉強になったよw。





で、このスレだけ読んでるともうタスクシステムは使われてないという向きが多いけどどうなんだろ?


俺が働き始めた頃の10年前から普通にタスクってシステムはあったけどそのころはCがメインだったからな。


C++がメイン(と思われる)今の現場ではやっぱり古いのか。





Cで組む場合、リストのなかに関数ポインタおいてワーク領域に構造体あてはめて状態もってという仕組みなわけだけど、C++でこの仕組みをそのまま持ってくるのはどうかと思う。Taskクラスを基底クラスとした場合にnewをオーバーロードして固定で領域確保して派生クラスにキャストして…。さすがにこれはオブジェクト指向に反した、なんだか気持ち悪い実装なのでもっといい方法が欲しいよね。ただどうすればいいのかわからんがw





Gemsとか読んだり海外のサイト漁ったりしてると、C++とかで組む場合、Taskという言葉を使わずにGameObjectとかGameEnttiyとかActorとかが多い(海外だからあたりまえか。本来Taskはスレッドみたいにコンテキスト切り替える仕組みなわけだし)。それに習ってか最近のゲームシステムではタスクではなくて別名が多いとか?(2ch情報)。実際どんなシステムなんだろう?最近はスクリプトで実装部を組むことが多いみたいだから、この辺にGameObjectの実装を組み込んでいくのかな?Luaとか流行ってるみたいだけど、コルーチンとかがあって並列っぽい処理ができるとのこと。面白ろそうだ!





俺も一応ochaglという自前フレームワークつくってるけどオブジェクト指向でまじめにゲームのフレームワーク組むのはこれが初めてだからなんかいまいちなんだよなw。一応Taskクラスも実装してるけど、ゲームをひとつも完成させてないから使い勝手がいいのか悪いのか全然わからねーw。ライブリが完成しないからゲームができないという、まさに目的と手段が入れ替わった状態w。とりあえず簡単なヘボシューでも作るか…。まずはTaskクラスの名前をEntityにしようwww。


それにしても、最近のモダンなタスクシステムがどうなってるのか知りたくなってきた!なんかいいソースないかな~。ゲーム業界もオープンソース化しようよw





2008年7月3日木曜日

Windowsに入れる最低限のツール

0 コメント


自宅ではVAIOのノートPCを使っていて、UbuntuとVistaを入れてある。んでメインはUbuntu。Vistaはほとんど使ってない。それでもたまーにWindowsを使うことがある。そんなときやっぱり素のVistaではあまりにも使いにくいということで会社のマシンで使っているWindowsのツールたちをメモ。








xyzzy

http://www.jsdlab.co.jp/~kamei/


これがないとは始まらない。








caldix

http://www.kmonos.net/lib/caldix.ja.html


xyzzyのファイラと組み合わせれれば、もう圧縮解凍ツールいらね。








changekey

http://www.forest.impress.co.jp/lib/sys/hardcust/keyboard/changekey.html


CtrlとCapsを入れ替える。これながいとキーボード使えません。


追記


ChangekeyはVistaに対応していないので使えない。仕方がないので下記サイトの.regファイルを拝借した。


http://www.center-left.com/blog/archives/2007/02/windows_vistacaps_lockctrl.html








putty

http://yebisuya.dip.jp/Software/PuTTY/


linuxに接続するのに使う。ごった煮版を使ってます。








firefox

http://mozilla.jp/firefox/


基本。IEは使いづらくて話になんね。








WinDeskWide

http://bluecard.no-ip.com/freeware/WinDeskWide/


Linuxの仮想デスクトップを実現。この便利さ一度味わうと戻れません。








CraftLaunch

http://sites.google.com/site/craftware/


キーボードランチャ。これがあればスタートボタンを押すことはほとんどありません。


さらにデスクトップのショートカットアイコンの散乱ともおさらばです。








tsxbin

http://www.net3-tv.net/~m-tsuchy/tsuchy/dlpage.htm


バイナリエディタの中ではこれが一番使いやすい。


表示幅を8bit - 32bitまで自在に代えられる!








AdjustClock

http://wiki.cuvie.net/index.php?AdjustClock


時刻を自動的に合わせてくれる。Httpで合わせるので会社のLanでも使用できて便利。








TClock Light

http://homepage1.nifty.com/kazubon/


タスクバーの時計の表示が見やすくなる!