DirectXによるゲームプログラミング・バグ報告

環境の違いからかもしれないけど、本のプログラムどおりでは動かなかったところを紹介します。
自分では「何故こうなるの?」って感じで、未だに理解できていないところもありますので、「これはこういうことだよ」とか「ここはこうするべきだよ」って教えていただければうれしいのですが・・・

第2章 DirectXプログラミングの準備

P33:18行目
(誤)wc.lpszClassName = Name;
(正)wc.lpszClassName = NAME;
define文で#define NAME "win32A"としてるのだから、プログラム内では当然NameではなくNAMEでしょう。
P33:26行目
(誤)wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
(正)wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
Visual C 6.0では型変換エラーが発生する。
windowsx.hをインクルードしてGetStockBrushを使ってもOKなんだけど、キャストで変換するのが正しいでしょう。教えてくれた「えろりん」さんサンクスです!!

第3章 DirectDrawオブジェクトの生成と初期化

ここは特になかった・・・と思う。

第4章 サーフェイスの生成とフリップ

ここは特になかった・・・と思う。

第5章 ビデオ・カードのケーパビリティ

P95:9行目
(誤)#define NAME "DirectDrawCapabitity"
(正)#define NAME "DirectDrawCapability"
プログラムの動作には全く関係ない場所なので別にどうでも良いんだけど、偶然気がついたので。
P96:22行目
(誤)GetSystemMetrics(MS_CXSCREEN);
(正)GetSystemMetrics(MS_CYSCREEN);
次の行は合ってるのに、この行は違ってた。カット&ペーストしてたので気がつかなかった・・・

第6章 DirectDrawのビットマップ処理

P110:14行目
(?)BOOL bActive;
この変数の宣言は、4.3(P81)ではグローバル変数として宣言されているのに、何故、関数内に移動したんだろう。
「値が入ってないものを参照した」というWORNINGエラーが出たので、前のプログラム同様グローバル変数として宣言したら、エラーは無くなった。
これはDirectXじゃなくてVisual Cのバージョンの違いかな?それとも関数内で宣言する意味があるのかな?
ともあれこれは、これ以降のプログラムではグローバル変数として宣言して使いました。
P125:5行目
(誤)RGBOUAD* prgb;
(正)RGBQUAD* prgb;
この行は網掛けになってるせいか、下が切れててとっても見にくい。
小文字のpやgの下が切れてるぶんにはまだ読めるが、大文字のQが切れてるとOにしか見えなかった。
P125:17行目
(誤)prgb = (RGBOUAD*)((BYTE*)lpbi + lpbi->biSize);
(正)prgb = (RGBQUAD*)((BYTE*)lpbi + lpbi->biSize);
これも上と同じ。
P128:42行目
(誤)hbm = LoadImage(GetModuleHandle(NULL), "myFriends", IMAGE BITMAP, 0, 0,
(正)hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), "myFriends", IMAGE_BITMAP, 0, 0,
LoadImageの戻り値をキャストで変換してやらないとエラーになった。どういうエラーが出たかは忘れたけど。これもDirectXのバージョンの違いなんだろうか?
それからIMAGE_BITMAPのアンダーバーは網掛けの関係だろう。網掛けの個所は全てアンダーラインが消えてるような気がする。

第7章 DirectDrawによるブリッフィング

ここは特になかった・・・と思う。

第8章 キャラクタのブリッフィング

P162:42行目
(誤)ddrval = lpDDSurface->SetPalette(lpDDPal);
(正)ddrval = lpDDSPrimary->SetPalette(lpDDPal);
lpDDSurfaceだと、どうしても色がめちゃくちゃになってしまった。
もしかして?と思ってlpDDSPrimaryにしたらきれいに色が出た。
でも、説明を読んでるとlpDDSurfaceじゃなきゃいけないみたいだけど・・・
これで合ってるのか解らないけど、これ以降のプログラムは全てlpDDSPrimaryにした。
P170:32行目
(誤)ddrval = lpDDSBack->BltFast(100, 100, pDDSSprite,
(正)ddrval = lpDDSBack->BltFast(100, 100,lpDDSSprite,
網掛けの場所だけど、下ではなく一文字全て消えるなんて・・・何故?
P172にこの個所の説明があるけど、そこでも抜けてるし、説明文でも l がない。
P170:33行目
(誤)spriteRect, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
(正)&spriteRect, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
これも上と同じ。
P176〜177
(誤)「始点のインデックスを取得」以下の行と、「ビットマップの転送」以下の行
このままだと、どうやっても背景が黒の場合しか透明にならなかった。
これで2ヶ月くらい悩んだけど、2つを入れ替えたらどんな色でも透明になった。
つまり「ビットマップを転送してからインデックスを取得する」必要があるのでは?
これもバージョンの違いなのか、それとも・・・ということで、8.2のプログラムも入れ替えました。意味は無いんだけど、なんとなく。

第9章 ゲーム・ループ

P187:9行目〜15行目
(誤)マウスの左ボタンをクリックすると、キャラクタが右下へ移動するプログラム
上下左右のカーソルでキャラクタが動くプログラムだから、ここは要らないのでは?
9.1のプログラムの名残なんだろうけど・・・
P188:17行目
(誤)ddrval = lpDDSBack->BltFast(coodx, coody, lpDDSSprite, &spriteRect,
(正)ddrval = lpDDSBack->BltFast(counterx, countery, lpDDSSprite, &spriteRect,
グローバル変数で宣言してるのはcoodx, coodyではなくcounterx, counteryだから、すぐ解りました。でも、何故?
P210:34行目
(誤)DDBLT_KEYSRC | DDBLTFAST_WAIT, NULL);
(正)DDBLT_KEYSRC | DDBLT_WAIT, NULL);
BltFastからBltに変わったわけだから、当然ここも変えなきゃいけない。
次のページに説明があるけど、そこも違ってる。「Bltに変更したことに注意」って書いてあるのに・・・
P215:20行目
(誤)lpDDClipper->SetClipList((RGNDATA *)&cl, 0);
(正)ddrval = lpDDClipper->SetClipList((RGNDATA *)&cl, 0);
21行目のif文でddrval != DD_OKって聞いてるから要るんじゃないかなと思ったけど、まずエラーは出ないんだろうから、そのままでも問題無いのかな?でもやっぱり気になったので付けました。

第10章 DirectDrawウィンドウ

ここはまだやってません。まずはフルスクリーンだけを考えようかなってことで・・・
もうちょっと私のレベルが上がったら手をつけます。


[ TOP ]