準・究極の選択

開発環境:visual c++ 2008 windows vista

ブロック崩しをつくっていまして、なんとかブロックを表示することができました。しかし、その位置がおかしいのです。

////////////////////////////////////////////////////////////////////////////////////////////////
// ブロック描画関数
////////////////////////////////////////////////////////////////////////////////////////////////
int Paint_Blocks(HDC hdc)
{
int i;

if(blocks == 0) return 0; // ブロックが画面に1つも残っていなければ戻る

HDC hdc_all;// デバイスコンテキストハンドルの定義
hdc_all = CreateCompatibleDC(hdc);// デバイスコンテキストハンドルの作成
SelectObject(hdc_all, hb_all);// オブジェクトの選択

for(i=0 ; i< block_count ; i++)
{
if(blocks[i].enable == 0) continue;



  
  BitBlt(hdc,blocks-> x[i],blocks -> y[i], BLOCK_WIDTH, BLOCK_HEIGHT, hdc_all, 0, 5,  ←(2)    SRCCOPY);// 転送





}

DeleteDC(hdc_all);// デバイスコンテキストの開放
DeleteObject(hdc_all);// オブジェクトの開放

return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////
// ゲーム初期化関数
////////////////////////////////////////////////////////////////////////////////////////////////
int Init_Game()
{
int i;

// バー関連
bar.width = 30;
bar.height = 5;
bar.location.x = 100;
bar.location.y = 210;

// ボール関連【ブロック関連の初期化より先に書くこと】
ball.width = 4;
ball.height = 4;
ball.move = 1;
ball.location.x = 80;
ball.location.y = 180;

// ブロック関連
block_count = 56; // ブロックの数
blocks = (blocks_info *)malloc(sizeof (blocks_info) * block_count); // ブロックの数分、メモリを確保する。

int k = 0;

for(i=0 ; i < 4 ; i++)
{
int yy = i * (BLOCK_HEIGHT+3) + (ball.height * 2);

for(int j = 0; j < 14; j++)
{



    blocks -> x[k] = j * ( BLOCK_WIDTH +3) + (ball.height * 2);          ←(1)




      blocks ->y[k] = yy;
blocks->enable = 1;

k = k+1;
}
}

return 0;
}

自分の考えでは、矢印(1)で 変数j=0 のとき、配列x[0] は ball.height * 2 で 8 となり、
矢印(2)の bitblt関数で、x座標=8 から表示されると思っていました。
しかし、実際は ball.height などに100などの大幅な数字を代入してみても描写されるブロックの位置は全く変わりませんでした。

どうかアドバイスをよろしくお願いします。 

A 回答 (3件)

ブロックの座標計算のFor分中で ループカウンタの影響を受けるのは BOLCK_WIDTHや BLOCK_HEIGHTとの演算部分で ball.heightは定位置ですよ



・・・ X 演算をするのに ball.heightを使うのは 変な気もします
・・・ 左端を指定するなら ball.widthかなとも思いますが
・・・ まぁ ballが正方形だからどちらでも良いでしょうが

『おかしい』とおっしゃる現象を説明してみましょう

単一のブロックしか表示しない
列として表示はするが途中が歯抜けのようになる
など ・・・

また演算した blocks構造体のデータのチェックはしなかったのでしょうか?
描画処理を呼び出している部分の処理はどのようになっているのでしょう
ウィンドウプロシージャのWM_PAINTメッセージの応答部分から読んでいるのでしょうか
引数のhdcは有効なのか
CreateCompatibleDCは成功しているのか
BitBltは成功しているのか

何処まで期待通りの動作をしていて、どの部分が期待にそぐわないのか細分化してデバッグしてみましょう
    • good
    • 0
この回答へのお礼

回答ありがとうございました。あなたが言っているように、細分化してデバックを擦る必要があるようです。矛盾した点も多くあると気がつかされたので、色々と改善していきたいと思います。ありがとうございました。

お礼日時:2010/08/02 16:48

まず、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に結び付けられたオブジェクトを解放するところだと思いますが。
    • good
    • 0
この回答へのお礼

おっしゃったようにいろいろと矛盾した点があると分かりました。もう一度自分の力で改良していきたいと思います。アドバイスありがとうございました

お礼日時:2010/08/02 16:51

「まずはどこに 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 の関係がおかしい. 

すいません、まだ自分にはよくわかりません。

補足日時:2010/08/02 02:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報