フリーゲーム・フリーソフトの開発過程を記録していく、TDtechnic公式ブログです。製品はカテゴリの「ダウンロード場」からダウンロードして頂けます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

今日は!貴方の心僕の心に「宮田先生」、暁のブラックウルフです。
はい、前回の更新から、此の長い間、有ったことをずっと書きましょう。先ず、やっぱりOpenGLは3D表示以外の使い勝手はWIN32APIにとても及ばないので、GLUTに依存させるのはやめてWIN32API中心に書こうと決めました。OpenGL関係はwglにやらせる事にしました。此れが前回の更新直後です。という訳で取り敢えずウィンドウをWIN32APIで作りました。
…ってかインスタンスハンドルってWinMainの引数をそのまま使っちゃ駄目なんですね。ローカルで引数にして、其れからグローバルにコピーしないと。何かの仕来りでしょうか。
其れは兎も角、WIN32APIは良いですね。変な仕来りは多いですが、フルスクリーンも簡単に出来ますし、初めからAlt+F4で終了出来ますし、何よりGDI関数で容易に様々な描画が出来ます。OpenGLでは背景描くのも一苦労ですからね。後、折角オブジェクト指向プログラミングが出来るのですが、画面が刻々と、而もまるっきり変わってしまう此のゲームでは、却って好きな時に描画出来ないのが不自由に感じました。其処で、マルチスレッドにして一つをゲーム進行用、もう一つをアプリケーション管理用としました。手続き型だけにしてしまうと、今度は好きな時に終了し難く成ったりしますので。
で、数日後。GDIを組み合わせて自作描画関数を量産し、オートフレームスキップも実装し、メニューも完成しました。WIN32API的には一段落です。ところが!2Dゲームならこのまま本編の制作に取り掛かれば良いんですが、僕が作りたいのは3Dのレゲーです。而もHSP以上のクオリティを維持せねば、何の為のCか解りません(既に、コンパイラの仕様でWin2kと其れ以降でしか起動出来ないという弱点が有ります)。という訳で、OpenGLとWIN32APIを何とかして共存させねば成りません。然し双方互換性は無いに等しいので、単純に同時に描画してもどちらかが隠れてしまいます。其処で先ず思いついたのは、OpenGLで先に描画しておいて、其の上にWIN32APIで描いたビットマップを指定色透過コピーするというものです。此れの実装に又数日掛かりました。透過色がエッジに残りますが…。
ところが!Part2。やっと出来た~と思ったら…描画タイミングが二回有る為、アニメーションにすると後出しのWIN32APIがちらつくのです。此れが数日前ですね。こんな醜い物を配布する訳にはいかないので、対策を練ります。次に思いついたのは、WIN32API側はDIBに書き込み、ピクセルデータを取り出してOpenGLに一気に描画させるというものでした。はい、又数日。ってか此の苦労でピットマップとかバイナリデータの知識がやたら増えましたねwWIN32APIだけ使えば不要なんですが。で、やってみました。ピクセルデータにはアルファが無いので背景が塗り潰されて撃沈。指定色透過やアルファ値書き込みも挑戦しましたが、前述の通りOpenGLに2Dを任せるのはやっぱりきついという結論に達しました。まあ、たとえ成功しててもOpenGLに頼るのは嫌だなあと思ってましたし。
さて、今度はWIN32APIに全てを描画させようと思いました。ですが…OpenGLで拾ったピクセルデータをどう渡そうか。ビット数も違う、そもそもBGRって何だよ!リトルエンディアンもいいとこだ。素直じゃない。
と、此処で思い付きました。DIBセクションってピクセルデータの出力しか出来ないのか?OpenGL描画済みのピクセルデータ渡せば其の画面に成るんじゃ?MSDNには「DIB のビット値が置かれている場所が格納されます」と書いてあるが…場所を格納って事はそいつを弄ればDIB自体にも反映されるんじゃ?試しにglReadPixelsで拾ったピクセルデータを渡してみました。で、GDI関数BitBltでウィンドウに描画。うはw映ってたw確認の為、其の上にWIN32APIで文字列や矩形を描画して、其れをアニメーションにしてテスト。うん、やっぱりちらつかない。そりゃ描画が一コマ一回ですもの。
はい、此れが昨日の晩です。其して最後の試練(?)が降りかかります。終了時、75%位の確率でアクセス違反が生じるのです。こんな危険な物を配布する訳にはいかないので、原因究明。どうやらマルチスレッドの典型的な弱点の様です。Alt+F4等を使ってウィンドウスレッドが終了操作をする際、ゲームスレッドでglReadPixelsが実行されるとぬるぽを使ってしまう様です。其の終了操作を何とか出来ないかと思い弄ってたら、DIBを解放せず放置しておいたら発生しないという事が解りました。という訳でゲームスレッドのreturnの直前に解放処理を持って行きました。此れが今日の0:40頃です。流石に眠いので就寝。八時頃起床。さあ朝食等済ませました。やっぱり解放しないなんて邪道は駄目ですよね。リソース食いっ放しらしいんで。
じゃあどうするか。あ、然うだ!ぬるぽさえ渡さなければ良いんだから、解放する前にDIBとポインタを切り離してしまえば、ポインタはグローバル変数だから終了時間際迄残って勝手に削除されるし、完璧じゃね?早速、終了操作に解放を持って行き、直前で白紙のビットマップに初期化させました。此れで、此奴を削除してもポインタは弄られない筈だ。すると、何という事でしょう!(ビフォーアフター風)全くアクセス違反しなく成りました。此れが一時間前位です。実は此の記事書きながらだったりします(笑)。
今日は長いのできょうのすくしょは休載です。ってかマ板とか行こうかな…アクセス規制解除されたか解りませんが。所で昔何処かにオレーって言う僕と似た様な野望を持つ人居ましたよね…辞めちゃったのかな。二代目オレー、通称ボクーに成ろうかな(笑)では、失礼致します。
関連記事

[2011/12/03 11:16] | 首都高バトルTD
|
コメント:
この記事へのコメント:
コメント:を投稿
URL:

パスワード:
非公開コメント: 管理者にだけ表示を許可
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。