マウスをクリックする度に描画する文字を変更させたいです。

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

マウスをクリックする度に描画する文字を変更させたいです。

#1

投稿記事 by s707 » 14年前

//メイン関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
while(1){
graphic();
}
return 0 ;
}


//描画関数
#include "DxLib.h"
#define FontSize 48

void graphic(){
int Cr_0,Cr_1,Cr_2,Cr_3;
int MouseInput=0,MouseX=0,MouseY=0;
int click_count=0;
int now = 0, last = 0;
// 描画する文字列のサイズを設定
SetFontSize( FontSize ) ;

// マウスを表示状態にする
SetMouseDispFlag( TRUE ) ;

MouseInput = GetMouseInput() ;
while( ( MouseInput & MOUSE_INPUT_LEFT ) == 0 ){
if( ProcessMessage() == -1 ){
break ; // エラーが起きたらループから抜ける
}
// 白色の値を取得
Cr_0 = GetColor( 255 , 255 , 255 ) ;
Cr_1 = GetColor( 255 , 255 , 255 ) ;
Cr_2 = GetColor( 255 , 255 , 255 ) ;
Cr_3 = GetColor( 255 , 255 , 255 ) ;

// 文字列の描画
DrawString( 64 , 64 , "燃えるゴミ" , Cr_0 );
DrawString( 64 , 128 , "燃えないゴミ" , Cr_1 );
DrawString( 64 , 192 , "資源ゴミ" , Cr_2 );
DrawString( 64 , 256 , "再生日切替" , Cr_3 );

DrawString( 448 , 64 , "日曜日" , Cr_0 );
DrawString( 448 , 128 , "月曜日" , Cr_1 );
DrawString( 448 , 192 , "火曜日" , Cr_2 );
DrawString( 448 , 256 , "当日" , Cr_3 );

// マウスの入力を得る
MouseInput = GetMouseInput() ;
}
//ClearDrawScreen() ;//グラフィック(文字)を消す
// マウスの位置を取得
GetMousePoint( &MouseX , &MouseY ) ;

// マウスの入力を得る
MouseInput = GetMouseInput() ;
while(( MouseInput & MOUSE_INPUT_LEFT ) != 0){
if( ProcessMessage() == -1 ){
break ; // エラーが起きたらループから抜ける
}

now = 1;//今のフレームのマウスの状態 押しているので1

if(!last && now ){
if(MouseY < 64 + FontSize){//燃えるゴミの色変更
Cr_0 = GetColor( 255 , 255 , 0 ) ;
DrawString( 64 , 64 , "燃えるゴミ" , Cr_0 );

switch(click_count % 7){
case 0:
DrawString( 448 , 64 , "日曜日" , Cr_0 );
break;
case 1:
DrawString( 448 , 64 , "月曜日" , Cr_0 );
break;
case 2:
DrawString( 448 , 64 , "火曜日" , Cr_0 );
break;
case 3:
DrawString( 448 , 64 , "水曜日" , Cr_0 );
break;
case 4:
DrawString( 448 , 64 , "木曜日" , Cr_0 );
break;
case 5:
DrawString( 448 , 64 , "金曜日" , Cr_0 );
break;
case 6:
DrawString( 448 , 64 , "土曜日" , Cr_0 );
break;
}

}
else if(MouseY < 128 + FontSize ){//燃えないゴミの色変更
Cr_1 = GetColor( 255 , 255 , 0 ) ;
DrawString( 64 , 128 , "燃えないゴミ" , Cr_1 );

switch(click_count % 7){
case 0:
DrawString( 448 , 128 , "日曜日" , Cr_1 );
break;
case 1:
DrawString( 448 , 128 , "月曜日" , Cr_1 );
break;
case 2:
DrawString( 448 , 128 , "火曜日" , Cr_1 );
break;
case 3:
DrawString( 448 , 128 , "水曜日" , Cr_1 );
break;
case 4:
DrawString( 448 , 128 , "木曜日" , Cr_1 );
break;
case 5:
DrawString( 448 , 128 , "金曜日" , Cr_1 );
break;
case 6:
DrawString( 448 , 128 , "土曜日" , Cr_1 );
break;
}
}
else if(MouseY < 192 + FontSize ){//資源ゴミの色変更
Cr_2 = GetColor( 255 , 255 , 0 ) ;
DrawString( 64 , 192 , "資源ゴミ" , Cr_2 );

switch(click_count % 7){
case 0:
DrawString( 448 , 192 , "日曜日" , Cr_2 );
break;
case 1:
DrawString( 448 , 192 , "月曜日" , Cr_2 );
break;
case 2:
DrawString( 448 , 192 , "火曜日" , Cr_2 );
break;
case 3:
DrawString( 448 , 192 , "水曜日" , Cr_2 );
break;
case 4:
DrawString( 448 , 192 , "木曜日" , Cr_2 );
break;
case 5:
DrawString( 448 , 192 , "金曜日" , Cr_2 );
break;
case 6:
DrawString( 448 , 192 , "土曜日" , Cr_2 );
break;
}
}
else if(MouseY < 256 + FontSize){
Cr_3 = GetColor( 255 , 255 , 0 ) ;
DrawString( 64 , 256 , "再生日切替" , Cr_3 );

switch(click_count % 7){
case 0:
DrawString( 448 , 256 , "当日" , Cr_3 );
break;
case 1:
DrawString( 448 , 256 , "翌日" , Cr_3 );
break;
}
}
}
last = now;//前のフレームのマウスの状態を更新

click_count++;//押された時のみカウント

// マウスの入力を得る
MouseInput = GetMouseInput() ;
}
now = 0;//押していないので0
last= 0;
ClearDrawScreen() ;//グラフィック(文字)を消す
}



下記の様にwhileを追加してみても駄目でした。
何卒よろしくお願いします。

MouseInput = GetMouseInput() ;
while( ( MouseInput & MOUSE_INPUT_RIGHT ) == 0 ){//ここを追加
while(( MouseInput & MOUSE_INPUT_LEFT ) != 0){

アバター
沖 滉均
記事: 237
登録日時: 14年前
住所: K県F市

Re: マウスをクリックする度に描画する文字を変更させたいです。

#2

投稿記事 by 沖 滉均 » 14年前

まず、コードはcodeタグで括ってください。
それとは別にこのままじゃビルドも通りませんし、通せるように変更したところでDxLib_Initを呼ばずに
DXライブラリの関数を呼んでいますので正常に実行できません。
また、WinMain内で無限ループするようになっているため終了すらできません。

ご自身で実行してみましたか?
きちんと動く状態になってから再度質問されてはいかがでしょうか?
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

Re: マウスをクリックする度に描画する文字を変更させたいです。

#3

投稿記事 by バグ » 14年前

うーむ、どうなるのが正しい動作なのか分からなかったので、推測で書き直してみました。
デバッグ中に永久ループで固まるとマズイので、右クリックで終了する処理を入れてあります。不要ならば削除してください。

コード:

#include "DxLib.h"

#define FontSize 48

void graphic()
{
	// 描画する文字列のサイズを設定
	SetFontSize(FontSize);

	// マウスを表示状態にする
	SetMouseDispFlag(TRUE);

	// 文字列表示色を白で初期化しておく
	int nColor[4] = {GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF)};

	// 曜日情報保持用配列
	int nDayState[4] = {0, 0, 0, 0};

	// マウス状態管理用変数
	int nClickNow = 0;
	int nClickPrev = 0;

	// メッセージ処理と、画面の消去処理を行いつつ処理ループ
	while (ProcessMessage() != -1 && ClearDrawScreen() != -1)
	{
		// デバッグ用に右クリックで終了させる処理(不要なら削除してください)
		nClickNow = GetMouseInput();
		if ((nClickNow & MOUSE_INPUT_RIGHT) != 0)
		{
			// 右クリックされたら終了させる
			break;
		}

		// マウス状態の更新
		nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);
		if (nClickNow != 0 && nClickNow != nClickPrev)
		{
			// マウスの位置を取得
			int nMouseX = 0;
			int nMouseY = 0;
			GetMousePoint(&nMouseX, &nMouseY);

			// 文字の色と曜日の更新
			for (int i = 0; i < 4; ++i)
			{
				// クリックされた箇所の判定
				if (nMouseY > (64 * i) + FontSize && nMouseY < (64 * (i + 1) + FontSize))
				{
					// 色を変更して、曜日を1つ進める
					nColor[i] = GetColor(0xFF, 0xFF, 0x00);

					// 再生日切替の場合は0~1でループさせ、それ以外は0~6でループさせる
					nDayState[i] = (nDayState[i] + 1) % ((i == 3) ? 2 : 7); 
				}
				else
				{
					// 今回変更した箇所以外の色を戻す
					nColor[i] = GetColor(0xFF, 0xFF, 0xFF);
				}
			}
		}

		// 今回のクリック状態を保持する
		nClickPrev = nClickNow;

		// 文字列の描画
		const char* pszDay1[] = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"};
		const char* pszDay2[] = {"当日", "翌日"};
		DrawString( 64,  64, "燃えるゴミ", nColor[0]);
		DrawString( 64, 128, "燃えないゴミ", nColor[1]);
		DrawString( 64, 192, "資源ゴミ", nColor[2]);
		DrawString( 64, 256, "再生日切替", nColor[3]);
		DrawString(448,  64, pszDay1[nDayState[0]], nColor[0]);
		DrawString(448, 128, pszDay1[nDayState[1]], nColor[1]);
		DrawString(448, 192, pszDay1[nDayState[2]], nColor[2]);
		DrawString(448, 256, pszDay2[nDayState[3]], nColor[3]);
		ScreenFlip();
	} 
}


INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	// DXライブラリの初期化
	if (DxLib_Init() == -1)
	{
		 return -1;
	}

	// 裏画面モードに切り替え
	SetDrawScreen(DX_SCREEN_BACK);

	// メインループ
	graphic();

	// DXライブラリの終了処理
	DxLib_End();
	return 0;
}

s707

Re: マウスをクリックする度に描画する文字を変更させたいです。

#4

投稿記事 by s707 » 14年前

沖 滉均様、バグ様、ご返信ありがとうございます。

コードについては省略したものを載せ
コードについても括っていませんでした。
コメントを残すなど、配慮に欠けていました。
申し訳御座いません。

1回テストしてみます。

コード:

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
while(1){
graphic();
}
return 0 ;
}
動作についてはバグ様の記述と自分の望んでいた動作が一致していたので助かりました。
おかげさまで解決することが出来ました。ありがとうございます。

閉鎖

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