ラベル directx の投稿を表示しています。 すべての投稿を表示
ラベル directx の投稿を表示しています。 すべての投稿を表示

2008年8月1日金曜日

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

0 コメント


PART8 効果音を追加する(DirectSound)(23:00)つづき


WAVファイルの読み込み

なんというか、まったくわからん。解説読んでもサンプルよんでも全然頭に入ってこない。


もともとサウンド周りのプログラムは一番苦手な分野だけど、それにしてもわかんね。


解説もサンプルプログラムの内容を淡々と説明してるだけで、退屈。


一応わからない原因をあげるとすると、プログラムがAPIの呼び出しの連続で、知らない関数の組み合わせだけで組み立てられているのと、Wavのデータ構造を理解してないからだと思う。


ほかの章はわりとすらすらよめたけど、ここは読み始めて3分で眠くなる。。。


PART9 MIDIファイルを再生する(DirectMusic)(23:30)


用語解説


ローダ(Loader)

ファイルやリソースを読み込む。1アプリにひとつ。

パフォーマンス(Performance)

アンプみたいなもの。音量の調節や音源の再生などを受け持つ。ひとつのアプリで複数もてる。

セグメント(Segment)

音源の単位。CDの中のひとつの曲やループするフレーズ、ひとつの効果音など。

オーディオパス(AudioPath)

パフォーマンスから最後のミキサ(DirectSound)へデータを転送する。



ざっと斜め読み。サンプルを動かそうと思ったが、なんとmidファイルは自分で用意しろと!なんだよそれ!


PART10 オリジナリティを際立たせる工夫(23:55)




  • 仮の目標を立てる


    • 目標とするゲームを決めそこから自分おオリジナリティを加えていく。

    • 自作ゲームの作成は学生時代のレポート提出に似ている。



  • ゲームに必要な要素をひとつずつ切り出していく


    • ゲームの特徴やルールを言葉で置き換えて「要素」にして説明していくことにより、全容が明確になっていく



  • 全体をなんとなく理解しよう


    • 一度つかえるサブルーチンやクラスを作ってしまうと、中身の見直しをしなくなるので理解が薄れていく・・・。

    • 不完全だけど全体的な理解を目指す。




以下引用(P313)。



「○ ○の作り方」という本を読んで「この本に××が足りない」と考え、
そこで今度は××に冠する解説をよみ「これには△△が抜けている」という印象をもち、
そしてなかなか自分のゲームが完成しない、というパターンに陥った人は少なくないでしょう。
さまざまな技術書や解説書、入門書を読みつくし、最先端技術に精通しているはずなのに
自作アプリケーションがほとんど作れないというのは、決して珍しくありません。

これ、俺だよ!orz。仕事以外でゲームを完成させたことほとんどなかったわ・・・。実験プログラムばかっり。プログラムの断片、いわゆるジャンクプログラムばかり書いてていっこうに完成品をつくれないんだよなぁ。反省反省。


感想とか。(12:30)

とりあえず読み終わった。疲れたぜぃ。


本書を通じてDirectXを概観したわけだけど、やっぱりDirectSoundが一番めんどくさそうだな~。全然理解できてないし。とりあえずサンプルを組んだり改造したりして遊んでみるか。


この本サンプルプログラムの出来はちょっと残念なところがあったけど、サンプルの見栄えは派手なんで、動かして楽しかったな。あと途中から操作できるようになって敵が攻撃してくるんだけど、この敵がつええよwww。こっちの玉は全然当たらないのに、やつの玉は的確に俺を撃ってきやがるw。まずは、この辺のあたり判定でも改造してみるか。・・・もしやこの調整って作者が意図したものなのかな?


振り返ってみると、この本では精神的なものというか、心構えとして忘れていたものを多く教えてもらった気がする。プログラムの内容はサンプルやヘルプを読めばいずれ理解できるけど、こういった話は長い経験からしか得ることが出来ない貴重な話だよな~。ありがとうございました。



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

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










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