ページ 1 / 1
ClearDrawScreen()が聞いてくれない
Posted: 2011年6月19日(日) 17:25
by こーら
こんにちは。
ClearDrawScreen()を使っても画面が初期化されなくて困っています。
コード:
#include "DxLib.h"
void Set_Graph(void);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE );
SetGraphMode( WIN_X, WIN_Y, 32 );
if( DxLib_Init() ) return -1;
SetDrawScreen(DX_SCREEN_BACK);
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
ClearDrawScreen();
bar.y += 3;
Set_Graph();
ScreenFlip();
}
}
void Set_Graph(void)
{
int i;
for(i = 0; i < BOX_MAX; i++){
DrawBox(box[i].x, box[i].y, box[i].x2, box[i].y2, box[i].cr, TRUE);
}
DrawBox(bar.x, bar.y, bar.x2, bar.y2, bar.cr, TRUE);
}
構造体の宣言などは端折ってますが、よろしくお願いします。
Re: ClearDrawScreen()が聞いてくれない
Posted: 2011年6月19日(日) 17:40
by softya(ソフト屋)
ちょっと変なところはありますが、ClearDrawScreen()はされていると思います。
ただし、
コード:
bar.y += 3;
bar.y2 += 3;
こうしないと、どんどんbarの長方形が巨大化します。
Re: ClearDrawScreen()が聞いてくれない
Posted: 2011年6月19日(日) 17:44
by こーら
コード:
bar.y2 = bar.y + bar.size;
こう書いてるので大丈夫だと思います・・・
barが消えません・・・。
Re: ClearDrawScreen()が聞いてくれない
Posted: 2011年6月19日(日) 17:49
by softya(ソフト屋)
書いてないことがあると検証しようがないのでソース全体を貼ってください。
今のコードの範囲ならちゃんと動くはずとしか言えません。
Re: ClearDrawScreen()が聞いてくれない
Posted: 2011年6月19日(日) 17:52
by こーら
申しわけありません。作りかけで汚いですが、張らさせてもらいます。
コード:
#include "DxLib.h"
#define WIN_X 512
#define WIN_Y 384
#define BOX_MAX 8
typedef struct Box_tag
{
int graph;
int x;
int y;
int x2;
int y2;
int size;
int speed;
int cr;
int f;
} Box_t;
Box_t box[BOX_MAX];
Box_t bar;
void Set_Pos(void);
void Set_Graph(void);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int i;
ChangeWindowMode( TRUE );
SetGraphMode( WIN_X, WIN_Y, 32 );
if( DxLib_Init() ) return -1;
SetDrawScreen(DX_SCREEN_BACK);
Set_Pos();
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
ClearDrawScreen();
//DrawBox(0, 0, WIN_X, WIN_Y, GetColor(0,0,0), TRUE);
bar.y += 3;
Set_Graph();
ScreenFlip();
}
WaitKey();
return 0;
}
void Set_Pos(void)
{
int i;
for(i = 0; i < BOX_MAX; i++){
box[i].size = GetRand(50) + 20;
if(i == 0){
box[0].x = 0;
box[0].y = GetRand(WIN_Y/2) + 100;
box[0].x2 = box[0].x + box[0].size;
box[0].y2 = box[0].y + box[0].size;
box[0].cr = GetColor(30, 30, 30);
} else {
box[i].x = box[i-1].x2;
box[i].y = GetRand(box[i-1].size) + box[i-1].y-20;
box[i].x2 = box[i].x + box[i].size;
box[i].y2 = box[i].y + box[i].size;
box[i].cr = GetColor( 25*(i+1), 25*(i+1), 25*(i+1) );
}
}
bar.size = GetRand(20) + 10;
bar.x = box[BOX_MAX-1].x2;
bar.y = 0;
bar.x2 = bar.x + bar.size;
bar.y2 = bar.y + bar.size;
bar.cr = GetColor(100, 200, 200);
}
void Set_Graph(void)
{
int i;
for(i = 0; i < BOX_MAX; i++){
DrawBox(box[i].x, box[i].y, box[i].x2, box[i].y2, box[i].cr, TRUE);
}
DrawBox(bar.x, bar.y, bar.x2, bar.y2, bar.cr, TRUE);
}
Re: ClearDrawScreen()が聞いてくれない
Posted: 2011年6月19日(日) 18:00
by softya(ソフト屋)
SetPos();を呼び出さないと
bar.y2 = bar.y + bar.size;
は計算されません。
描画ループに中に
コード:
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
ClearDrawScreen();
//DrawBox(0, 0, WIN_X, WIN_Y, GetColor(0,0,0), TRUE);
bar.y += 3;
Set_Graph();
ScreenFlip();
}
SetPos();はないので、 bar.y2 = bar.y + bar.size;の計算が行われずbar.yが変化しようともbar.y2の値は固定されたままです。
まぁ、SetPos()を呼び出すと座標が初期化されるので、そういう意味でも呼べません。
bar.y2 = bar.y + bar.size;は計算式を代入するのではなく計算式を計算した結果を代入するのでSetPos();に有るだけならプログラムで最初に1回だけ計算される事となります。
プログラムの流れと変数の値の変化を意識してみてください。
Re: ClearDrawScreen()が聞いてくれない
Posted: 2011年6月19日(日) 18:02
by h2so5
softya(ソフト屋)さん、
ループの前にSetPos();がありますよ。
Re: ClearDrawScreen()が聞いてくれない
Posted: 2011年6月19日(日) 18:04
by softya(ソフト屋)
h2so5 さんが書きました:softya(ソフト屋)さん、
ループの前にSetPos();がありますよ。
えーと、そう書いたつもりなんですが。どこか誤解させる余地ありました?
SetPos()はどう見ても初期化なのでループ前に呼ばないとマズイと思います。
Re: ClearDrawScreen()が聞いてくれない
Posted: 2011年6月19日(日) 18:23
by こーら
ためしにループ内に
bar.y2 = bar.y + bar.size;
を呼んだら出来ました!
ありがとうございました!。
Re: ClearDrawScreen()が聞いてくれない
Posted: 2011年6月19日(日) 19:47
by h2so5
softya(ソフト屋) さんが書きました:
えーと、そう書いたつもりなんですが。どこか誤解させる余地ありました?
SetPos()はどう見ても初期化なのでループ前に呼ばないとマズイと思います。
僕がちょっと勘違いしていただけみたいです、すみません。