環境の違いからかもしれないけど、本のプログラムどおりでは動かなかったところを紹介します。
自分では「何故こうなるの?」って感じで、未だに理解できていないところもありますので、「これはこういうことだよ」とか「ここはこうするべきだよ」って教えていただければうれしいのですが・・・
- P33:18行目
define文で#define NAME "win32A"としてるのだから、プログラム内では当然Nameではなく
(誤)wc.lpszClassName = Name;
(正)wc.lpszClassName =NAME;NAMEでしょう。- P33:26行目
Visual C 6.0では型変換エラーが発生する。
(誤)wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
(正)wc.hbrBackground =(HBRUSH)GetStockObject(LTGRAY_BRUSH);
windowsx.hをインクルードしてGetStockBrushを使ってもOKなんだけど、キャストで変換するのが正しいでしょう。教えてくれた「えろりん」さんサンクスです!!
ここは特になかった・・・と思う。
ここは特になかった・・・と思う。
- P95:9行目
プログラムの動作には全く関係ない場所なので別にどうでも良いんだけど、偶然気がついたので。
(誤)#define NAME "DirectDrawCapabitity"
(正)#define NAME "DirectDrawCapability"- P96:22行目
次の行は合ってるのに、この行は違ってた。カット&ペーストしてたので気がつかなかった・・・
(誤)GetSystemMetrics(MS_CXSCREEN);
(正)GetSystemMetrics(MS_CYSCREEN);
- P110:14行目
この変数の宣言は、4.3(P81)ではグローバル変数として宣言されているのに、何故、関数内に移動したんだろう。
(?)BOOL bActive;
「値が入ってないものを参照した」という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行目
LoadImageの戻り値をキャストで変換してやらないとエラーになった。どういうエラーが出たかは忘れたけど。これもDirectXのバージョンの違いなんだろうか?
(誤)hbm = LoadImage(GetModuleHandle(NULL), "myFriends", IMAGE BITMAP, 0, 0,
(正)hbm =(HBITMAP)LoadImage(GetModuleHandle(NULL), "myFriends", IMAGE_BITMAP, 0, 0,
それからIMAGE_BITMAPのアンダーバーは網掛けの関係だろう。網掛けの個所は全てアンダーラインが消えてるような気がする。
ここは特になかった・・・と思う。
- P162:42行目
lpDDSurfaceだと、どうしても色がめちゃくちゃになってしまった。
(誤)ddrval = lpDDSurface->SetPalette(lpDDPal);
(正)ddrval =lpDDSPrimary->SetPalette(lpDDPal);
もしかして?と思って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のプログラムも入れ替えました。意味は無いんだけど、なんとなく。
- P187:9行目〜15行目
上下左右のカーソルでキャラクタが動くプログラムだから、ここは要らないのでは?
(誤)マウスの左ボタンをクリックすると、キャラクタが右下へ移動するプログラム
9.1のプログラムの名残なんだろうけど・・・- P188:17行目
グローバル変数で宣言してるのはcoodx, coodyではなくcounterx, counteryだから、すぐ解りました。でも、何故?
(誤)ddrval = lpDDSBack->BltFast(coodx, coody, lpDDSSprite, &spriteRect,
(正)ddrval = lpDDSBack->BltFast(counterx,countery, lpDDSSprite, &spriteRect,- P210:34行目
BltFastからBltに変わったわけだから、当然ここも変えなきゃいけない。
(誤)DDBLT_KEYSRC | DDBLTFAST_WAIT, NULL);
(正)DDBLT_KEYSRC |DDBLT_WAIT, NULL);
次のページに説明があるけど、そこも違ってる。「Bltに変更したことに注意」って書いてあるのに・・・- P215:20行目
21行目のif文でddrval != DD_OKって聞いてるから要るんじゃないかなと思ったけど、まずエラーは出ないんだろうから、そのままでも問題無いのかな?でもやっぱり気になったので付けました。
(誤)lpDDClipper->SetClipList((RGNDATA *)&cl, 0);
(正)ddrval =lpDDClipper->SetClipList((RGNDATA *)&cl, 0);
ここはまだやってません。まずはフルスクリーンだけを考えようかなってことで・・・
もうちょっと私のレベルが上がったら手をつけます。