プロジェクト6
DirectXのサンプルフレームワークを使って、自分なりのライブラリを構築しながら、とりあえずゲームが完成。 といっても、ゲームの内容はいわゆるPong。何の工夫もなくただボールを跳ね返すだけで、面白くもなんともない。 目的はDirectXに慣れるということ…
サウンドも無事なるようになったので、あとは調整とバグ取り。
サウンドを最初に鳴らすときに処理落ちが起きる原因は分からず。 鳴らすときにファイルの読み込みをするのかもと思い、あらかじめファイルを読み込んでみたが変わらず。 サウンドのバッファに転送するために処理落ちするのだろうか。 とりあえずの対処として…
DirectSoundのサンプルフレームワークでサウンドを鳴らしたとき、最初の1回目に必ず処理落ちしてしまう現象が。 CSoundを作成した時ではなく、最初の再生時にファイル読み込みをするのだろうか。
まず、CSoundManagerを作成する。 static CSoundManager* s_pSoundManager = NULL; void init() { s_pSoundManager = new CSoundManager(); s_pSoundManager->Initialize( DXUTGetHWND(), DSSCL_PRIORITY ); s_pSoundManager->SetPrimaryBufferFormat( 2, 22…
DirectSoundのサンプルフレームワークを使うには、フレームワークをインストールしたフォルダのDXUT\Optinalにある SDKsound.cpp, SDKsound.h, SDKwavefile.cpp, SDKwavefile.h の4つのファイルが必要になるので、それをプロジェクトに追加。 そして、プロジ…
DirectXのサウンドのサンプルを見ると、CSoundManagerクラスとCSoundクラスが用意されている。 CSoundManagerがサウンドシステムの管理、CSoundクラスはwaveファイルと関連付けて使うらしい。 ヘルプを見るとバッファとか強調レベルとかあり、そのあたりがま…
サウンドのシステムを実装するために、DirectXのサウンドのサンプルを読む。 サンプルフレームワークにサウンド用のクラスが実装されていたので、これを利用することにしよう。
キャラの表示、キー入力による移動、コリジョン判定。一通り入ってこれでゲームができると思いきや、すっかりサウンドのことを忘れていた。 ということで、サウンドのシステムを作らねば。
コリジョンの判定として矩形同士の接触判定を実装したのだが、どの面で接触したのか知りたい場合はどうしようか。 一応、それぞれの座標を比較すればだいたいの位置は分かるけど。 正確に知りたい場合は直線同士のコリジョン判定をすべきか。 大まかに矩形同…
結局、ボールの動きを進行方向の角度をもつことから、XY方向への速度を持つことに変更。 これでラジアンに悩まなくて済む。
ボールの進行方向をラジアンで持っているのだが、このラジアンは直観的にイメージできなくて困る。デバッガで動作を追っているときに値を見てもどっちに向いているかパッと思い浮かばない。 いっそのこと角度で持ってsinやcosに渡すときにラジアンに変換する…
ゲーム内に出てくるボールの動きをどう実装しようかと悩む。障害物にぶつかったときの挙動をどうしようか。
オブジェクトの描画も当たり判定もできるようになったので、これでやっとゲームの形にすることができる。 ということで、ゲームに出てくるいろんなパーツを作成開始。
当たり判定はどのタイミングでやるのが良いだろうか。 各オブジェクトが移動したらすぐに判定を行うのがよいのか、 それともすべてのオブジェクトの移動をしてから、判定をするほうが良いのか。
ちょっとリリースバージョンでビルドしてみようと、構成を「Release」にしてビルドしてみたら、コンパイルエラーならぬコンパイラエラーが。さらにコンパイラのプロセスが異常終了しましたというダイアログまで出てしまう。 Express Editionではリリースコン…
コリジョンを視覚化するために、ライン描画を使って矩形を描画するメソッドを追加。
コリジョンを視覚化するため、ライン描画をしようとしたが、今のシステムではライン描画に対応していないことに気がついた。ということで、ちょっと設計を変更せねば。
コリジョンの衝突判定ルーチンを作成開始。 まずは矩形どうしの衝突判定。単純な座標の比較で大丈夫だろう。 ああ、でも1フレームの移動量が大きかった場合、すり抜けてしまうか…。どう対処すべきか。
自機をプレイヤーの操作で移動するように実装したところ、なんかスムーズにいかず引っかかる感じがした。 そこで、DirectXのサンプルフレームワークのシーンをアップデートする関数 void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUs…
ゲーム中に使われる定数、たとえばスクリーンサイズ。こういった定数はソース中のいろんな場所で参照される。これをどこに定義しておくのがいいのだろうか。 ・グローバル定数としてソースとヘッダを用意して、定数が定義されたヘッダをincludeする。 ・シス…
メモリリークの問題も原因が分かったので、さっそくゲーム本編の制作へ。 とりあえずプレイヤーの操作でキャラクターが動く部分から始めよう。
DirectXのSample BrowserからSimpleSampleをインストール。そしてSimpleSample.cppのOnFrameMoveに次のようなコードを追加 class A { }; //-------------------------------------------------------------------------------------- // Handle updates to t…
タスクシステムを根本から見直し。 どのタイミングで更新し、描画するのが良いのか悩む。
またメモリリーク発生。 やっぱりtypeidのコードが含まれるとメモリリークが検出される。これが直接の原因かはわからないけど。 なんか堂々めぐりになってきた。 ここが間違いのはず、という思い込みを捨てて、シンプルにじっくりコードを追いかけてみないと…
やっと原因が判明。 結局、タスクシステムのタスクを削除するタイミングに問題があった。タスクが自分から削除するのと、外から削除するのが両方行われることがあったのが原因。 やっぱりタスクシステムは難しい。 昨日、原因だと思ったC++言語の理解不足は…
原因らしきコードが判明。どうも私がC++言語を正しく理解していなかったのが原因っぽい。それを確かめるためにいろいろコードを書いてテスト中。
typeidの部分が原因かと思ったが、typeidの部分をコメントアウトしても、今度は次のようなエラーが、あるオブジェクトをdeleteするところで発生。 Windows によって test.exe でブレークポイントが発生しました。 ヒープが壊れていることが原因として考えら…
メモリリークが起こる問題のコードが分かった。だが、なぜこのコードがメモリリークになるのか分からない。そのコードはデバッグ用に作った次のようなコード。 Task* pTask; DXUTOutputDebugStringA( "%s\n", typeid(pTask).name() ); typeid演算子を使って…
メモリリークが必ず出るような操作手順を見つけることが出来た。出るときと出ないときの処理の違いを比較して原因に迫ることができるだろう。