- ベストアンサー
Visual C++ 2008でブロック崩しゲームを作成しているが、ブロックの位置がおかしい
- Visual C++ 2008でブロック崩しゲームを開発しており、ブロックの位置が正しく表示されない問題が発生しています。
- ブロックの描画関数と初期化関数を確認しましたが、適切な座標値を指定しているように見えます。
- しかし、実際にブロックを表示してみても位置が変わらず、原因がわかりません。アドバイスをお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ブロックの座標計算のFor分中で ループカウンタの影響を受けるのは BOLCK_WIDTHや BLOCK_HEIGHTとの演算部分で ball.heightは定位置ですよ ・・・ X 演算をするのに ball.heightを使うのは 変な気もします ・・・ 左端を指定するなら ball.widthかなとも思いますが ・・・ まぁ ballが正方形だからどちらでも良いでしょうが 『おかしい』とおっしゃる現象を説明してみましょう 単一のブロックしか表示しない 列として表示はするが途中が歯抜けのようになる など ・・・ また演算した blocks構造体のデータのチェックはしなかったのでしょうか? 描画処理を呼び出している部分の処理はどのようになっているのでしょう ウィンドウプロシージャのWM_PAINTメッセージの応答部分から読んでいるのでしょうか 引数のhdcは有効なのか CreateCompatibleDCは成功しているのか BitBltは成功しているのか 何処まで期待通りの動作をしていて、どの部分が期待にそぐわないのか細分化してデバッグしてみましょう
その他の回答 (2)
- magicalpass
- ベストアンサー率58% (378/648)
まず、blocks_info構造体がどういう構造なのかわからないのでソースを追う上で限界があります。また、BLOCK_HEIGHT、BLOCK_WIDTHが正しく定義されているかどうかもわかりません。 それを踏まえたうえで (1) 「blocks[i].enable」というアクセスと「blocks->x[i]」「blocks->y[i]」というアクセスの使い分けにどんな意味があるのでしょう? 見た範囲ではblocksの値はmallocされたまま変更されていないので、 ・「blocks[i].enable」はmallocで獲得された56個のblocks_info構造体のそれぞれに対してアクセスしている。 ・「blocks->x[i]」「blocks->y[i]」は一番最初のblocks_info構造体にのみアクセスしている。 ようにしか見えません。 (2) > blocks->enable = 1; 上記のとおり、ポインタblocksの値は変わらないので、このenebleはループを通じて常に最初の構造体の要素を示しています。したがって、描画処理で評価している2番目以降の構造体の要素は未設定のままです。 (3) >if(blocks == 0) return 0; // ブロックが画面に1つも残っていなければ戻る blocksは構造体配列のアドレスを指しているので、この処理は正しくないでしょう。 (4) > DeleteObject(hdc_all);// オブジェクトの開放 何を解放しようとしているのか不明です。 本来ならSelectObjectでhdc_allに結び付けられたオブジェクトを解放するところだと思いますが。
お礼
おっしゃったようにいろいろと矛盾した点があると分かりました。もう一度自分の力で改良していきたいと思います。アドバイスありがとうございました
- Tacosan
- ベストアンサー率23% (3656/15482)
「まずはどこに bitblt するのか調べてみよう」とは思わなかった? あと, width/height の関係がおかしい.
補足
>>「まずはどこに bitblt するのか調べてみよう」とは思わなかった? どこに、というのは BitBlt(hdc,blocks-> x[i],blocks -> y[i], BLOCK_WIDTH, BLOCK_HEIGHT, hdc_all, 0, 5, SRCCOPY); での コピー先のx座標である blocks-> x[i] 、y座標である blocks -> y[i] のことでしょうか。 >>あと, width/height の関係がおかしい. すいません、まだ自分にはよくわかりません。
お礼
回答ありがとうございました。あなたが言っているように、細分化してデバックを擦る必要があるようです。矛盾した点も多くあると気がつかされたので、色々と改善していきたいと思います。ありがとうございました。