ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

プロジェクト6

一応、完成

DirectXのサンプルフレームワークを使って、自分なりのライブラリを構築しながら、とりあえずゲームが完成。 といっても、ゲームの内容はいわゆるPong。何の工夫もなくただボールを跳ね返すだけで、面白くもなんともない。 目的はDirectXに慣れるということ…

調整とバグ取り

サウンドも無事なるようになったので、あとは調整とバグ取り。

サウンド処理落ちの対処

サウンドを最初に鳴らすときに処理落ちが起きる原因は分からず。 鳴らすときにファイルの読み込みをするのかもと思い、あらかじめファイルを読み込んでみたが変わらず。 サウンドのバッファに転送するために処理落ちするのだろうか。 とりあえずの対処として…

サウンド再生時に処理落ち

DirectSoundのサンプルフレームワークでサウンドを鳴らしたとき、最初の1回目に必ず処理落ちしてしまう現象が。 CSoundを作成した時ではなく、最初の再生時にファイル読み込みをするのだろうか。

DirectSoundのサンプルフレームワークを使う その2

まず、CSoundManagerを作成する。 static CSoundManager* s_pSoundManager = NULL; void init() { s_pSoundManager = new CSoundManager(); s_pSoundManager->Initialize( DXUTGetHWND(), DSSCL_PRIORITY ); s_pSoundManager->SetPrimaryBufferFormat( 2, 22…

DirectSoundのサンプルフレームワークを使う

DirectSoundのサンプルフレームワークを使うには、フレームワークをインストールしたフォルダのDXUT\Optinalにある SDKsound.cpp, SDKsound.h, SDKwavefile.cpp, SDKwavefile.h の4つのファイルが必要になるので、それをプロジェクトに追加。 そして、プロジ…

CSoundManager,CSound

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する。 ・シス…

再開

メモリリークの問題も原因が分かったので、さっそくゲーム本編の制作へ。 とりあえずプレイヤーの操作でキャラクターが動く部分から始めよう。

typeidは使っちゃだめ?

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演算子を使って…

バグ再現

メモリリークが必ず出るような操作手順を見つけることが出来た。出るときと出ないときの処理の違いを比較して原因に迫ることができるだろう。