ページ 11

オブジェクト(四角)の色の変更ができない

Posted: 2017年12月26日(火) 15:31
by tonari
閲覧ありがとうございます。今私は、クラスの設計を勉強しているのですが、以下の内容でつまづいています。
CircleクラスとBoxクラスのコンストラクタで色の指定をし、MY_Draw~()で実際に描画しているのですが、Boxクラスの色指定処理部分がうまく反映されません。Circleは正しく描画されています。回答お待ちしています。
VC++2017
※初めてのクラス設計です。
※headerはすべてpublicで、宣言のみです

コード:

 
//Figure.cpp
#include "Figure.h"
#include "DxLib.h"
Box::Box()
{
	x = 0,
	y = 0,
	w = 0,
	h = 0,
	life = 0, 
	color = (GetColor(255, 255, 255));
}
Box::Box(int _x  ,int _y , int _w , int _h , int _l ,int _c )
{
	x = _x;
	y = _y;
	w = _w;
	h = _h;
	life = _l;
	switch (_c)
	{
               //色指定処理
		case 1: color = GetColor(255, 0, 0); break;		//1は赤
		case 2: color = GetColor(0, 255, 0); break;		//2は青
		case 3: color = GetColor(0, 0, 255); break;		//3は緑
		case 4: color = GetColor(0, 0, 255); break;		//4は緑
		case 5: color = GetColor(0, 0, 255); break;		//5は緑
		case 6: color = GetColor(0, 0, 255); break;		//6は緑
		case 7: color = GetColor(0, 0, 255); break;		//7は緑
		case 8: color = GetColor(0, 0, 255); break;		//8は緑
		case 9: color = GetColor(0, 0, 255); break;		//9は緑
		case 0: color = GetColor(255, 255, 255); break;	//0は白
		
	}


}

bool Box::BoxCollision(const Box& b1, const Box& b2)
{
	if (b1.x < b2.x + b2.w &&
		b2.x < b1.x + b1.w &&
		b1.y < b2.y + b2.h &&
		b2.y < b1.y + b1.h)
	{
		return true;
	}
	return false;
}

void Box::My_DrawBox(Box& b, int& c, bool f)
{
	c = color;
	DrawBox(b.x, b.y, b.x + b.w, b.y + b.h, c, f);
}

Circle::Circle()
{
	x = 0;
	y = 0;
	r = 0;
	color = GetColor(255, 255, 255);
}
Circle::Circle(float _x, float _y, float _r, int _c)
{
	x = _x;
	y = _y;
	r = _r;
	switch (_c)
	{
	case 1: color = GetColor(255, 0, 0); break;		//1は赤
	case 2: color = GetColor(0, 255, 0); break;		//2は青
	case 3: color = GetColor(0, 0, 255); break;		//3は緑
	case 0: color = GetColor(255, 255, 255); break;	//デフォルトは白

	}
}
void Circle::My_DrawCircle(Circle& b, int& c, bool f)
{
	c = color;
	DrawCircleAA(b.x, b.y, b.r,32, c, f);
}
 

コード:

//Main.cpp
#include "DxLib.h"
#include "Input.h"
#include "Figure.h"


const int
SCREEN_WIDIH = 960,
SCREEN_HEIGHT = 540;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	//ログ消し
	SetOutApplicationLogValidFlag(FALSE);
	//ウインドウタイトルを変更
	SetMainWindowText("コリジョンテスト");
	//画面サイズ変更
	SetGraphMode(SCREEN_WIDIH, SCREEN_HEIGHT, 32);
	//ウィンドウモード変更と初期化と裏画面設定
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	const int X_size = 10;
	Box box[X_size];
	for (int i = 0; i < X_size; ++i)
	{
		box[i].x = 50 * i;
		box[i].y = 50;
		box[i].w = 50;
		box[i].h = 50;
		box[i].life = 100;
		box[i].color = 2;
	}

	Box Bar(100, 100, 100, 100,1,1);
	Circle ball(600, 300, 20, 3);

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0)
	{
		Updata_Key();
		
		if (Key(KEY_INPUT_ESCAPE) == 1)
		{
			break;
		}
		if (Key(KEY_INPUT_RIGHT) >= 1)
		{
			Bar.x += 5;
		}
		if (Key(KEY_INPUT_LEFT) >= 1)
		{
			Bar.x -= 5;
		}
		if (Key(KEY_INPUT_UP) >= 1)
		{
			Bar.y -= 5;
		}
		if (Key(KEY_INPUT_DOWN) >= 1)
		{
			Bar.y += 5;
		}

		Bar.My_DrawBox(Bar,Bar.color, true);
		for (int i = 0; i < X_size; ++i)
		{
			if (Bar.BoxCollision(box[i], Bar) == true)
			{
				box[i].life -= 1;
			}
			if (box[i].life > 0)
			{
				box[i].My_DrawBox(box[i],box[i].color ,true);
			}
			
		}
		ball.My_DrawCircle(ball, ball.color,true);
	}

	DxLib_End();
	return 0;
}

Re: オブジェクト(四角)の色の変更ができない

Posted: 2017年12月26日(火) 17:04
by みけCAT
オフトピック
staticなメンバ関数じゃないのにメンバ変数を有効活用せずに引数からパラメータを得ているなど、仕様に疑問点はありますが、それはおいておいて…
以下のファイルを追加し、コンパイルして実行してみました。
► スポイラーを表示
その結果、上キーで赤い四角形を上に動かしてみると、黒い四角形が赤い四角形の上に描画され、しばらくそのまま待っていると黒い四角形が消えることが確認できました。
tonari さんが書きました:Boxクラスの色指定処理部分がうまく反映されません。
Main.cppの31行目でbox.colorに直接色番号を代入して色を指定したつもりになっているものの、
GetColor関数を用いて実際に描画に使う色情報を得ていないのが原因であると思われます。

tonari さんが書きました:CircleクラスとBoxクラスのコンストラクタで色の指定をし、

きちんと「コンストラクタで」色の指定をし、と書いていますよね。

tonari さんが書きました:Circleは正しく描画されています。

Circleにも同様の問題がありますが、Circleのメンバ変数colorに外部から直接値を代入する処理が無いため、バグを踏んでいないだけですね。

例えば、

1. 色番号から色を求める関数

コード:

int Box::GetColorFromCode(int _c) {
	int color = GetColor(255, 255, 255);
	switch (_c)
	{
               //色指定処理
		case 1: color = GetColor(255, 0, 0); break;		//1は赤
		case 2: color = GetColor(0, 255, 0); break;		//2は青
		case 3: color = GetColor(0, 0, 255); break;		//3は緑
		case 4: color = GetColor(0, 0, 255); break;		//4は緑
		case 5: color = GetColor(0, 0, 255); break;		//5は緑
		case 6: color = GetColor(0, 0, 255); break;		//6は緑
		case 7: color = GetColor(0, 0, 255); break;		//7は緑
		case 8: color = GetColor(0, 0, 255); break;		//8は緑
		case 9: color = GetColor(0, 0, 255); break;		//9は緑
		case 0: color = GetColor(255, 255, 255); break;	//0は白
		
	}
	return color;
}
を追加する
2. コンストラクタのswitch文の部分をこの関数を用いて

コード:

	color = GetColorFromCode(_c);
に置き換える
3. 色番号を指定して色を設定する関数

コード:

void Box::SetFigureColor(int _c) {
	color = GetColorFromCode(_c);
}
を追加する
4. WinMain関数の色番号を代入している部分

コード:

		box[i].color = 2;
を、色を設定する処理

コード:

		box[i].SetFigureColor(2);
に置き換える

という修正をすると改善すると思います。
このような仕様変更をしたくなければ、値をメンバ変数に直接代入する

コード:

	for (int i = 0; i < X_size; ++i)
	{
		box[i].x = 50 * i;
		box[i].y = 50;
		box[i].w = 50;
		box[i].h = 50;
		box[i].life = 100;
		box[i].color = 2;
	}
のではなく、コンストラクタを用いる

コード:

	for (int i = 0; i < X_size; ++i)
	{
		box[i] = Box(50 * i, 50, 50, 50, 100, 2);
	}
ようにするといいでしょう。

Re: オブジェクト(四角)の色の変更ができない

Posted: 2017年12月26日(火) 17:34
by tonari
みけCATさん。回答ありがとうございます。仕様変更をしないほうで最初に試したところ、うまくいきました。この後はみけCATさんから教えていただいた仕様変更の部分もやってみます。
おかげで原因もわかり、問題も解決しました、ありがとうございます!