time.hとDrawRotaGraph2を使って時計を作成したい

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

time.hとDrawRotaGraph2を使って時計を作成したい

#1

投稿記事 by s707 » 7年前

ラジアン角を調整して、それをDrawRotaGraph2関数の第6引数に
渡せばいいとおもうのですが、いまいちうまくいきません。

どの様な値を渡せばいいでしょうか?

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

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#2

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

どう、上手くいかないのか試したソースコードを貼ってもらえますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

s707

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#3

投稿記事 by s707 » 7年前

softya(ソフト屋)様、ご返信ありがとうございます。

秒針部分です。
main関数は省略します。
main関数で以下の関数をループさせています。


秒針は60秒で360度の回転
フレームに変えると3600フレームで360度の回転

1フレームで0.1度の回転になります。

コード:

//draw_clock.cpp
#include <time.h>
#include "DxLib.h"
#define radius 192//時計(文字盤)の半径
#define PI	3.1415926535897932384626433832795f
void draw_clock(){
	time_t timer;
	struct tm *local;
	timer = time(NULL);//現在時刻を取得
	local = localtime(&timer); //地方時に変換

	int min[2],sec[2];
	min[0] = (local->tm_min / 10)%10;
	min[1] = local->tm_min % 10;

	sec[0] = (local->tm_sec / 10)%10;
	sec[1] = local->tm_sec % 10;

	// BMP画像のメモリへの読みこみ
	int GHandle[] = {LoadGraph( "Resourse./PNG/文字盤.png" ) ,LoadGraph( "Resourse./PNG/短針.png" ) ,LoadGraph( "Resourse./PNG/長針.png" ) ,LoadGraph( "Resourse./PNG/秒針.png" ) };

	DrawGraph( 128 , 64 , GHandle[0] , TRUE ) ;
	static double frame_count=0;
	frame_count += 0.1;
	for(int i=1;i<2;i++){
	    // 読みこんだグラフィックを回転描画
	    DrawRotaGraph2( 320, 240, 0, 0, 1.0,frame_count, GHandle[i], TRUE ) ;
	}
}

s707

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#4

投稿記事 by s707 » 7年前

これでもダメでした。
一秒で6度ずつ回転

コード:

void draw_clock(){
	time_t timer;
	struct tm *local;
	timer = time(NULL);//現在時刻を取得
	local = localtime(&timer); //地方時に変換

	int min[2],sec[2];
	min[0] = (local->tm_min / 10)%10;
	min[1] = local->tm_min % 10;

	sec[0] = (local->tm_sec / 10)%10;
	sec[1] = local->tm_sec % 10;

	// BMP画像のメモリへの読みこみ
	int GHandle[] = {LoadGraph( "Resourse./PNG/文字盤.png" ) ,LoadGraph( "Resourse./PNG/短針.png" ) ,LoadGraph( "Resourse./PNG/長針.png" ) ,LoadGraph( "Resourse./PNG/秒針.png" ) };

	DrawGraph( 128 , 64 , GHandle[0] , TRUE ) ;
	static double frame_count=0;
	frame_count += 0.1;
	for(int i=1;i<2;i++){
	    // 読みこんだグラフィックを回転描画
	    DrawRotaGraph2( 320, 240, 0, 0, 1.0,local->tm_sec*6, GHandle[i], TRUE ) ;
	}
}

アバター
みけCAT
記事: 6196
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#5

投稿記事 by みけCAT » 7年前

「local->tm_sec*6」→「(local->tm_sec*6)*PHI/180.0」でしょうか?
あとGHandleを毎回ロードするのもどうかと思います。
「static int GHandle (以下同じ)」としたらどうでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#6

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

まず問題点は、draw_clock()内でロードはやめてください。メモリリークでやがて落ちます。ロードだけの専用の関数で一回だけ読むようにしましょう。
あとlocal->tm_sec*6で角度を計算していますが、これだと度数法です。DXライブラリの関数はすべて弧度法(ラジアン角)ですので、ラジアン角への変換が必要です。
「ラジアン - Wikipedia」
http://ja.wikipedia.org/wiki/%E3%83%A9% ... 2%E3%83%B3
で簡単に言うと
double rad = (double)deg * PHI / 180.0;
で変換します。degが度数法の角度、radがラジアン角です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

s707

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#7

投稿記事 by s707 » 7年前

みけCAT様もご返信ありがとうございます。
試してみた所、秒針はうまくいきました。

draw_clock関数で下のヘッダーファイルをインクルードしてもロードできず画像が表示されません。
ロードを分割するにはどうすればいいでしょうか?

コード:

//Load.h
#include "DxLib.h"
static int GHandle[4] = {LoadGraph( "Resourse./PNG/文字盤.png" ) ,LoadGraph( "Resourse./PNG/短針.png" ) ,LoadGraph( "Resourse./PNG/長針.png" ) ,LoadGraph( "Resourse./PNG/秒針.png" ) };

アバター
SAI
記事: 115
登録日時: 8年前
住所: はひほーひ

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#8

投稿記事 by SAI » 7年前

グローバル領域でGHandle[4]を初期化しているので、DxLib_Init関数でDXライブラリが初期化される前にLoadGraph関数が呼ばれているのが原因と思われます。
ですので、変数は

コード:

static int GHandle[4];
としておいて、DxLib_Init関数を呼んだ後にGHandle[4]に代入するとよいのではないでしょうか。
Alea jacta est !

s707

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#9

投稿記事 by s707 » 7年前

SAI様、ご返信ありがとうございます。

draw_clock.cppをメイン関数でインクルードし
DxLib_Init関数のすぐ後で

コード:

GHandle[0] = LoadGraph( "Resourse./PNG/文字盤.png" );
GHandle[1] = LoadGraph( "Resourse./PNG/秒針.png" );
としてみたところエラーが発生しました。
1>main.obj : error LNK2005: "void __cdecl draw_clock(void)" (?draw_clock@@YAXXZ) は既に draw_clock.obj で定義されています。

コード:

//draw_clock.cpp
#include <time.h>
#include "DxLib.h"
#pragma warning ( disable : 4996 )
static int GHandle[4];

#define radius 192//時計(文字盤)の半径
#define PI	3.1415926535897932384626433832795f
void draw_clock(){
	time_t timer;
	struct tm *local;
	timer = time(NULL);//現在時刻を取得
	local = localtime(&timer); //地方時に変換

	int min[2],sec[2];
	min[0] = (local->tm_min / 10)%10;
	min[1] = local->tm_min % 10;

	sec[0] = (local->tm_sec / 10)%10;
	sec[1] = local->tm_sec % 10;	

	DrawGraph( 128 , 64 , GHandle[0] , TRUE ) ;
	static double frame_count=0;
	frame_count += 0.1;
	for(int i=1;i<2;i++){
	    // 読みこんだグラフィックを回転描画
	    DrawRotaGraph2( 320, 240, 0, 0, 1.0,(local->tm_sec*6)*PI/180, GHandle[i], TRUE ) ;
	}
}




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

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#10

投稿記事 by h2so5 » 7年前

s707 さんが書きました: draw_clock.cppをメイン関数でインクルードし
DxLib_Init関数のすぐ後で

コード:

GHandle[0] = LoadGraph( "Resourse./PNG/文字盤.png" );
GHandle[1] = LoadGraph( "Resourse./PNG/秒針.png" );
としてみたところエラーが発生しました。
1>main.obj : error LNK2005: "void __cdecl draw_clock(void)" (?draw_clock@@YAXXZ) は既に draw_clock.obj で定義されています。
cppファイルをインクルードするのではなく、
プロトタイプ宣言を書いたdraw_clock.h をインクルードしてください。

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

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#11

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

cppをインクルードするのはやめてくださいね。
それなりの事情がない限りは避けるべき行為です。

それよりも前にロードする関数を作ってくださいと書いたのですが、どうしてもGHandleをグローバル参照したいですか?
draw_clock.cpp側にロードする関数を作れば、ファイル内スコープのGHandleで済みますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

s707

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#12

投稿記事 by s707 » 7年前

おかげさまで処理が軽くなり、表示も8割方うまくいってます。
ただ少し問題があり秒針、短針、長針が残像の様に表示されてしまうことです。
ソースは下記のようになりました。

コード:

//draw_clock.h
void draw_clock();
void Load();

//draw_clock.cpp
#include <time.h>
#include "DxLib.h"
#pragma warning ( disable : 4996 )

#define radius 192//時計(文字盤)の半径
#define PI	3.1415926535897932384626433832795f

static int GHandle[4];

void draw_clock(){
	time_t timer;
	struct tm *local;
	timer = time(NULL);//現在時刻を取得
	local = localtime(&timer); //地方時に変換

	// 読みこんだグラフィックを回転描画
	DrawGraph( 128 , 64 , GHandle[0] , TRUE ) ;//文字盤
	DrawRotaGraph2( 320, 240, 0, 0, 1.0,( (local->tm_hour%12)*30 + (local->tm_min/2) + 180)*PI/180, GHandle[1], TRUE ) ;//短針  時間*30度%12時間 + 分/2   1分毎に0.5度づつ進む為/2
	DrawRotaGraph2( 320, 240, 0, 0, 1.0,( (local->tm_min*6) + 180)*PI/180, GHandle[2], TRUE ) ;//長針
	DrawRotaGraph2( 320, 240, 0, 0, 1.0,( (local->tm_sec*6) + 180)*PI/180, GHandle[3], TRUE ) ;//秒針
}

void Load(){
	GHandle[0] = LoadGraph( "Resourse./PNG/文字盤.png" );
	GHandle[1] = LoadGraph( "Resourse./PNG/短針.png");
	GHandle[2] = LoadGraph( "Resourse./PNG/長針.png" );
	GHandle[3] = LoadGraph( "Resourse./PNG/秒針.png");
}

//main.cpp
#include "DxLib.h"
#include "dayData.h"
#include "draw_clock.h"

void option(struct dayData* day);
void Time(struct dayData* day);
void date(struct dayData* day);
void load_day(struct dayData* day);
void save_day(struct dayData* day);
int title(int,struct dayData* day);
void draw_clock();

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
	struct dayData day[100];
	// マウス状態管理用変数
	int nClickNow = 0 , nClickPrev = 0;
	int nClickNow_R = 0 , nClickPrev_R = 0;
	int nClickR_Count = 0;

	int status = 0;

	SetMainWindowText("clock");
	ChangeWindowMode( TRUE );
	SetWindowSizeExtendRate(0.5);	

	SetDrawScreen(DX_SCREEN_BACK);
	SetWindowStyleMode(2);
//	SetWindowPosition(1200, 720 ) ;

	if ( DxLib_Init( ) == -1 ) return -1;

	Load();

	while (1){
		if(GetMouseInput() & MOUSE_INPUT_LEFT) {			
			SendMessage(GetMainWindowHandle(), WM_NCLBUTTONDOWN, HTCAPTION, 0);//ウインドウを移動させる為、ウインドウ枠をクリックしたと思わせる
		}

		draw_clock();
		load_day(day);//日にちを読み込む
		// マウス状態の更新
		nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);
		nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);

		if(	nClickNow_R )nClickR_Count++;//右クリックを押しているときはカウントアップ
		else{nClickR_Count = 0;}//それ以外ではカウントを0にする

		if ( ProcessMessage() == -1 || !status && nClickR_Count == 1){  // プロセスメッセージは1ループ毎に1回必要
			break;
		}

		if ( nClickNow_R && !nClickPrev_R){
			status = 0;
			ClearDrawScreen();
		}

		int temp = title(status,day);

		if( nClickNow && !nClickPrev){
			if(temp)
				status = temp;

			if(status == 1){
				Time(day);
				status = 0;
			}
			else if(status == 2 ){
				date(day);
				status = 0;
			}
			else if(status){
				option(day);
				save_day(day);//日にちを書き込む
			}
		}

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

	DxLib_End(); 
	return 0;
}

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

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#13

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

毎フレーム呼び必要があるClearDrawScreen();に条件があるのはなぜでしょう?
ScreenFlip();も見当たりません。

こちらを参考に骨格として必要最小限なものは抜かないようにしてください。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/01_09.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

s707

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#14

投稿記事 by s707 » 7年前

時計の針は館を確認して修正しました。
しかし、修正した際にoption関数の
DrawString関数が表示されなくなりました。
今の所は不明なので、もう少し煮詰めてみます。

コード:

//main.cpp
#include "DxLib.h"
#include "dayData.h"
#include "draw_clock.h"

void option(struct dayData* day);
void Time(struct dayData* day);
void date(struct dayData* day);
void load_day(struct dayData* day);
void save_day(struct dayData* day);
int title(int,struct dayData* day);
void draw_clock();

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
	struct dayData day[100];
	// マウス状態管理用変数
	int nClickNow = 0 , nClickPrev = 0;
	int nClickNow_R = 0 , nClickPrev_R = 0;
	int nClickR_Count = 0;

	int status = 0;

	SetMainWindowText("clock");
	ChangeWindowMode( TRUE );
	SetWindowSizeExtendRate(0.5);	

	SetDrawScreen(DX_SCREEN_BACK);
	SetWindowStyleMode(2);
//	SetWindowPosition(1200, 720 ) ;

	if ( DxLib_Init( ) == -1 ) return -1;

	Load();

	while (ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){
		if(GetMouseInput() & MOUSE_INPUT_LEFT) {			
			SendMessage(GetMainWindowHandle(), WM_NCLBUTTONDOWN, HTCAPTION, 0);//ウインドウを移動させる為、ウインドウ枠をクリックしたと思わせる
		}

		draw_clock();
		load_day(day);//日にちを読み込む
		// マウス状態の更新
		nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);
		nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);

		if(	nClickNow_R )nClickR_Count++;//右クリックを押しているときはカウントアップ
		else{nClickR_Count = 0;}//それ以外ではカウントを0にする

		if (!status && nClickR_Count == 1){
			break;
		}

		if ( nClickNow_R && !nClickPrev_R){
			status = 0;
		}

		int temp = title(status,day);

		if( nClickNow && !nClickPrev){
			if(temp)
				status = temp;

			if(status == 1){
				Time(day);
				status = 0;
			}
			else if(status == 2 ){
				date(day);
				status = 0;
			}
			else if(status){
				option(day);
				save_day(day);//日にちを書き込む
			}
		}

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

	DxLib_End(); 
	return 0;
}


//title.cpp
#include "DxLib.h"
#include "dayData.h"
#include <time.h>
#pragma warning ( disable : 4996 )
#define  FontSize 40

int title(int menu_number,struct dayData* day){
	int SHandle[35];

	int status=0;
	time_t timer;
	struct tm *local;
	timer = time(NULL);//現在時刻を取得
	local = localtime(&timer); //地方時に変換

	int min[2],sec[2];
	min[0] = (local->tm_min / 10)%10;
	min[1] = local->tm_min % 10;

	sec[0] = (local->tm_sec / 10)%10;
	sec[1] = local->tm_sec % 10;

	if( !min[0] && !min[1] && !sec[0] && !sec[1] && !status )status = 1;//一時間毎に時刻を読む

	if(menu_number != 3){//オプション以外
		int Cr_0,Cr_1,Cr_2 ;
		int	MouseInput=0,MouseX=0,MouseY=0;

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

		// 白色の値を取得
		Cr_0 = GetColor( 0xff , 0xff , 0xff ) ;
		Cr_1 = GetColor( 0xff , 0xff , 0xff ) ;
		Cr_2 = GetColor( 0xff , 0xff , 0xff ) ;

		// 文字列の描画
		DrawString( 16 , 384 , "時刻" , Cr_0 );
		DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
		DrawString( 416 , 384 , "オプション" , Cr_2 );

		// マウスの位置を取得
		GetMousePoint( &MouseX , &MouseY ) ;

		if(MouseX > 20 && MouseX < 176 && MouseY > 384 && MouseY < 384 + FontSize){//時刻の色変更
			Cr_0 = GetColor( 0xff , 0xff , 0 ) ;
			status = 1;
		}
		else if(MouseX >= 176 && MouseX < 416 && MouseY > 384  && MouseY < 384 + FontSize){//日付・曜日の色変更
			Cr_1 = GetColor( 0xff , 0xff , 0 ) ;
			status = 2;
		}
		else if(MouseX >= 416 && MouseY > 384  && MouseY < 384 + FontSize){//オプションの色変更
			Cr_2 = GetColor( 0xff , 0xff , 0 ) ;
			status = 3;
		}
		else
			status = 0;
		// 文字列の描画
		DrawString( 16 , 384 , "時刻" , Cr_0 );
		DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
		DrawString( 416 , 384 , "オプション" , Cr_2 );


		int arr;
		static int frmcnt = 0;
		frmcnt++;
		static bool alarm = false;
		char ganjitsu[6] = "01010", nanakusa[6] = "01070", seijin[6] = "01100", setsubun[6] = "02030", kenkoku[6] = "02110", syunbun[6] = "03210", syouwa[6] = "04290", kenpou[6] = "05030", midori[6] = "05040", kodomo[6] = "05050", umi[6] = "07180",
			 keirou[6] = "09190", syuubun[6] = "09230", taiiku[6] = "10100", bunka[6] = "11030", sitsigosan[6] = "11150", kinrou[6] = "11230", tennou[6] = "12230", Xmas_eve[6] = "12240", Xmas[6] = "12250", kyou[6] = "09160";

		if(!alarm && frmcnt == 1){
			if(( day + 3 ) -> number[0] - '0' == 0 ){//設定した日 0なら当日 1なら前日
				arr = 0;
				for(int i = 0; i<3; i++){//先にデータロードを完了させる
					SHandle[i]   = LoadSoundMem( (day + i + 4) -> name ) ;
					SHandle[i+3] = LoadSoundMem( (day + i + 7) -> name ) ;
				}

				for(int i = 0; i<3; i++){
					if( local->tm_wday == ( (day + i) -> number[0] - '0') ){

						if(!alarm){
							PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;//今日
							while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
							arr = 2;
							PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;//は
							while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
						}

						if(i == 0){     arr = 3; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//燃えるゴミ
						else if(i == 1){arr = 4; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//燃えないゴミ
						else if(i == 2){arr = 5; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//資源ゴミ
						while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
						alarm = true;
					}
				}

				for(int i = 10; i<36; i++){
					int hiduke = 1;
					bool sound = false;
					switch(local->tm_yday){
					case 0://元日
						hiduke = strcmp((day+i)->number, ganjitsu);
						if( !hiduke )sound = true;
						break;
					case 6://七草
						hiduke = strcmp((day+i)->number, nanakusa);
						if( !hiduke )sound = true;
						break;
					case 9://成人の日
						hiduke = strcmp((day+i)->number, seijin);
						if( !hiduke )sound = true;
						break;
					case 33://節分
						hiduke = strcmp((day+i)->number, setsubun);
						if( !hiduke )sound = true;
						break;
					case 41://建国記念日
						hiduke = strcmp((day+i)->number, kenkoku);
						if( !hiduke )sound = true;
						break;
					case 79://春分の日
						hiduke = strcmp((day+i)->number, syunbun);
						if( !hiduke )sound = true;
						break;
					case 118://昭和の日
						hiduke = strcmp((day+i)->number, syouwa);
						if( !hiduke )sound = true;
						break;
					case 122://憲法記念日
						hiduke = strcmp((day+i)->number, kenpou);
						if( !hiduke )sound = true;
						break;
					case 123://みどりの日
						hiduke = strcmp((day+i)->number, midori);
						if( !hiduke )sound = true;
						break;
					case 124://こどもの日
						hiduke = strcmp((day+i)->number, kodomo);
						if( !hiduke )sound = true;
						break;
					case 160://海の日
						hiduke = strcmp((day+i)->number, umi);
						if( !hiduke )sound = true;
						break;
					case 261://敬老の日
						hiduke = strcmp((day+i)->number, keirou);
						if( !hiduke )sound = true;
						break;
					case 265://秋分の日
						hiduke = strcmp((day+i)->number, syuubun);
						if( !hiduke )sound = true;
						break;
					case 282://体育の日
						hiduke = strcmp((day+i)->number, taiiku);
						if( !hiduke )sound = true;
						break;
					case 306://文化の日
						hiduke = strcmp((day+i)->number, bunka);
						if( !hiduke )sound = true;
						break;
					case 318://七五三
						hiduke = strcmp((day+i)->number, sitsigosan);
						if( !hiduke )sound = true;
						break;
					case 326://勤労感謝の日
						hiduke = strcmp((day+i)->number, kinrou);
						if( !hiduke )sound = true;
						break;
					case 356://天皇誕生日
						hiduke = strcmp((day+i)->number, tennou);
						if( !hiduke )sound = true;
						break;
					case 357://クリスマスイヴ
						hiduke = strcmp((day+i)->number, Xmas_eve);
						if( !hiduke )sound = true;
						break;
					case 358://クリスマス
						hiduke = strcmp((day+i)->number, Xmas);
						if( !hiduke )sound = true;
						break;
					}

					if(sound){//音声再生フラグがon
						SHandle[i-3] = LoadSoundMem( (day + i) -> name ) ;
						PlaySoundMem( SHandle[i-3] , DX_PLAYTYPE_BACK ) ;
						while( CheckSoundMem( SHandle[i-3] ) == 1 ){}// なり終わるまでここでループ
					}
				}

			}
			else if(( day + 3 ) -> number[0] - '0' == 1 ){//前日設定
				arr = 1;
				for(int i = 0; i<3; i++){//先にデータロードを完了させる
					SHandle[i]   = LoadSoundMem( (day + i + 4) -> name ) ;
					SHandle[i+3] = LoadSoundMem( (day + i + 7) -> name ) ;
				}

				for(int i = 0; i<3; i++){
					if( local->tm_wday - ((day + i) -> number[0] - '0') == -1 || local->tm_wday - ((day + i) -> number[0] - '0') == 6){//燃えるゴミ

						if(!alarm){
							PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;//明日
							while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
							arr = 2;
							PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;//は
							while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
						}

						if(i == 0){     arr = 3; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//燃えるゴミ
						else if(i == 1){arr = 4; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//燃えないゴミ
						else if(i == 2){arr = 5; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//資源ゴミ
						while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
						alarm = true;
					}
				}

				for(int i = 10; i<36; i++){
					int hiduke = 1;
					bool sound = false;
					switch(local->tm_yday){
					case 365://元日の前日
						hiduke = strcmp((day+i)->number, ganjitsu);
						if( !hiduke )sound = true;
						break;
					case 5://七草の前日
						hiduke = strcmp((day+i)->number, nanakusa);
						if( !hiduke )sound = true;
						break;
					case 8://成人の日の前日
						hiduke = strcmp((day+i)->number, seijin);
						if( !hiduke )sound = true;
						break;
					case 32://節分の前日
						hiduke = strcmp((day+i)->number, setsubun);
						if( !hiduke )sound = true;
						break;
					case 40://建国記念日の前日
						hiduke = strcmp((day+i)->number, kenkoku);
						if( !hiduke )sound = true;
						break;
					case 78://春分の日の前日
						hiduke = strcmp((day+i)->number, syunbun);
						if( !hiduke )sound = true;
						break;
					case 117://昭和の日の前日
						hiduke = strcmp((day+i)->number, syouwa);
						if( !hiduke )sound = true;
						break;
					case 121://憲法記念日の前日
						hiduke = strcmp((day+i)->number, kenpou);
						if( !hiduke )sound = true;
						break;
					case 122://みどりの日の前日
						hiduke = strcmp((day+i)->number, midori);
						if( !hiduke )sound = true;
						break;
					case 123://こどもの日の前日
						hiduke = strcmp((day+i)->number, kodomo);
						if( !hiduke )sound = true;
						break;
					case 159://海の日の前日
						hiduke = strcmp((day+i)->number, umi);
						if( !hiduke )sound = true;
						break;
					case 260://敬老の日の前日
						hiduke = strcmp((day+i)->number, keirou);
						if( !hiduke )sound = true;
						break;
					case 264://秋分の日の前日
						hiduke = strcmp((day+i)->number, syuubun);
						if( !hiduke )sound = true;
						break;
					case 281://体育の日の前日
						hiduke = strcmp((day+i)->number, taiiku);
						if( !hiduke )sound = true;
						break;
					case 305://文化の日の前日
						hiduke = strcmp((day+i)->number, bunka);
						if( !hiduke )sound = true;
						break;
					case 317://七五三の前日
						hiduke = strcmp((day+i)->number, sitsigosan);
						if( !hiduke )sound = true;
						break;
					case 325://勤労感謝の日の前日
						hiduke = strcmp((day+i)->number, kinrou);
						if( !hiduke )sound = true;
						break;
					case 355://天皇誕生日の前日
						hiduke = strcmp((day+i)->number, tennou);
						if( !hiduke )sound = true;
						break;
					case 356://クリスマスイヴの前日
						hiduke = strcmp((day+i)->number, Xmas_eve);
						if( !hiduke )sound = true;
						break;
					case 357://クリスマスの前日
						hiduke = strcmp((day+i)->number, Xmas);
						if( !hiduke )sound = true;
						break;
					}

					if(sound){//音声再生フラグがon
						SHandle[i-3] = LoadSoundMem( (day + i) -> name ) ;
						PlaySoundMem( SHandle[i-3] , DX_PLAYTYPE_BACK ) ;
						while( CheckSoundMem( SHandle[i-3] ) == 1 ){}// なり終わるまでここでループ
					}
				}
			}
		}
	}
	InitSoundMem() ;//サウンドデータの削除
	return status;
}


//option.cpp
#include "DxLib.h"
#include "dayData.h"

#define FontSize 48

void option(struct dayData* day)
{
	// 描画する文字列のサイズを設定
	SetFontSize(FontSize);

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

	int nMouseX = 0;
	int nMouseY = 0;

	// マウスの位置を取得
	GetMousePoint(&nMouseX, &nMouseY);
	static int arr[4] = {( day + 0 ) -> number[0],( day + 1 ) -> number[0],( day + 2 ) -> number[0],( day + 3 ) -> number[0]};//配列の添え字になる変数

	// 文字の色と曜日の更新
	for (int i = 0; i < 4; ++i)
	{
		( day + i ) -> number[0] -= '0';//アスキーコードを配列の要素数に変換 '0'は48と同じ

		// クリックされた箇所の判定
		if (nMouseY > (64 * i) + FontSize && nMouseY < (64 * (i + 1) + FontSize))
		{
			// 色を変更して、曜日を1つ進める
			nColor[i] = GetColor(0xFF, 0xFF, 0x00);
			// 再生日切替の場合は0~1でループさせ、それ以外は0~6でループさせる 1回押されたら1%7又は1%2で月曜 翌日
			( day + i ) -> number[0] = ( ( day + i ) -> number[0] + 1 ) % ((i == 3) ? 2 : 7);
		}
		else
		{
			// 今回変更した箇所以外の色を戻す
			nColor[i] = GetColor(0xFF, 0xFF, 0xFF);
		}

		arr[i] = ( day + i ) -> number[0];		

	}

	// 文字列の描画
	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[ arr[0] ], nColor[0]);
	DrawString(448, 128, pszDay1[ arr[1] ], nColor[1]);
	DrawString(448, 192, pszDay1[ arr[2] ], nColor[2]);
	DrawString(448, 256, pszDay2[ arr[3] ], nColor[3]);

	//画面に表示したので配列の要素数をアスキーコードに戻す
	for (int i = 0; i < 4; ++i){
		( day + i ) -> number[0] += '0';//'0'は48と同じ
	}
}

//-----------------------------------------------------------------------------
// Name: load_day()
// Desc: 日にち読み込み関数
//-----------------------------------------------------------------------------
void load_day(struct dayData* day){
	char key1[7]="name00";
	char key2[6]="day00";

	//INIファイル読み込み
	for(int i=0;i<100;i++){//燃える 燃えない 資源 再生日切り替えの4つ
		GetPrivateProfileString("Day",key1,"--------", (day+i) -> name,30,"Resourse./Day.INI");
		GetPrivateProfileString("Day",key2,"00000"   , (day+i) -> number,6,"Resourse./Day.INI");
		key1[5]++;//アンダーラインの後ろの数字をインクリメント
		key2[4]++;

		if(key1[5] == ':'){ key1[4]++; key1[5] = '0';}//10の位をプラス 1の位を0に 
		if(key2[4] == ':'){ key2[3]++; key2[4] = '0';}
	}
}
//-----------------------------------------------------------------------------
// Name: save_day()
// Desc: 日にち書き込み関数
//-----------------------------------------------------------------------------
void save_day(struct dayData* day){
	char key1[7]="name00";
	char key2[6]="day00";

	//INIファイル書き込み
	for(int i=0;i<100;i++){//燃える 燃えない 資源 再生日切り替えの4つ
		WritePrivateProfileString("Day",key1, (day+i) -> name,"Resourse./Day.INI");
		WritePrivateProfileString("Day",key2, (day+i) -> number,"Resourse./Day.INI");
		key1[5]++;
		key2[4]++;
		
		if(key1[5] == ':'){ key1[4]++; key1[5] = '0';}
		if(key2[4] == ':'){ key2[3]++; key2[4] = '0';}
	}
}

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

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#15

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

こちらではdayData.hがないのでコンパイルが通りませんが、たぶんoption()関数の呼び出しに条件があるからだと思います。
特定の条件でoptionを表示したいなら、その条件になったら呼び出し続けないといけません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

s707

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#16

投稿記事 by s707 » 7年前

option関数を2つに分けました。

option画面を表示するoption_draw関数
option画面の処理をするoption関数

今の処理だと失敗してセーブされるので
Day.INIの8行目までおかしくなります。

コード:

//dayData.h
struct dayData{
    char name[30];
    char number[6];
} ;


//Day.INI
[Day]
name00=00000000
day00=10000
name01=00000000
day01=20000
name02=00000000
day02=30000
name03=00000000
day03=00000

name04=se/timer_kyou.ogg
day04=00000
name05=se/timer_ashita.ogg
day05=00000
name06=se/wa_01.ogg
day06=00000
name07=se/moerugominohi_01.ogg
day07=00000
name08=se/moenaigominohi_01.ogg
day08=00000
name09=se/shigengominohi_01.ogg
day09=00000

name10=se/ganjitsu.ogg
day10=01010
name11=se/nanakusa.ogg
day11=01070
name12=se/seijin.ogg
day12=01100
name13=se/setsubun.ogg
day13=02030
name14=se/kenkoku.wa
day14=02110
name15=se/syunbun.wa
day15=03210
name16=se/syouwa.ogg
day16=04290
name17=se/kenpou.ogg
day17=05030
name18=se/midori.ogg
day18=05040
name19=se/kodomo.ogg
day19=05050
name20=se/umi.ogg
day20=07180
name21=se/keirou.ogg
day21=09190
name22=se/syuubun.ogg
day22=09230
name23=se/taiiku.ogg
day23=10100
name24=se/bunka.ogg
day24=11030
name25=se/sitsigosan.ogg
day25=11150
name26=se/kinrou.ogg
day26=11230
name27=se/tennou.ogg
day27=12230
name28=se/Xmas_eve.ogg
day28=12240
name29=se/Xmas.ogg
day29=12250

name30=se/num001_01.ogg
day30=00000
name31=se/num002_01.ogg
day31=00000
name32=se/num003_01.ogg
day32=00000
name33=se/num004_01.ogg
day33=00000
name34=se/num005_01.ogg
day34=00000
name35=se/num006_01.ogg
day35=00000
name36=se/num007_01.ogg
day36=00000
name37=se/num008_01.ogg
day37=00000
name38=se/num009_01.ogg
day38=00000
name39=se/num010_01.ogg
day39=00000
name40=se/num011_01.ogg
day40=00000
name41=se/num012_01.ogg
day41=00000
name42=se/num020_01.ogg
day42=00000
name43=se/num030_02.ogg
day43=00000
name44=se/num040_01.ogg
day44=00000
name45=se/num050_02.ogg
day45=00000
name46=se/nichiyoubi.ogg
day46=00000
name47=se/getsuyoubi.ogg
day47=00000
name48=se/kayoubi.ogg
day48=00000
name49=se/suiyoubi.ogg
day49=00000
name50=se/mokuyoubi.ogg
day50=00000
name51=se/kinnyoubi.ogg
day51=00000
name52=se/doyoubi.ogg
day52=00000
name53=se/jihou_0ji_02.ogg
day53=00000
name54=se/jihou_1ji.ogg
day54=00000
name55=se/jihou_2ji.ogg
day55=00000
name56=se/jihou_3ji.ogg
day56=00000
name57=se/jihou_4ji.ogg
day57=00000
name58=se/jihou_5ji.ogg
day58=00000
name59=se/jihou_6ji.ogg
day59=00000
name60=se/jihou_7ji.ogg
day60=00000
name61=se/jihou_8ji.ogg
day61=00000
name62=se/jihou_9ji.ogg
day62=00000
name63=se/jihou_10ji.ogg
day63=00000
name64=se/jihou_11ji.ogg
day64=00000
name65=se/jihou_12ji.ogg
day65=00000
name66=se/fun_01.ogg
day66=00000
name67=se/jihou_1pun.ogg
day67=00000
name68=se/jihou_2fun.ogg
day68=00000
name69=se/jihou_3pun.ogg
day69=00000
name70=se/jihou_4fun.ogg
day70=00000
name71=se/jihou_5fun.ogg
day71=00000
name72=se/jihou_6pun.ogg
day72=00000
name73=se/jihou_7fun.ogg
day73=00000
name74=se/jihou_8fun.ogg
day74=00000
name75=se/jihou_9fun.ogg
day75=00000
name76=se/jihou_10pun.ogg
day76=00000
name77=se/gatsu_01.ogg
day77=00000
name78=se/nichi_01.ogg
day78=00000
name79=se/desu_02.ogg
day79=00000
name80=se/tsuitatsi.ogg
day80=00000
name81=se/hutsuka.ogg
day81=00000
name82=se/mikka.ogg
day82=00000
name83=se/yokka.ogg
day83=00000
name84=se/itsuka.ogg
day84=00000
name85=se/muika.ogg
day85=00000
name86=se/nanoka.ogg
day86=00000
name87=se/youka.ogg
day87=00000
name88=se/kokonoka.ogg
day88=00000
name89=se/tooka.ogg
day89=00000
name90=se/hatsuka.ogg
day90=00000

name91=00000000
day91=00000
name92=00000000
day92=00000
name93=00000000
day93=00000
name94=00000000
day94=00000
name95=00000000
day95=00000
name96=00000000
day96=00000
name97=00000000
day97=00000
name98=00000000
day98=00000
name99=00000000
day99=00000


//main.cpp
#include "DxLib.h"
#include "dayData.h"
#include "draw_clock.h"

void option(struct dayData* day);
void option_draw(struct dayData* day);
void Time(struct dayData* day);
void date(struct dayData* day);
void load_day(struct dayData* day);
void save_day(struct dayData* day);
int title(int,struct dayData* day);
void draw_clock();

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
	struct dayData day[100];
	// マウス状態管理用変数
	int nClickNow = 0 , nClickPrev = 0;
	int nClickNow_R = 0 , nClickPrev_R = 0;
	int nClickR_Count = 0;

	int status = 0;

	SetMainWindowText("clock");
	ChangeWindowMode( TRUE );
	SetWindowSizeExtendRate(0.5);	

	SetDrawScreen(DX_SCREEN_BACK);
	SetWindowStyleMode(2);
	//	SetWindowPosition(1200, 720 ) ;

	if ( DxLib_Init( ) == -1 ) return -1;

	Load();

	while (ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){
		if(GetMouseInput() & MOUSE_INPUT_LEFT) {			
			SendMessage(GetMainWindowHandle(), WM_NCLBUTTONDOWN, HTCAPTION, 0);//ウインドウを移動させる為、ウインドウ枠をクリックしたと思わせる
		}

		draw_clock();
		load_day(day);//日にちを読み込む
		// マウス状態の更新
		nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);
		nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);

		if(	nClickNow_R )nClickR_Count++;//右クリックを押しているときはカウントアップ
		else{nClickR_Count = 0;}//それ以外ではカウントを0にする

		if (!status && nClickR_Count == 1){
			break;
		}

		if ( nClickNow_R && !nClickPrev_R){
			status = 0;
		}

		int temp = title(status,day);

		if( nClickNow && !nClickPrev){
			if(temp)
				status = temp;

			if(status == 1){
				Time(day);
				status = 0;
			}
			else if(status == 2 ){
				date(day);
				status = 0;
			}
			else if(status){
				option(day);
				save_day(day);//日にちを書き込む
			}
		}

		if(status == 3){
			option_draw(day);
		}

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

	DxLib_End(); 
	return 0;
}


//option.cpp
#include "DxLib.h"
#include "dayData.h"

#define FontSize 48

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

void option_draw(struct dayData* day){
	for(int i=0;i<4;i++){
		if(( day + i ) -> number[0] >= 48)( day + i ) -> number[0] -= '0';//アスキーコードを配列の要素数に変換 '0'は48と同じ
	    arr[i] = ( day + i ) -> number[0];//配列の添え字になる変数
	}
	// 文字列の描画
	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[ arr[0] ], nColor[0]);
	DrawString(448, 128, pszDay1[ arr[1] ], nColor[1]);
	DrawString(448, 192, pszDay1[ arr[2] ], nColor[2]);
	DrawString(448, 256, pszDay2[ arr[3] ], nColor[3]);

	//画面に表示したので配列の要素数をアスキーコードに戻す
	for (int i = 0; i < 4; ++i){
		( day + i ) -> number[0] += '0';//'0'は48と同じ
	}
}

void option(struct dayData* day){
	// 描画する文字列のサイズを設定
	SetFontSize(FontSize);

	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でループさせる 1回押されたら1%7又は1%2で月曜 翌日
			( day + i ) -> number[0] = ( ( day + i ) -> number[0] + 1 ) % ((i == 3) ? 2 : 7);
		}
		else
		{
			// 今回変更した箇所以外の色を戻す
			nColor[i] = GetColor(0xFF, 0xFF, 0xFF);
		}

		arr[i] = ( day + i ) -> number[0];		

	}
}

//-----------------------------------------------------------------------------
// Name: load_day()
// Desc: 日にち読み込み関数
//-----------------------------------------------------------------------------
void load_day(struct dayData* day){
	char key1[7]="name00";
	char key2[6]="day00";

	//INIファイル読み込み
	for(int i=0;i<100;i++){//燃える 燃えない 資源 再生日切り替えの4つ
		GetPrivateProfileString("Day",key1,"--------", (day+i) -> name,30,"Resourse./Day.INI");
		GetPrivateProfileString("Day",key2,"00000"   , (day+i) -> number,6,"Resourse./Day.INI");
		key1[5]++;//アンダーラインの後ろの数字をインクリメント
		key2[4]++;

		if(key1[5] == ':'){ key1[4]++; key1[5] = '0';}//10の位をプラス 1の位を0に 
		if(key2[4] == ':'){ key2[3]++; key2[4] = '0';}
	}
}
//-----------------------------------------------------------------------------
// Name: save_day()
// Desc: 日にち書き込み関数
//-----------------------------------------------------------------------------
void save_day(struct dayData* day){
	char key1[7]="name00";
	char key2[6]="day00";

	//INIファイル書き込み
	for(int i=0;i<100;i++){//燃える 燃えない 資源 再生日切り替えの4つ
		WritePrivateProfileString("Day",key1, (day+i) -> name,"Resourse./Day.INI");
		WritePrivateProfileString("Day",key2, (day+i) -> number,"Resourse./Day.INI");
		key1[5]++;
		key2[4]++;
		
		if(key1[5] == ':'){ key1[4]++; key1[5] = '0';}
		if(key2[4] == ':'){ key2[3]++; key2[4] = '0';}
	}
}


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

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#17

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

いまいちs707 さんのやりたいoptionの仕組みが理解できていないのでアドバイスが不適切なのかも知れません。
コードも長くなってきてこちらが問題点を把握しきれてないのかも知れないので、こちらでコンパイル・実行するにもファイル・データが足らないので確認しきれません。

と言うことで、ご自身でデバッグ方法を勉強しましょう。
まず、デバッガのブレークポイントを使って適切なタイミング呼び出されている確認してください。
あるいは、printfデバッグを活用します。

「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&b=982&c=2

自分の意図と実際のプログラム動きは一致するでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

s707

Re: time.hとDrawRotaGraph2を使って時計を作成したい

#18

投稿記事 by s707 » 7年前

URLを参考にさせて頂き解決しました。
今回も非常にお世話になりました。
ありがとうございます。

コード:

//main.cpp
#include "DxLib.h"
#include "dayData.h"
#include "draw_clock.h"

void option(struct dayData* day);
void option_draw(struct dayData* day);
void Time(struct dayData* day);
void date(struct dayData* day);
void load_day(struct dayData* day);
void save_day(struct dayData* day);
int title(int,struct dayData* day);
void draw_clock();

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
	struct dayData day[100];
	// マウス状態管理用変数
	int nClickNow = 0 , nClickPrev = 0;
	int nClickNow_R = 0 , nClickPrev_R = 0;
	int nClickR_Count = 0;

	int status = 0;

	SetMainWindowText("clock");
	ChangeWindowMode( TRUE );
	SetWindowSizeExtendRate(0.5);	

	SetDrawScreen(DX_SCREEN_BACK);
	SetWindowStyleMode(2);
	//	SetWindowPosition(1200, 720 ) ;

	if ( DxLib_Init( ) == -1 ) return -1;

	Load();

	while (ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){
		if(GetMouseInput() & MOUSE_INPUT_LEFT) {			
			SendMessage(GetMainWindowHandle(), WM_NCLBUTTONDOWN, HTCAPTION, 0);//ウインドウを移動させる為、ウインドウ枠をクリックしたと思わせる
		}

		draw_clock();
		load_day(day);//日にちを読み込む
		// マウス状態の更新
		nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);
		nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);

		if(	nClickNow_R )nClickR_Count++;//右クリックを押しているときはカウントアップ
		else{nClickR_Count = 0;}//それ以外ではカウントを0にする

		if (!status && nClickR_Count == 1){
			break;
		}

		if ( nClickNow_R && !nClickPrev_R){
			status = 0;
		}

		int temp = title(status,day);

		if( nClickNow && !nClickPrev){
			if(temp)
				status = temp;

			if(status == 1){
				Time(day);
				status = 0;
			}
			else if(status == 2 ){
				date(day);
				status = 0;
			}
			else if(status){
				option(day);
				save_day(day);//日にちを書き込む
			}
		}

		if(status == 3){
			option_draw(day);
		}

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

	DxLib_End(); 
	return 0;
}



//title.cpp
#include "DxLib.h"
#include "dayData.h"
#include <time.h>
#pragma warning ( disable : 4996 )
#define  FontSize 40

int title(int menu_number,struct dayData* day){
	int SHandle[35];

	int status=0;
	time_t timer;
	struct tm *local;
	timer = time(NULL);//現在時刻を取得
	local = localtime(&timer); //地方時に変換

	int min[2],sec[2];
	min[0] = (local->tm_min / 10)%10;
	min[1] = local->tm_min % 10;

	sec[0] = (local->tm_sec / 10)%10;
	sec[1] = local->tm_sec % 10;

	if( !min[0] && !min[1] && !sec[0] && !sec[1] && !status )status = 1;//一時間毎に時刻を読む

	if(menu_number != 3){//オプション以外
		int Cr_0,Cr_1,Cr_2 ;
		int	MouseInput=0,MouseX=0,MouseY=0;

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

		// 白色の値を取得
		Cr_0 = GetColor( 0xff , 0xff , 0xff ) ;
		Cr_1 = GetColor( 0xff , 0xff , 0xff ) ;
		Cr_2 = GetColor( 0xff , 0xff , 0xff ) ;

		// 文字列の描画
		DrawString( 16 , 384 , "時刻" , Cr_0 );
		DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
		DrawString( 416 , 384 , "オプション" , Cr_2 );

		// マウスの位置を取得
		GetMousePoint( &MouseX , &MouseY ) ;

		if(MouseX > 20 && MouseX < 176 && MouseY > 384 && MouseY < 384 + FontSize){//時刻の色変更
			Cr_0 = GetColor( 0xff , 0xff , 0 ) ;
			status = 1;
		}
		else if(MouseX >= 176 && MouseX < 416 && MouseY > 384  && MouseY < 384 + FontSize){//日付・曜日の色変更
			Cr_1 = GetColor( 0xff , 0xff , 0 ) ;
			status = 2;
		}
		else if(MouseX >= 416 && MouseY > 384  && MouseY < 384 + FontSize){//オプションの色変更
			Cr_2 = GetColor( 0xff , 0xff , 0 ) ;
			status = 3;
		}
		else
			status = 0;
		// 文字列の描画
		DrawString( 16 , 384 , "時刻" , Cr_0 );
		DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
		DrawString( 416 , 384 , "オプション" , Cr_2 );


		int arr;
		static int frmcnt = 0;
		frmcnt++;
		static bool alarm = false;
		char ganjitsu[6] = "01010", nanakusa[6] = "01070", seijin[6] = "01100", setsubun[6] = "02030", kenkoku[6] = "02110", syunbun[6] = "03210", syouwa[6] = "04290", kenpou[6] = "05030", midori[6] = "05040", kodomo[6] = "05050", umi[6] = "07180",
			 keirou[6] = "09190", syuubun[6] = "09230", taiiku[6] = "10100", bunka[6] = "11030", sitsigosan[6] = "11150", kinrou[6] = "11230", tennou[6] = "12230", Xmas_eve[6] = "12240", Xmas[6] = "12250", kyou[6] = "09160";

		if(!alarm && frmcnt == 1){
			if( ( ( day + 3 ) -> number[0] - '0') % 2 == 0 ){//設定した日 0なら当日 1なら前日
				arr = 0;
				for(int i = 0; i<3; i++){//先にデータロードを完了させる
					SHandle[i]   = LoadSoundMem( (day + i + 4) -> name ) ;
					SHandle[i+3] = LoadSoundMem( (day + i + 7) -> name ) ;
				}

				for(int i = 0; i<3; i++){
					if( local->tm_wday == ( ( (day + i) -> number[0] - '0' ) % 7) ){

						if(!alarm){
							PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;//今日
							while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
							arr = 2;
							PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;//は
							while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
						}

						if(i == 0){     arr = 3; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//燃えるゴミ
						else if(i == 1){arr = 4; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//燃えないゴミ
						else if(i == 2){arr = 5; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//資源ゴミ
						while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
						alarm = true;
					}
				}

				for(int i = 10; i<36; i++){
					int hiduke = 1;
					bool sound = false;
					switch(local->tm_yday){
					case 0://元日
						hiduke = strcmp((day+i)->number, ganjitsu);
						if( !hiduke )sound = true;
						break;
					case 6://七草
						hiduke = strcmp((day+i)->number, nanakusa);
						if( !hiduke )sound = true;
						break;
					case 9://成人の日
						hiduke = strcmp((day+i)->number, seijin);
						if( !hiduke )sound = true;
						break;
					case 33://節分
						hiduke = strcmp((day+i)->number, setsubun);
						if( !hiduke )sound = true;
						break;
					case 41://建国記念日
						hiduke = strcmp((day+i)->number, kenkoku);
						if( !hiduke )sound = true;
						break;
					case 79://春分の日
						hiduke = strcmp((day+i)->number, syunbun);
						if( !hiduke )sound = true;
						break;
					case 118://昭和の日
						hiduke = strcmp((day+i)->number, syouwa);
						if( !hiduke )sound = true;
						break;
					case 122://憲法記念日
						hiduke = strcmp((day+i)->number, kenpou);
						if( !hiduke )sound = true;
						break;
					case 123://みどりの日
						hiduke = strcmp((day+i)->number, midori);
						if( !hiduke )sound = true;
						break;
					case 124://こどもの日
						hiduke = strcmp((day+i)->number, kodomo);
						if( !hiduke )sound = true;
						break;
					case 160://海の日
						hiduke = strcmp((day+i)->number, umi);
						if( !hiduke )sound = true;
						break;
					case 261://敬老の日
						hiduke = strcmp((day+i)->number, keirou);
						if( !hiduke )sound = true;
						break;
					case 265://秋分の日
						hiduke = strcmp((day+i)->number, syuubun);
						if( !hiduke )sound = true;
						break;
					case 282://体育の日
						hiduke = strcmp((day+i)->number, taiiku);
						if( !hiduke )sound = true;
						break;
					case 306://文化の日
						hiduke = strcmp((day+i)->number, bunka);
						if( !hiduke )sound = true;
						break;
					case 318://七五三
						hiduke = strcmp((day+i)->number, sitsigosan);
						if( !hiduke )sound = true;
						break;
					case 326://勤労感謝の日
						hiduke = strcmp((day+i)->number, kinrou);
						if( !hiduke )sound = true;
						break;
					case 356://天皇誕生日
						hiduke = strcmp((day+i)->number, tennou);
						if( !hiduke )sound = true;
						break;
					case 357://クリスマスイヴ
						hiduke = strcmp((day+i)->number, Xmas_eve);
						if( !hiduke )sound = true;
						break;
					case 358://クリスマス
						hiduke = strcmp((day+i)->number, Xmas);
						if( !hiduke )sound = true;
						break;
					}

					if(sound){//音声再生フラグがon
						SHandle[i-3] = LoadSoundMem( (day + i) -> name ) ;
						PlaySoundMem( SHandle[i-3] , DX_PLAYTYPE_BACK ) ;
						while( CheckSoundMem( SHandle[i-3] ) == 1 ){}// なり終わるまでここでループ
					}
				}

			}
			else if( ( ( day + 3 ) -> number[0] - '0') % 2 == 1 ){//前日設定
				arr = 1;
				for(int i = 0; i<3; i++){//先にデータロードを完了させる
					SHandle[i]   = LoadSoundMem( (day + i + 4) -> name ) ;
					SHandle[i+3] = LoadSoundMem( (day + i + 7) -> name ) ;
				}

				for(int i = 0; i<3; i++){
					if( local->tm_wday - ( ( (day + i) -> number[0] - '0' ) % 7) == -1 || local->tm_wday - ( ( (day + i) -> number[0] - '0') % 7) == 6){//燃えるゴミ

						if(!alarm){
							PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;//明日
							while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
							arr = 2;
							PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;//は
							while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
						}

						if(i == 0){     arr = 3; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//燃えるゴミ
						else if(i == 1){arr = 4; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//燃えないゴミ
						else if(i == 2){arr = 5; PlaySoundMem( SHandle[arr] , DX_PLAYTYPE_BACK ) ;}//資源ゴミ
						while( CheckSoundMem( SHandle[arr] ) == 1 ){}// なり終わるまでここでループ
						alarm = true;
					}
				}

				for(int i = 10; i<36; i++){
					int hiduke = 1;
					bool sound = false;
					switch(local->tm_yday){
					case 365://元日の前日
						hiduke = strcmp((day+i)->number, ganjitsu);
						if( !hiduke )sound = true;
						break;
					case 5://七草の前日
						hiduke = strcmp((day+i)->number, nanakusa);
						if( !hiduke )sound = true;
						break;
					case 8://成人の日の前日
						hiduke = strcmp((day+i)->number, seijin);
						if( !hiduke )sound = true;
						break;
					case 32://節分の前日
						hiduke = strcmp((day+i)->number, setsubun);
						if( !hiduke )sound = true;
						break;
					case 40://建国記念日の前日
						hiduke = strcmp((day+i)->number, kenkoku);
						if( !hiduke )sound = true;
						break;
					case 78://春分の日の前日
						hiduke = strcmp((day+i)->number, syunbun);
						if( !hiduke )sound = true;
						break;
					case 117://昭和の日の前日
						hiduke = strcmp((day+i)->number, syouwa);
						if( !hiduke )sound = true;
						break;
					case 121://憲法記念日の前日
						hiduke = strcmp((day+i)->number, kenpou);
						if( !hiduke )sound = true;
						break;
					case 122://みどりの日の前日
						hiduke = strcmp((day+i)->number, midori);
						if( !hiduke )sound = true;
						break;
					case 123://こどもの日の前日
						hiduke = strcmp((day+i)->number, kodomo);
						if( !hiduke )sound = true;
						break;
					case 159://海の日の前日
						hiduke = strcmp((day+i)->number, umi);
						if( !hiduke )sound = true;
						break;
					case 260://敬老の日の前日
						hiduke = strcmp((day+i)->number, keirou);
						if( !hiduke )sound = true;
						break;
					case 264://秋分の日の前日
						hiduke = strcmp((day+i)->number, syuubun);
						if( !hiduke )sound = true;
						break;
					case 281://体育の日の前日
						hiduke = strcmp((day+i)->number, taiiku);
						if( !hiduke )sound = true;
						break;
					case 305://文化の日の前日
						hiduke = strcmp((day+i)->number, bunka);
						if( !hiduke )sound = true;
						break;
					case 317://七五三の前日
						hiduke = strcmp((day+i)->number, sitsigosan);
						if( !hiduke )sound = true;
						break;
					case 325://勤労感謝の日の前日
						hiduke = strcmp((day+i)->number, kinrou);
						if( !hiduke )sound = true;
						break;
					case 355://天皇誕生日の前日
						hiduke = strcmp((day+i)->number, tennou);
						if( !hiduke )sound = true;
						break;
					case 356://クリスマスイヴの前日
						hiduke = strcmp((day+i)->number, Xmas_eve);
						if( !hiduke )sound = true;
						break;
					case 357://クリスマスの前日
						hiduke = strcmp((day+i)->number, Xmas);
						if( !hiduke )sound = true;
						break;
					}

					if(sound){//音声再生フラグがon
						SHandle[i-3] = LoadSoundMem( (day + i) -> name ) ;
						PlaySoundMem( SHandle[i-3] , DX_PLAYTYPE_BACK ) ;
						while( CheckSoundMem( SHandle[i-3] ) == 1 ){}// なり終わるまでここでループ
					}
				}
			}
		}
	}
	InitSoundMem() ;//サウンドデータの削除
	return status;
}



//option.cpp
#include "DxLib.h"
#include "dayData.h"

#define FontSize 48

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

void option_draw(struct dayData* day){
	// 文字列の描画
	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[ (arr[0]+1) % 7 ], nColor[0]);
	DrawString(448, 128, pszDay1[ (arr[1]+1) % 7 ], nColor[1]);
	DrawString(448, 192, pszDay1[ (arr[2]+1) % 7 ], nColor[2]);
	DrawString(448, 256, pszDay2[ arr[3] % 2 ], nColor[3]);
}

void option(struct dayData* day)
{
	// 描画する文字列のサイズを設定
	SetFontSize(FontSize);

	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);
			( day + i ) -> number[0] = ( day + i ) -> number[0] + 1;
		}
		else
		{
			// 今回変更した箇所以外の色を戻す
			nColor[i] = GetColor(0xFF, 0xFF, 0xFF);
		}

		arr[i] = ( day + i ) -> number[0];		

	}
}

//-----------------------------------------------------------------------------
// Name: load_day()
// Desc: 日にち読み込み関数
//-----------------------------------------------------------------------------
void load_day(struct dayData* day){
	char key1[7]="name00";
	char key2[6]="day00";

	//INIファイル読み込み
	for(int i=0;i<100;i++){//燃える 燃えない 資源 再生日切り替えの4つ
		GetPrivateProfileString("Day",key1,"--------", (day+i) -> name,30,"Resourse./Day.INI");
		GetPrivateProfileString("Day",key2,"00000"   , (day+i) -> number,6,"Resourse./Day.INI");
		key1[5]++;//アンダーラインの後ろの数字をインクリメント
		key2[4]++;

		if(key1[5] == ':'){ key1[4]++; key1[5] = '0';}//10の位をプラス 1の位を0に 
		if(key2[4] == ':'){ key2[3]++; key2[4] = '0';}
	}
}
//-----------------------------------------------------------------------------
// Name: save_day()
// Desc: 日にち書き込み関数
//-----------------------------------------------------------------------------
void save_day(struct dayData* day){
	char key1[7]="name00";
	char key2[6]="day00";

	//INIファイル書き込み
	for(int i=0;i<100;i++){//燃える 燃えない 資源 再生日切り替えの4つ
		WritePrivateProfileString("Day",key1, (day+i) -> name,"Resourse./Day.INI");
		WritePrivateProfileString("Day",key2, (day+i) -> number,"Resourse./Day.INI");
		key1[5]++;
		key2[4]++;
		
		if(key1[5] == ':'){ key1[4]++; key1[5] = '0';}
		if(key2[4] == ':'){ key2[3]++; key2[4] = '0';}
	}
}


閉鎖

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