開発環境: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などの大幅な数字を代入してみても描写されるブロックの位置は全く変わりませんでした。
どうかアドバイスをよろしくお願いします。
No.2ベストアンサー
- 回答日時:
ブロックの座標計算のFor分中で ループカウンタの影響を受けるのは BOLCK_WIDTHや BLOCK_HEIGHTとの演算部分で ball.heightは定位置ですよ
・・・ X 演算をするのに ball.heightを使うのは 変な気もします
・・・ 左端を指定するなら ball.widthかなとも思いますが
・・・ まぁ ballが正方形だからどちらでも良いでしょうが
『おかしい』とおっしゃる現象を説明してみましょう
単一のブロックしか表示しない
列として表示はするが途中が歯抜けのようになる
など ・・・
また演算した blocks構造体のデータのチェックはしなかったのでしょうか?
描画処理を呼び出している部分の処理はどのようになっているのでしょう
ウィンドウプロシージャのWM_PAINTメッセージの応答部分から読んでいるのでしょうか
引数のhdcは有効なのか
CreateCompatibleDCは成功しているのか
BitBltは成功しているのか
何処まで期待通りの動作をしていて、どの部分が期待にそぐわないのか細分化してデバッグしてみましょう
回答ありがとうございました。あなたが言っているように、細分化してデバックを擦る必要があるようです。矛盾した点も多くあると気がつかされたので、色々と改善していきたいと思います。ありがとうございました。
No.3
- 回答日時:
まず、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に結び付けられたオブジェクトを解放するところだと思いますが。
おっしゃったようにいろいろと矛盾した点があると分かりました。もう一度自分の力で改良していきたいと思います。アドバイスありがとうございました
No.1
- 回答日時:
「まずはどこに 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 の関係がおかしい.
すいません、まだ自分にはよくわかりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダイアログにビットマップを貼...
-
フォントの大きさ
-
マインクラフト(pc版)で座標...
-
エクセルで作った新しいウイン...
-
Minecraft 統合版(PC)の描画距...
-
コンボボックス内の文字サイズ変更
-
「アイテムは収集されました」...
-
MFC・ダイアログベースで、ダイ...
-
VB6,リストボックスの特定行の...
-
作成したウインドウのサイズを...
-
勝手にウィンドウが開いて止ま...
-
グラフを別ウィンドウで立ち上...
-
【VB2008】 マウス操作の一時的...
-
CScrollViewの使用方法について
-
VB.netでSTLファイルの分離
-
コントロールの書式設定で、“コ...
-
検索の画面がでなくなってしま...
-
他アプリの操作(メニューバー)
-
ダイアログボックスで指定した...
-
vbaから他のアプリを終了
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
画面がチカチカする
-
VC++のTextOutの再描画の仕方
-
コントロール内の文字の背景色
-
ビットマップ(表示速度とサイズ)
-
VBでFD、USBの有効・無効...
-
Rectangleで、リソースが解放さ...
-
WinAPIでスクリーン画像を映し...
-
メモリデバイスコンテキストを...
-
クライアント領域をCBitmapに取...
-
ダブルバッファの作り方
-
VC++でopenGLを利用したい...。
-
C 多角形を半透明に塗る方法
-
Win32APIにて、アイコンの情報...
-
ExtTextOut
-
TextOutについて
-
ハードコピーをプログラムから...
-
Windowsプログラミング 画面描...
-
BeginPaintの使い方
-
デバイスコンテキストの宣言に...
おすすめ情報