ClearDrawScreen()が聞いてくれない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
こーら

ClearDrawScreen()が聞いてくれない

#1

投稿記事 by こーら » 14年前

こんにちは。
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);
}
構造体の宣言などは端折ってますが、よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ClearDrawScreen()が聞いてくれない

#2

投稿記事 by softya(ソフト屋) » 14年前

ちょっと変なところはありますが、ClearDrawScreen()はされていると思います。
ただし、

コード:

    bar.y += 3;
    bar.y2 += 3;
こうしないと、どんどんbarの長方形が巨大化します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

こーら

Re: ClearDrawScreen()が聞いてくれない

#3

投稿記事 by こーら » 14年前

コード:

bar.y2 = bar.y + bar.size;
こう書いてるので大丈夫だと思います・・・

barが消えません・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ClearDrawScreen()が聞いてくれない

#4

投稿記事 by softya(ソフト屋) » 14年前

書いてないことがあると検証しようがないのでソース全体を貼ってください。
今のコードの範囲ならちゃんと動くはずとしか言えません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

こーら

Re: ClearDrawScreen()が聞いてくれない

#5

投稿記事 by こーら » 14年前

申しわけありません。作りかけで汚いですが、張らさせてもらいます。

コード:

#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);
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ClearDrawScreen()が聞いてくれない

#6

投稿記事 by softya(ソフト屋) » 14年前

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回だけ計算される事となります。

プログラムの流れと変数の値の変化を意識してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: ClearDrawScreen()が聞いてくれない

#7

投稿記事 by h2so5 » 14年前

softya(ソフト屋)さん、
ループの前にSetPos();がありますよ。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ClearDrawScreen()が聞いてくれない

#8

投稿記事 by softya(ソフト屋) » 14年前

h2so5 さんが書きました:softya(ソフト屋)さん、
ループの前にSetPos();がありますよ。
えーと、そう書いたつもりなんですが。どこか誤解させる余地ありました?
SetPos()はどう見ても初期化なのでループ前に呼ばないとマズイと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

こーら

Re: ClearDrawScreen()が聞いてくれない

#9

投稿記事 by こーら » 14年前

ためしにループ内に
bar.y2 = bar.y + bar.size;
を呼んだら出来ました!

ありがとうございました!。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: ClearDrawScreen()が聞いてくれない

#10

投稿記事 by h2so5 » 14年前

softya(ソフト屋) さんが書きました: えーと、そう書いたつもりなんですが。どこか誤解させる余地ありました?
SetPos()はどう見ても初期化なのでループ前に呼ばないとマズイと思います。
僕がちょっと勘違いしていただけみたいです、すみません。

閉鎖

“C言語何でも質問掲示板” へ戻る