プロジェクト7
Visual Studioを使わずにMakefileでビルドしようかと思ったけど、やっぱり統合環境の便利なデバッガは捨てがたいので、Visual Studioで行くことに。
自前ライブラリをすぐに新しいプロジェクトに組み込んで使えるようにプロジェクトファイルを作成中。 ところがソリューションファイルとかプロジェクトファイル、自動的に作成されるいくつかの設定ファイルなど、非常に分かりにくい。 こういうときMakefile…
サウンドも実装して、DirectXで実装していた自前ライブラリをSDLを使ったものへと移植できた。前作ったPongも若干の変更だけ動かすことができた。 あとはちょっとプロジェクトファイルの構成を直して、簡単に組み込めるようにしないと。 ライブラリは非常に…
サウンドはファイルを読み込んでIDを取得し、そのIDを使って再生を指示。そのとき再生したスロット番号を返し、停止や再生しているかの確認にはこのスロット番号を使うことにした。コードとしては次のような感じ。 int id; int slot; id = LoadWav("test.wav…
サウンドライブラリのインターフェースをテクスチャと同じように実装。しかし、サウンドの場合はサウンドデータだけではなく、再生するチャネルも扱わなくてはならない。これをどう実装するか悩み中。
とりあえず、描画関係はDirectXを使っていた時とほぼ同様の機能を実装しおわった。 ということで、次はサウンド関連をSDLへと移行する作業。
SDLにはサーフェスをクリアする命令がないと思っていたけど、SDL_FillRectという指定したカラーで矩形を塗りつぶすという命令があった。それで画面のクリアを実現できる。 わざわざクリア用のテクスチャを用意する必要はなかった。 ということでクリアカラー…
デバッグでコリジョンをチェックするためにラインを描画しようと思ったら、SDLにライン描画の関数が見当たらない。どうやらライン描画をする関数はないようだ。しかし、矩形を指定した色で塗りつぶす関数SDL_FillRectがあったので、これでラインを描画するこ…
ちょっと直せばすぐに対応できるかと思ったけど、結構大幅な変更が必要だった。描画命令を登録していき、登録がすべて終わったら実際の描画処理を開始する。イメージとしてはOpenGLのディスプレイリストのような感じ。 リスト構造にしてZの値が並ぶような位…
テクスチャの描画処理を行わなければ、てっきり描画されなくなるものと思いこんでしまっていた。DirectXの場合、クリアカラーを設定して毎フレーム最初にクリアされるが、SDLの場合、サーフェスに転送したイメージはそのまま。そういえばクリアする設定が見…
半透明のテストのためにいろいろなテクスチャを扱っていたら、前のテクスチャ管理のシステムに不満が出てきたので、もっと簡単にテクスチャを扱えるように改良。 ファイル名を与えるとロードして、そのテクスチャのID番号を返すように変更。そのあとはその番…
半透明がうまくいかなかった原因はサーフェスを表示フォーマットに変換する処理でSDL_DisplayFormatAlpha()を使わずにSDL_DisplayFormat()を使っていたからだった。 そりゃアルファチャンネルあっても半透明で描画できるわけがない。 これが原因だと分かるま…
どうも半透明の描画がうまくいかない。データによってはうまくいったように見えるものもある。根本的に半透明の部分を勘違いしているかも。ちゃんとドキュメントを読みなおそう。
一応、読み込んだテクスチャの描画は出来たが、どうも半透明関連が正しく描画されていない。ドキュメントを見ると、どうやらアルファ関連の設定をしなくてはならないのだが、いろんな方法があり、いまいちまだよく分かっていない。
テクスチャファイルが正しく読み込めなくてエラーとなってしまった。 画像形式が対応していないのかなといろいろ試してみたところ、結局、VisualStudioのプロジェクトのプロパティでデバッグの作業ディレクトリを指定しておらず、テクスチャファイルの位置と…
とにかく画面を出さないと、ということで、テクスチャの読み込み部分から移植開始。とりあえず高機能にすることはおいておいて、1枚でいいから読み込んで表示できるようにしよう。
キーボードの判定部分を実装。 最初、SDL_GetKeyState()でキーボードの状態を取得してもまったく反応がなくてなぜだろうと調べてみたら、SDL_PoolEvent()でイベントの処理をやっていなかったのが原因。SDL_PoolEvent()でキーボードの状態を更新するとは知ら…
とりあえず、ウィンドウを作成。まだオブジェクトの描画部分は未実装。 なぜか今回からビルドしたら、次のwarningが。 warning LNK4098: defaultlib 'msvcrt.lib' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 Visu…
処理が重くてフレーム落ちしたときはどう対処しようか。 今の実装では何の対処もしていないので、フレーム落ちしたらその分単純に更新が遅くなる。 前回のフレーム待ちから何フレーム分かかったか取得して、その値を考慮して更新処理をすれば、描画の書き換…
アプリケーションの終了処理で悩む。 もちろん、メインのメニューから終了を選んだ時は問題ないけど、ESCキーを押したときとか、ウィンドウのクローズボタンを押したときとか。どこで処理するのが一番すっきり実装できるだろうか。
とりあえず、ループは今の実装のままいくことに。
ループの作成中。ライブラリ側も修正しつつ、何パターンが試してみたが、なんかしっくりこない。どう実装するのがいいのか。
テクスチャやサウンドの修正は結構時間がかかりそうなので、まずはゲーム進行のループの部分から作業開始。
メインループをどう構成するか悩み中。
とりあえずライブラリ部分のコンパイルが通るようになった。といっても、とりあえずDirectX関連でエラーとなってしまう部分をコメントアウトしただけ。 これからDirectXで実装していた部分をSDLで実装しなおさなくては。
引き続き、コンパイルが通るように修正中。
まず前のライブラリ部分のコードを今の環境に持ってきたのだが、DirectXに依存したコードが多くて、なかなかエラーが減らない。 とりあえずはコンパイルが通るようにしなくては。
テクスチャやサウンドはDirectXのものをそのまま利用していたので、SDLに移行するため書き直し。 結構書き直さなくてはならず、DirectX関連は一つの部分にまとめておくようにしておけばよかったと反省。
すぐに移行できるかと思ったが、思ったよりも大変。 それだけDirectXのフレームワークを便利に頼っていたということか。
DirectXのフレームワークのときは、それに沿った形で実装すれば良かったけど、今度はどうループを実装しようかとか、どこまでライブラリにしてどこからを各ゲーム固有で書くかという構造の設計でちょっと悩む。 でもこうやって設計とかで考えているときは結…