現在時刻をリアルタイムに表示したい

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

現在時刻をリアルタイムに表示したい

#1

投稿記事 by ノダッシー » 10年前

タイマーを作りたいのですが、リアルタイムに現在時刻を表示させようとすると今のコードですと止まったままになっています
ScreenFlipの前にDrawFormatStringを書いているのに、何故止まってしまうのでしょうか

それともう一点、カウントダウンと連動して減っていくゲージをDrawBoxで実装したいのですが考え方を教えてほしいです


Cはポインタ以外の基礎は一通り独学で学び、C言語ゲームプログラミングの館の3.1までやりました
使っている開発環境はMicrosoft Visual Studio Express 2013です
宜しくお願いします

コード:

#pragma warning(disable : 4819)
#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{
	int StartTime;    //起動時の時間を格納する変数
	int hour, minute, second;    //表示する時間
	int set_hour, set_minute, set_second;    //セットする時間

	SetOutApplicationLogValidFlag(FALSE);    //ログ出力をするか否か
	ChangeWindowMode(TRUE);    // ウインドウモードかフルスクリーンか
	SetGraphMode(640, 480, 16);    //画面サイズを設定します
	SetDrawScreen(DX_SCREEN_BACK);    //描画する画面を設定します
	if (DxLib_Init() == -1) // DXライブラリ初期化処理
	{
		return -1; // エラーが起きたら直ちに終了
	}

	SetBackgroundColor(0x00, 0x00, 0x00);    //背景の色を設定します

	set_hour = KeyInputNumber(50, 50, 99, 0, TRUE);    //セットする時間数を入力
	set_minute = KeyInputNumber(70, 50, 59, 0, TRUE);    //セットする分数を入力
	set_second = KeyInputNumber(90, 50, 59, 0, TRUE);    //セットする秒数を入力

	set_hour %= 100;   //ESCが押されたときに0にする
	set_minute %= 60;
	set_second %= 60;
	DATEDATA Date;
	;
	if (set_second == 0 && set_minute == 0 && set_hour == 0)
		set_minute = 3;    //0時間0分0秒なら3分に合わせる

	StartTime = GetNowCount();  //起動時の時間を取得
	
	while (1){
		if (ProcessMessage() == -1)break;      //ウインドウのメッセージを処理する
		GetDateTime(&Date);

		second = (GetNowCount() - StartTime) / 1000;  //秒に変換

		minute = second / 60;  //分に変換
		second %= 60;

		hour = minute / 60;  //時間に変換
		minute %= 60;

		ClearDrawScreen();    //画面に描画されている内容を消します

		DrawFormatString(0, 0, 0xFFFFFF, "%d:%02d:%02d", hour, minute, second);    //時間を描画します
			DrawFormatString(30, 100, GetColor(255, 255, 255), "%d年%d月%d日%時%d分%d秒", Date.Year, Date.Mon, Date.Day, Date.Hour, Date.Min, Date.Sec);
		
		if (set_hour * 360 + set_minute * 60 + set_second <= hour * 360 + minute * 60 + second)
			DrawFormatString(0, 50, 0xFFFFFF, "時間になりました");    //時間になったら表示する
		

		ScreenFlip();    //DX_SCREEN_BACKに描画した画像を表示します
	}

	DxLib_End(); // DXライブラリ使用の終了処理

	return 0; // ソフトの終了 
}

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

Re: 現在時刻をリアルタイムに表示したい

#2

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

ノダッシー さんが書きました:タイマーを作りたいのですが、リアルタイムに現在時刻を表示させようとすると今のコードですと止まったままになっています
ScreenFlipの前にDrawFormatStringを書いているのに、何故止まってしまうのでしょうか
「時」の前にdが抜けているので表示が1個ずれ、止まって見えるだけのようです。
gcc 4.8.1、DXライブラリ3.12cで実行したところ、きちんと時刻の分が切り替わるタイミングで時刻の表示が更新されました。

また、他にも以下の点が気になりました。
・SetDrawScreen(DX_SCREEN_BACK)をDxLib_Init()の前にしか呼び出していない
・31行目に無駄に見えるセミコロンがある
・51行目と55行目で、色としてGetColorを使わずに直接リテラルを渡している
・54行目の計算式で、1hour==6minuteとして計算している
ノダッシー さんが書きました:それともう一点、カウントダウンと連動して減っていくゲージをDrawBoxで実装したいのですが考え方を教えてほしいです
ゲージで表示したい最大の値をA、最小の値をB、現在の値をC、
ゲージの左端の座標をX1、右端の座標をX2とすると、
X1から(X2-X1)*(C-B)/(A-B)の位置に棒を描画すれば、Cのカウントダウンと連動して減っていくゲージになるはずです。
【訂正】X1からX1+(X2-X1)*(C-B)/(A-B)の位置に描画します。
最後に編集したユーザー みけCAT on 2014年9月28日(日) 09:46 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ノダッシー

Re: 現在時刻をリアルタイムに表示したい

#3

投稿記事 by ノダッシー » 10年前

みけcatさん返信ありがとうございます
いくつか分かる部分を修正してみたのですが

カウントダウンと減っていくバーがわかりません
具体的には

<code>
//デバッグ用
C = second -1 ;
DrawFormatString(150, 200, GetColor(255, 255, 255), "%d", C);
</code>
・Cにsecond を 毎秒-1 してもカウントダウンしない
・バーのY2(第3引数で教えて頂いたコードを入力していますが画面上変化無し)

<code>
DrawBox(X1, Y1, (X2 - X1)*(C - B) / (A - B), 150, GetColor(255, 255, 255), TRUE);
</code>
・SetDrawScreen(DX_SCREEN_BACK)をDxLib_Init()の前にしか呼び出していない →位置を変更し、修正しました
・31行目に無駄に見えるセミコロンがある →削除しました
・51行目と55行目で、色としてGetColorを使わずに直接リテラルを渡している→GetColorで統一しました
・54行目の計算式で、1hour==6minuteとして計算している → どこが間違っているのか理解できないです…

前コードです↓

<code>
#pragma warning(disable : 4819)
#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
int StartTime; //起動時の時間を格納する変数
int hour, minute, second; //表示する時間
int set_hour, set_minute, set_second; //セットする時間

SetOutApplicationLogValidFlag(FALSE); //ログ出力をするか否か
ChangeWindowMode(TRUE); // ウインドウモードかフルスクリーンか
SetGraphMode(640, 480, 16); //画面サイズを設定します

if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}

SetBackgroundColor(0x00, 0x00, 0x00); //背景の色を設定します

set_hour = KeyInputNumber(50, 50, 99, 0, TRUE); //セットする時間数を入力
set_minute = KeyInputNumber(70, 50, 59, 0, TRUE); //セットする分数を入力
set_second = KeyInputNumber(90, 50, 59, 0, TRUE); //セットする秒数を入力

set_hour %= 100; //ESCが押されたときに0にする
set_minute %= 60;
set_second %= 60;
DATEDATA Date;

int A = 640; //最大の値
int B = 0; //最小の値
int C = 0; //カウントダウン
int X1 = 60;
int X2 = 50;
int Y1 = 50;
int Y2 = 50;

if (set_second == 0 && set_minute == 0 && set_hour == 0)
set_minute = 3; //0時間0分0秒なら3分に合わせる

StartTime = GetNowCount(); //起動時の時間を取得

while (1){
if (ProcessMessage() == -1)break; //ウインドウのメッセージを処理する
GetDateTime(&Date);

second = (GetNowCount() - StartTime) / 1000; //秒に変換

minute = second / 60; //分に変換
second %= 60;

hour = minute / 60; //時間に変換
minute %= 60;

SetDrawScreen(DX_SCREEN_BACK); //描画する画面を設定します
ClearDrawScreen(); //画面に描画されている内容を消します

DrawFormatString(0, 0, GetColor(255, 255, 255), "%d:%02d:%02d", hour, minute, second); //時間を描画します


DrawFormatString(150, 200, GetColor(255, 255, 255), "%d:%02d:%02d", hour, minute, second); //時間を描画します
DrawFormatString(30, 100, GetColor(255, 255, 255), "%d年%d月%d日%d時%d分%d秒", Date.Year, Date.Mon, Date.Day, Date.Hour, Date.Min, Date.Sec);

if (set_hour * 360 + set_minute * 60 + set_second <= hour * 360 + minute * 60 + second)
DrawFormatString(0, 50, GetColor(255, 255, 255), "時間になりました"); //時間になったら表示する

DrawBox(X1, Y1, (X2 - X1)*(C - B) / (A - B), 150, GetColor(255, 255, 255), TRUE);

ScreenFlip(); //DX_SCREEN_BACKに描画した画像を表示します

//デバッグ用
C = second -1 ;
DrawFormatString(150, 200, GetColor(255, 255, 255), "%d", C);
}

DxLib_End(); // DXライブラリ使用の終了処理

return 0; // ソフトの終了
}
</code>

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

Re: 現在時刻をリアルタイムに表示したい

#4

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

・ループに入る直前で、

コード:

A = set_hour * 360 + set_minute * 60 + set_second;
B = 0;
と設定してください。
・ループ中、DrawBoxの前に、

コード:

C = A - (hour * 360 + minute * 60 + second);
if (C < B) C = B;
としてください。
・Y2はY1 + (作りたいゲージの幅) にしてください。
 もしくは、Y座標をDrawBoxの引数に直接リテラルで設定したいのであれば、Y2 (とY1)は消してください。
 Y1は描画座標に反映されて、Y2は反映されないというのは中途半端でわかりにくいと思います。
・前のレスが間違っていました。申し訳ありません。
 DrawBoxの第三引数をX1+(X2 - X1)*(C - B) / (A - B)にしてください。
・プログラム中でのhourの定義を統一するため、54~55行目を

コード:

hour = minute / 6;  //時間に変換
minute %= 6;
としてください。
・残り時間を表示する場合は、上で計算したCをsecondと同様に変換して表示すればいいです。
ノダッシー さんが書きました:具体的には

<code>
//デバッグ用
C = second -1 ;
DrawFormatString(150, 200, GetColor(255, 255, 255), "%d", C);
</code>
・Cにsecond を 毎秒-1 してもカウントダウンしない
申し訳ないですが意味がよくわかりません。
「Cにsecond を 毎秒-1 する」とはどういうことですか?このコードに書いてある通りですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ノダッシー

ゴールが見えてきました

#5

投稿記事 by ノダッシー » 10年前

みけCATさんに教えて頂いたコードでやりたい事のほとんどが実装できました
ありがとうございます。

あとやりたい事は、残り何分残っているかを表示したいです
10分に設定したら9,8,7,6,5,4,3,2,1といった具合にカウントダウンをしたいです
申し訳ないですが意味がよくわかりません。
「Cにsecond を 毎秒-1 する」とはどういうことですか?このコードに書いてある通りですか?
自分の理解力が足りなくて、、これだと1分間に1カウントできないです
宜しくお願いします

コード:

		//一分経過したら残り時間を-1してカウントダウンしたい
		if (minute >= D){
			D--;
	}

全コード貼っておきます

コード:

#pragma warning(disable : 4819)
#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
	int StartTime; //起動時の時間を格納する変数
	int hour, minute, second; //表示する時間
	int set_hour, set_minute, set_second; //セットする時間

	SetOutApplicationLogValidFlag(FALSE); //ログ出力をするか否か
	ChangeWindowMode(TRUE); // ウインドウモードかフルスクリーンか
	SetGraphMode(640, 480, 16); //画面サイズを設定します

	if (DxLib_Init() == -1) // DXライブラリ初期化処理
	{
		return -1; // エラーが起きたら直ちに終了
	}

	SetBackgroundColor(0x00, 0x00, 0x00); //背景の色を設定します

	set_hour = KeyInputNumber(50, 50, 99, 0, TRUE); //セットする時間数を入力
	set_minute = KeyInputNumber(70, 50, 59, 0, TRUE); //セットする分数を入力
	set_second = KeyInputNumber(90, 50, 59, 0, TRUE); //セットする秒数を入力

	set_hour %= 100; //ESCが押されたときに0にする
	set_minute %= 60;
	set_second %= 60;
	DATEDATA Date;

	int A = 640; //最大の値
	int B = 0; //最小の値
	int C = 0;
	int D = 0; //カウントダウン
	int X1 = 0;
	int X2 = 680;
	int Y1 = 50;
	int Y2 = 50;

	A = set_hour * 360 + set_minute * 60 + set_second;
	B = 0;
	D = set_minute;



	StartTime = GetNowCount(); //起動時の時間を取得

	while (1){
		if (ProcessMessage() == -1)break; //ウインドウのメッセージを処理する
		GetDateTime(&Date);

		second = (GetNowCount() - StartTime) / 1000; //秒に変換

		minute = second / 60; //分に変換
		second %= 60;

		hour = minute / 6; //時間に変換
		minute %= 6;

		SetDrawScreen(DX_SCREEN_BACK); //描画する画面を設定します
		ClearDrawScreen(); //画面に描画されている内容を消します

		//時間に合わせてメッセージが変わる
		switch (Date.Hour){
		case 1:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 2:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 3:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 4:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 5:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 6:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 7:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 8:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "おはようございます");
			break;
		case 9:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "おはようございます。今日も一日頑張りましょう!");
			break;
		case 10:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "おはようございます。今日も一日頑張りましょう!");
			break;
		case 11:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "もうすぐお昼休みだ!");
			break;
		case 12:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "もうすぐお昼休みだ!");
			break;
		case 13:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "休憩時間です!");
			break;
		case 14:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "こんにちは");
			break;
		case 15:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "こんにちは");
			break;
		case 16:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "もうすぐで終わりです。頑張りましょう!");
			break;
		case 17:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "お疲れ様でした");
			break;
			break;





		}


		DrawFormatString(0, 0, GetColor(255, 255, 255), "%d:%02d:%02d", hour, minute, second); //時間を描画します
		DrawFormatString(30, 100, GetColor(255, 255, 255), "%d年%d月%d日%d時%d分%d秒", Date.Year, Date.Mon, Date.Day, Date.Hour, Date.Min, Date.Sec);
		DrawFormatString(200, 300, GetColor(255, 255, 255), "残り何分?⇒%d", D); //カウントダウン

		if (set_hour * 360 + set_minute * 60 + set_second <= hour * 360 + minute * 60 + second)
			DrawFormatString(0, 50, GetColor(255, 255, 255), "時間になりました"); //時間になったら表示する

		//ゲージの描画
		C = A - (hour * 360 + minute * 60 + second);
		if (C < B) C = B;
		DrawBox(X1, Y1, X1 + (X2 - X1)*(C - B) / (A - B), 150, GetColor(255, 255, 255), TRUE);

		//一分経過したら残り時間を-1
		if (minute >= D){
			D--;
	}
		
		ScreenFlip(); //DX_SCREEN_BACKに描画した画像を表示します
		
		

	}

	DxLib_End(); // DXライブラリ使用の終了処理

	return 0; // ソフトの終了 
}

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

Re: ゴールが見えてきました

#6

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

ノダッシー さんが書きました:あとやりたい事は、残り何分残っているかを表示したいです
10分に設定したら9,8,7,6,5,4,3,2,1といった具合にカウントダウンをしたいです
申し訳ないですが意味がよくわかりません。
「Cにsecond を 毎秒-1 する」とはどういうことですか?このコードに書いてある通りですか?
自分の理解力が足りなくて、、これだと1分間に1カウントできないです
宜しくお願いします

コード:

		//一分経過したら残り時間を-1してカウントダウンしたい
		if (minute >= D){
			D--;
	}
138行目~141行目を削除し、その位置に

コード:

// Dに残り時間[分]を設定
D = C / 60;
というコードを入れてください。
ノダッシー さんが書きました:

コード:

		switch (Date.Hour){
		case 1:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 2:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 3:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 4:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 5:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 6:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 7:
			DrawFormatString(150, 0, GetColor(255, 255, 255), " ");
			break;
		case 8:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "おはようございます");
			break;
		case 9:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "おはようございます。今日も一日頑張りましょう!");
			break;
		case 10:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "おはようございます。今日も一日頑張りましょう!");
			break;
		case 11:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "もうすぐお昼休みだ!");
			break;
		case 12:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "もうすぐお昼休みだ!");
			break;
		case 13:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "休憩時間です!");
			break;
		case 14:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "こんにちは");
			break;
		case 15:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "こんにちは");
			break;
		case 16:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "もうすぐで終わりです。頑張りましょう!");
			break;
		case 17:
			DrawFormatString(150, 0, GetColor(255, 255, 255), "お疲れ様でした");
			break;
			break;





		}
使ってはいけない宗教上の理由や設計上の理由があるかはわかりませんが、
特別な事情がなければこの部分は配列を使ったほうがいい気がします。

WinMain関数の最初に

コード:

	const char* messages[18] = {
		"",
		" ",
		" ",
		" ",
		" ",
		" ", // 5
		" ",
		" ",
		"おはようございます",
		"おはようございます。今日も一日頑張りましょう!",
		"おはようございます。今日も一日頑張りましょう!", // 10
		"もうすぐお昼休みだ!",
		"もうすぐお昼休みだ!",
		"休憩時間です!",
		"こんにちは",
		"こんにちは", // 15
		"もうすぐで終わりです。頑張りましょう!",
		"お疲れ様でした"
	};
というコードを追加し、65行目~123行目を

コード:

		if (1 <= Date.Hour && Date.Hour <= 17) {
			DrawFormatString(150, 0, GetColor(255, 255, 255), messages[Date.Hour]);
		}
と書き換えるとできるはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ノダッシー

Re: 現在時刻をリアルタイムに表示したい

#7

投稿記事 by ノダッシー » 10年前

意図した通りに動くようになりました!
ありがとうございました
またよろしくお願いします

ノダッシー

Re: 現在時刻をリアルタイムに表示したい

#8

投稿記事 by ノダッシー » 10年前

仕様変更です
全体の時間(7時間=420分)から1分ずつカウントしていくカウンター(数値)とゲージ(円)とバー(横グラフ)を実装したいのですが、
円を描く関数 DrawCircle( 320 , 240 , 150 , Cr , FALSE ) ; だけでは無理な事に気がつきました

調べてみると既にDxLibの方で関数化してあるようなのですが、時間と共に減少していく計算の仕方が分からず困っております
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ast&no=325

よろしくお願いします

現在のコードはこんな感じになってます

コード:

#pragma warning(disable : 4819)
#include    "DxLib.h"
#include    <fstream>
#include    <string>
#include    <iostream>
#include    <stdio.h>

// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{

	int minute;

	SetOutApplicationLogValidFlag(FALSE); //ログ出力をするか否か
	ChangeWindowMode(TRUE); // ウインドウモードかフルスクリーンか
	SetGraphMode(640, 480, 16); //画面サイズを設定します

	if (DxLib_Init() == -1) // DXライブラリ初期化処理
	{
		return -1; // エラーが起きたら直ちに終了
	}

	SetBackgroundColor(0xFF, 0xFF, 0xFF); //背景の色を設定します

	int moziNoIro = GetColor(0, 0, 0);
	int keikaZikanNoIro = GetColor(217, 150, 148);
	int nokoriZikanNoIro = GetColor(0, 176, 80);
	int geeziNoKyoukaiSenNoIro = GetColor(56, 93, 138);
	int migiNoSenNoIro = GetColor(106, 106, 106);
	int hidariNoSenNoIro = GetColor(63, 93, 141);

	DATEDATA Date;

	int A = 640; //最大の値
	int B = 0; //最小の値
	int C = 0;//???
	int D = 0; //カウントダウン
	int E = 0; //表示用
	int X1 = 0;
	int X2 = 640;
	int Y1 = 50;
	//int Y2 = 50;
	int g_Lagefont = CreateFontToHandle("メイリオ", 50, -1, DX_FONTTYPE_ANTIALIASING);
	int jikann;
	int gogo;
	int Handle;//背景画像描画用
	int Handle_wav;
	//全体を表すゲージ
	int zenntai = 7 * 60;	//7時間 * 60分 = 420分
	int NowJikann = zenntai; //現在の残り時間
	int F = 7 * 60;			//全体の残り時間初期値420分

	int maeNiOtoWoNarasitaZikantai = -1;
	bool saisyoNoFureemuDeAru = true;


	while (1){
		if (ProcessMessage() == -1)break; //ウインドウのメッセージを処理する
		GetDateTime(&Date);

		/*
		// テスト用
		// 時刻を60倍の速さで進ませる
		Date.Hour = Date.Min % 24;
		Date.Min = Date.Sec;
		Date.Sec= 0;
		*/

		SetDrawScreen(DX_SCREEN_BACK); //描画する画面を設定します
		ClearDrawScreen(); //画面に描画されている内容を消します






		//時間に合わせてメッセージが変わる
		const char* messages[18] = {
			"",
			" ",
			" ",
			" ",
			" ",
			" ", // 5
			" ",
			" ",
			"おはようござます",
			"おはようございます",
			"今日も一日頑張りましょう!", // 10
			"もうすぐお昼休みだ!",
			"休憩時間です!",
			"午後も頑張りましょう",
			"こんにちは",
			"残り1時間です", // 15
			"お疲れ様でした",
			"お疲れ様でした"
		};




		// 基準時刻
		int kizyunZikoku[12][2] = {
			{ 9, 0 }, { 9, 55 },
			{ 10, 0 }, { 10, 55 },
			{ 11, 0 }, { 12, 0 },
			{ 12, 40 }, { 13, 40 },
			{ 13, 45 }, { 14, 50 },
			{ 14, 55 }, { 16, 0 }
		};
		// その基準時刻と次の基準時刻の間でゲージを動かすか
		bool zikanWoHyouziSuru[12] = {
			true, true,
			true, true,
			true, true,
			true, true,
			true, true,
			true, true
		};

		// 今の時刻がどこに該当するかを計算する
		int imaNoZikoku = 60 * (60 * Date.Hour + Date.Min) + Date.Sec;
		int maeNoKizyunZikoku = 0;
		int tugiNoKizyunZikoku = 0;
		int imaNoZikantai = -1;
		for (int i = 0; i < 12; i++) {
			int miteiruKizyunZikoku = 60 * (60 * kizyunZikoku[i][0] + kizyunZikoku[i][1]);
			if (imaNoZikoku < miteiruKizyunZikoku) {
				if (i > 0) {
					imaNoZikantai = i - 1;
					maeNoKizyunZikoku = 60 * (60 * kizyunZikoku[i - 1][0] + kizyunZikoku[i - 1][1]);
					tugiNoKizyunZikoku = 60 * (60 * kizyunZikoku[i][0] + kizyunZikoku[i][1]);
				}
				break;
			}
		}
		if (saisyoNoFureemuDeAru) {
			maeNiOtoWoNarasitaZikantai = imaNoZikantai;
			saisyoNoFureemuDeAru = false;
		}

		// 経過時間と残り時間を計算し、ゲージのパラメータを設定する
		if (imaNoZikantai >= 0 && zikanWoHyouziSuru[imaNoZikantai]) {
			// 表示する時間
			minute = (imaNoZikoku - maeNoKizyunZikoku) / 60;
			E = (tugiNoKizyunZikoku - maeNoKizyunZikoku) / 60;
			D = (tugiNoKizyunZikoku - imaNoZikoku) / 60;
			// ゲージのパラメータ
			A = tugiNoKizyunZikoku;
			B = maeNoKizyunZikoku;
			C = imaNoZikoku;
		}
		else {
			// 表示する時間
			minute = 99;
			E = 99;
			D = 99;
			// ゲージのパラメータ
			A = 640;
			B = 0;
			C = 0;
		}

		// 午前と午後を分ける
		if (Date.Hour >= 13){
			jikann = Date.Hour - 12;
			gogo = 1;
		}
		else{
			jikann = Date.Hour;
			gogo = 0;
		}

		NowJikann = NowJikann / zenntai;	//今の時間から全体の時間を割る事で残り時間の比率を計算

		//壁紙
		Handle = LoadGraph(""); // 画像をロード
		DrawGraph(0, 0, Handle, TRUE); // データハンドルを使って画像を描画

		
		DrawFormatStringToHandle(40, 180, keikaZikanNoIro, g_Lagefont, "経過時間"); //説明
		DrawFormatStringToHandle(350, 180, nokoriZikanNoIro, g_Lagefont, "残り時間"); //説明
		DrawFormatStringToHandle(70, 250, keikaZikanNoIro, g_Lagefont, "%d分", minute); //経過時間を描画します
		DrawFormatStringToHandle(230, 250, moziNoIro, g_Lagefont, "/%d分/", E); //全体の時間を描画します
		DrawFormatStringToHandle(450, 250, nokoriZikanNoIro, g_Lagefont, "%d分", D + 1); //残り時間
		DrawFormatStringToHandle(40, 300, nokoriZikanNoIro, g_Lagefont, "全体の残り時間%d分", F);
		

		if (maeNiOtoWoNarasitaZikantai != imaNoZikantai) {
			maeNiOtoWoNarasitaZikantai = imaNoZikantai;

			PlaySoundFile("test.wav", DX_PLAYTYPE_BACK);
		}


		DrawFormatStringToHandle(150, 400, moziNoIro, g_Lagefont, "%s%d時%d分", gogo ? "午後" : "午前", jikann, Date.Min);


		if (1 <= Date.Hour && Date.Hour <= 17) {
			if (Date.Hour == 12 && Date.Min > 40){
				DrawFormatStringToHandle(0, 0, moziNoIro, g_Lagefont, messages[Date.Hour + 1], D); //メッセージを表示
			}else
			DrawFormatStringToHandle(0, 0, moziNoIro, g_Lagefont, messages[Date.Hour], D); //メッセージを表示
		}
		//ゲージの描画
		DrawBox(0, 50, 640, 150, nokoriZikanNoIro, TRUE);
		int geeziNoKawarime = X1 + (X2 - X1)*(C - B) / (A - B);

		DrawBox(X1, Y1, geeziNoKawarime, 150, keikaZikanNoIro, TRUE);
		DrawLine(0, Y1, X2, Y1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, Y1 - 1, X2, Y1 - 1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, Y1 + 1, X2, Y1 + 1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, 150, X2, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(0, 150 - 1, X2, 150 - 1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, 150 + 1, X2, 150 + 1, geeziNoKyoukaiSenNoIro);
		DrawLine(geeziNoKawarime, Y1, geeziNoKawarime, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(geeziNoKawarime - 1, Y1, geeziNoKawarime - 1, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(geeziNoKawarime + 1, Y1, geeziNoKawarime + 1, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(0, Y1, 0, 150, hidariNoSenNoIro);
		DrawLine(0 + 1, Y1, 0 + 1, 150, hidariNoSenNoIro);
		DrawLine(0 + 2, Y1, 0 + 2, 150, hidariNoSenNoIro);

		// 画面右の線の描画
		DrawLine(640 - 3, 0, 640 - 3, 480, migiNoSenNoIro);
		DrawLine(640 - 2, 0, 640 - 2, 480, migiNoSenNoIro);
		DrawLine(640 - 1, 0, 640 - 1, 480, migiNoSenNoIro);

		ScreenFlip(); //DX_SCREEN_BACKに描画した画像を表示します


	}

	DxLib_End(); // DXライブラリ使用の終了処理

	return 0; // ソフトの終了 
}

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

Re: 現在時刻をリアルタイムに表示したい

#9

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

とりあえず値は適当でいいので、カウンター(数値)とゲージ(円)とバー(横グラフ)を表示するプログラムを作っていただけますか?
これだけの情報だとどこに表示するべきかわからないので、お願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ノダッシー

Re: 現在時刻をリアルタイムに表示したい

#10

投稿記事 by ノダッシー » 10年前

申し訳ないです。今日も考えてみたのですが・・・
途中までコードを書きました
円グラフの画像はこちらですgauge.bmp

コード:

#pragma warning(disable : 4819)
#include    "DxLib.h"
#include    <fstream>
#include    <string>
#include    <iostream>
#include    <stdio.h>

// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{

	int minute;

	SetOutApplicationLogValidFlag(FALSE); //ログ出力をするか否か
	ChangeWindowMode(TRUE); // ウインドウモードかフルスクリーンか
	SetGraphMode(640, 480, 16); //画面サイズを設定します

	if (DxLib_Init() == -1) // DXライブラリ初期化処理
	{
		return -1; // エラーが起きたら直ちに終了
	}

	SetBackgroundColor(0xFF, 0xFF, 0xFF); //背景の色を設定します

	int moziNoIro = GetColor(0, 0, 0);
	int keikaZikanNoIro = GetColor(217, 150, 148);
	int nokoriZikanNoIro = GetColor(0, 176, 80);
	int geeziNoKyoukaiSenNoIro = GetColor(56, 93, 138);
	int migiNoSenNoIro = GetColor(106, 106, 106);
	int hidariNoSenNoIro = GetColor(63, 93, 141);

	DATEDATA Date;

	int A = 640; //最大の値
	int B = 0; //最小の値
	int C = 0;//???
	int D = 0; //カウントダウン
	int E = 0; //表示用
	int X1 = 0;
	int X2 = 640;
	int Y1 = 50;
	//int Y2 = 50;
	int g_Lagefont = CreateFontToHandle("メイリオ", 30, -1, DX_FONTTYPE_ANTIALIASING);
	int jikann;
	int gogo;
	int Handle;//背景画像描画用
	int Handle_wav;


	//全体を表すゲージ
	int zenntai = 7 * 60;	//7時間 * 60分 = 420分
	int NowJikann = zenntai; //現在の残り時間
	int F = 7 * 60;			//全体の残り時間初期値420分
	int Width = 480;
	

	//円グラフ描画に使う変数
	int GrHandle = LoadGraph("gauge.bmp");//円の画像を読み込む
	int CenterX = 100, CenterY = 350, Percent = 90, StartPercent = 0.0;


	int maeNiOtoWoNarasitaZikantai = -1;
	bool saisyoNoFureemuDeAru = true;


	while (1){
		if (ProcessMessage() == -1)break; //ウインドウのメッセージを処理する
		GetDateTime(&Date);

		/*
		// テスト用
		// 時刻を60倍の速さで進ませる
		Date.Hour = Date.Min % 24;
		Date.Min = Date.Sec;
		Date.Sec= 0;
		*/

		SetDrawScreen(DX_SCREEN_BACK); //描画する画面を設定します
		ClearDrawScreen(); //画面に描画されている内容を消します






		//時間に合わせてメッセージが変わる
		const char* messages[18] = {
			"",
			" ",
			" ",
			" ",
			" ",
			" ", // 5
			" ",
			" ",
			"おはようござます",
			"おはようございます",
			"今日も一日頑張りましょう!", // 10
			"もうすぐお昼休みだ!",
			"休憩時間です!",
			"午後も頑張りましょう",
			"こんにちは",
			"残り1時間です", // 15
			"お疲れ様でした",
			"お疲れ様でした"
		};




		// 基準時刻
		int kizyunZikoku[12][2] = {
			{ 9, 0 }, { 9, 55 },
			{ 10, 0 }, { 10, 55 },
			{ 11, 0 }, { 12, 0 },
			{ 12, 40 }, { 13, 40 },
			{ 13, 45 }, { 14, 50 },
			{ 14, 55 }, { 16, 0 }
		};
		// その基準時刻と次の基準時刻の間でゲージを動かすか
		bool zikanWoHyouziSuru[12] = {
			true, true,
			true, true,
			true, true,
			true, true,
			true, true,
			true, true
		};

		// 今の時刻がどこに該当するかを計算する
		int imaNoZikoku = 60 * (60 * Date.Hour + Date.Min) + Date.Sec;
		int maeNoKizyunZikoku = 0;
		int tugiNoKizyunZikoku = 0;
		int imaNoZikantai = -1;
		for (int i = 0; i < 12; i++) {
			int miteiruKizyunZikoku = 60 * (60 * kizyunZikoku[i][0] + kizyunZikoku[i][1]);
			if (imaNoZikoku < miteiruKizyunZikoku) {
				if (i > 0) {
					imaNoZikantai = i - 1;
					maeNoKizyunZikoku = 60 * (60 * kizyunZikoku[i - 1][0] + kizyunZikoku[i - 1][1]);
					tugiNoKizyunZikoku = 60 * (60 * kizyunZikoku[i][0] + kizyunZikoku[i][1]);
				}
				break;
			}
		}
		if (saisyoNoFureemuDeAru) {
			maeNiOtoWoNarasitaZikantai = imaNoZikantai;
			saisyoNoFureemuDeAru = false;
		}

		// 経過時間と残り時間を計算し、ゲージのパラメータを設定する
		if (imaNoZikantai >= 0 && zikanWoHyouziSuru[imaNoZikantai]) {
			// 表示する時間
			minute = (imaNoZikoku - maeNoKizyunZikoku) / 60;
			E = (tugiNoKizyunZikoku - maeNoKizyunZikoku) / 60;
			D = (tugiNoKizyunZikoku - imaNoZikoku) / 60;
			// ゲージのパラメータ
			A = tugiNoKizyunZikoku;
			B = maeNoKizyunZikoku;
			C = imaNoZikoku;
		}
		else {
			// 表示する時間
			minute = 99;
			E = 99;
			D = 99;
			// ゲージのパラメータ
			A = 640;
			B = 0;
			C = 0;
		}

		// 午前と午後を分ける
		if (Date.Hour >= 13){
			jikann = Date.Hour - 12;
			gogo = 1;
		}
		else{
			jikann = Date.Hour;
			gogo = 0;
		}

		NowJikann = NowJikann / zenntai;	//今の時間から全体の時間を割る事で残り時間の比率を計算

		//壁紙
		//Handle = LoadGraph(""); // 画像をロード
		//DrawGraph(0, 0, Handle, TRUE); // データハンドルを使って画像を描画

		
		DrawFormatStringToHandle(40, 180, keikaZikanNoIro, g_Lagefont, "経過時間"); //説明
		DrawFormatStringToHandle(350, 180, nokoriZikanNoIro, g_Lagefont, "残り時間"); //説明
		DrawFormatStringToHandle(70, 250, keikaZikanNoIro, g_Lagefont, "%d分", minute); //経過時間を描画します
		DrawFormatStringToHandle(230, 250, moziNoIro, g_Lagefont, "/%d分/", E); //全体の時間を描画します
		DrawFormatStringToHandle(450, 250, nokoriZikanNoIro, g_Lagefont, "%d分", D + 1); //残り時間
		DrawFormatStringToHandle(150, 390, moziNoIro, g_Lagefont, "全体の残り時間%d分", F);//420分
		

		if (maeNiOtoWoNarasitaZikantai != imaNoZikantai) {
			maeNiOtoWoNarasitaZikantai = imaNoZikantai;

			PlaySoundFile("test.wav", DX_PLAYTYPE_BACK);
		}


		DrawFormatStringToHandle(200, 350, moziNoIro, g_Lagefont, "%s%d時%d分", gogo ? "午後" : "午前", jikann, Date.Min);



		//ゲージの描画
		DrawBox(0, 0, 640, 150, nokoriZikanNoIro, TRUE);
		int geeziNoKawarime = X1 + (X2 - X1)*(C - B) / (A - B);

		DrawBox(X1, Y1, geeziNoKawarime, 150, keikaZikanNoIro, TRUE);
		DrawLine(0, Y1, X2, Y1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, Y1 - 1, X2, Y1 - 1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, Y1 + 1, X2, Y1 + 1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, 150, X2, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(0, 150 - 1, X2, 150 - 1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, 150 + 1, X2, 150 + 1, geeziNoKyoukaiSenNoIro);
		DrawLine(geeziNoKawarime, Y1, geeziNoKawarime, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(geeziNoKawarime - 1, Y1, geeziNoKawarime - 1, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(geeziNoKawarime + 1, Y1, geeziNoKawarime + 1, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(0, Y1, 0, 150, hidariNoSenNoIro);
		DrawLine(0 + 1, Y1, 0 + 1, 150, hidariNoSenNoIro);
		DrawLine(0 + 2, Y1, 0 + 2, 150, hidariNoSenNoIro);

		// 画面右の線の描画
		DrawLine(640 - 3, 0, 640 - 3, 480, migiNoSenNoIro);
		DrawLine(640 - 2, 0, 640 - 2, 480, migiNoSenNoIro);
		DrawLine(640 - 1, 0, 640 - 1, 480, migiNoSenNoIro);

		////////////////////////////////////////////////////
		//円の描画 ここに円グラフを表示する 基準時間に合わせて円のゲージが減っていきます
		/*int kizyunZikoku[12][2] = {
			{ 9, 0 }, { 9, 55 },
			{ 10, 0 }, { 10, 55 },
			{ 11, 0 }, { 12, 0 },
			{ 12, 40 }, { 13, 40 },
			{ 13, 45 }, { 14, 50 },
			{ 14, 55 }, { 16, 0 }
			*/
		DrawCircle(100, 350, 50, keikaZikanNoIro, TRUE);
		DrawCircleGauge(CenterX, CenterY, Percent, GrHandle, StartPercent = 0.0);
		//////////////////////////////////////////////////////

		/////////////////////////////////////////////////////
		//全体のゲージ420分が徐々に減っていく。9時から420分で途中からソフトを立ち上げても自動で残りゲージ、残り時間が減ります
		DrawBox(0, 420, 640, 480, nokoriZikanNoIro, TRUE);
		DrawBox(0, 420, NowJikann / zenntai * Width, 480, keikaZikanNoIro, TRUE);//全体の経過時間
		//?NowJikann  -= 1/60;
		////////////////////////////////////////////////////


		if (1 <= Date.Hour && Date.Hour <= 17) {
			if (Date.Hour == 12 && Date.Min > 40){
				DrawFormatStringToHandle(0, 0, moziNoIro, g_Lagefont, messages[Date.Hour + 1], D); //メッセージを表示
			}
			else
				DrawFormatStringToHandle(0, 0, moziNoIro, g_Lagefont, messages[Date.Hour], D); //メッセージを表示
		}
		
		ScreenFlip(); //DX_SCREEN_BACKに描画した画像を表示します


	}

	DxLib_End(); // DXライブラリ使用の終了処理

	return 0; // ソフトの終了 
}

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

Re: 現在時刻をリアルタイムに表示したい

#11

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

ありがとうございます。修正してみました。

コード:

#pragma warning(disable : 4819)
#include    "DxLib.h"
#include    <fstream>
#include    <string>
#include    <iostream>
#include    <stdio.h>

// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{

	int minute;

	// 未使用の引数の警告を潰す
	(void)hInstance;(void)hPrevInstance;(void)lpCmdLine;(void)nCmdShow;

	SetOutApplicationLogValidFlag(FALSE); //ログ出力をするか否か
	ChangeWindowMode(TRUE); // ウインドウモードかフルスクリーンか
	SetGraphMode(640, 480, 16); //画面サイズを設定します

	if (DxLib_Init() == -1) // DXライブラリ初期化処理
	{
		return -1; // エラーが起きたら直ちに終了
	}

	SetBackgroundColor(0xFF, 0xFF, 0xFF); //背景の色を設定します

	int moziNoIro = GetColor(0, 0, 0);
	int keikaZikanNoIro = GetColor(217, 150, 148);
	int nokoriZikanNoIro = GetColor(0, 176, 80);
	int geeziNoKyoukaiSenNoIro = GetColor(56, 93, 138);
	int migiNoSenNoIro = GetColor(106, 106, 106);
	int hidariNoSenNoIro = GetColor(63, 93, 141);

	DATEDATA Date;

	int A = 640; //最大の値
	int B = 0; //最小の値
	int C = 0;//???
	int D = 0; //カウントダウン
	int E = 0; //表示用
	int X1 = 0;
	int X2 = 640;
	int Y1 = 50;
	//int Y2 = 50;
	int g_Lagefont = CreateFontToHandle("メイリオ", 30, -1, DX_FONTTYPE_ANTIALIASING);
	int jikann;
	int gogo;
	//int Handle;//背景画像描画用
	//int Handle_wav;


	//全体を表すゲージ
	int zenntai = 7 * 60;	//7時間 * 60分 = 420分
	int NowJikann = zenntai; //現在の残り時間
	int F = 7 * 60;			//全体の残り時間初期値420分
	int Width = 480;
	int G;
	

	//円グラフ描画に使う変数
	int GrHandle = LoadGraph("gauge.bmp");//円の画像を読み込む
	int CenterX = 100, CenterY = 350, Percent = 90, StartPercent = 0.0;


	int maeNiOtoWoNarasitaZikantai = -1;
	bool saisyoNoFureemuDeAru = true;

	// 時刻の設定
	int hazimariNoZikoku = 60 * (60 * 9 + 0) + 0; // 開始時刻 09:00:00
	int owariNoZikoku = hazimariNoZikoku + 60 * zenntai; // 終了時刻

	while (1){
		if (ProcessMessage() == -1)break; //ウインドウのメッセージを処理する
		GetDateTime(&Date);

		/*
		// テスト用
		// 時刻を60倍の速さで進ませる
		Date.Hour = Date.Min % 24;
		Date.Min = Date.Sec;
		Date.Sec = 0;
		//*/

		SetDrawScreen(DX_SCREEN_BACK); //描画する画面を設定します
		ClearDrawScreen(); //画面に描画されている内容を消します

		// テスト用に認識している現在時刻を表示する
		//DrawFormatString(500, 350, GetColor(0, 0, 0), "%02d:%02d:%02d", Date.Hour, Date.Min, Date.Sec);





		//時間に合わせてメッセージが変わる
		const char* messages[18] = {
			"",
			" ",
			" ",
			" ",
			" ",
			" ", // 5
			" ",
			" ",
			"おはようござます",
			"おはようございます",
			"今日も一日頑張りましょう!", // 10
			"もうすぐお昼休みだ!",
			"休憩時間です!",
			"午後も頑張りましょう",
			"こんにちは",
			"残り1時間です", // 15
			"お疲れ様でした",
			"お疲れ様でした"
		};




		// 基準時刻
		int kizyunZikoku[12][2] = {
			{ 9, 0 }, { 9, 55 },
			{ 10, 0 }, { 10, 55 },
			{ 11, 0 }, { 12, 0 },
			{ 12, 40 }, { 13, 40 },
			{ 13, 45 }, { 14, 50 },
			{ 14, 55 }, { 16, 0 }
		};
		// その基準時刻と次の基準時刻の間でゲージを動かすか
		bool zikanWoHyouziSuru[12] = {
			true, true,
			true, true,
			true, true,
			true, true,
			true, true,
			true, true
		};

		// 今の時刻がどこに該当するかを計算する
		int imaNoZikoku = 60 * (60 * Date.Hour + Date.Min) + Date.Sec;
		int maeNoKizyunZikoku = 0;
		int tugiNoKizyunZikoku = 0;
		int imaNoZikantai = -1;
		for (int i = 0; i < 12; i++) {
			int miteiruKizyunZikoku = 60 * (60 * kizyunZikoku[i][0] + kizyunZikoku[i][1]);
			if (imaNoZikoku < miteiruKizyunZikoku) {
				if (i > 0) {
					imaNoZikantai = i - 1;
					maeNoKizyunZikoku = 60 * (60 * kizyunZikoku[i - 1][0] + kizyunZikoku[i - 1][1]);
					tugiNoKizyunZikoku = 60 * (60 * kizyunZikoku[i][0] + kizyunZikoku[i][1]);
				}
				break;
			}
		}
		if (saisyoNoFureemuDeAru) {
			maeNiOtoWoNarasitaZikantai = imaNoZikantai;
			saisyoNoFureemuDeAru = false;
		}

		// 経過時間と残り時間を計算し、ゲージのパラメータを設定する
		if (imaNoZikantai >= 0 && zikanWoHyouziSuru[imaNoZikantai]) {
			// 表示する時間
			minute = (imaNoZikoku - maeNoKizyunZikoku) / 60;
			E = (tugiNoKizyunZikoku - maeNoKizyunZikoku) / 60;
			D = (tugiNoKizyunZikoku - imaNoZikoku) / 60;
			// ゲージのパラメータ
			A = tugiNoKizyunZikoku;
			B = maeNoKizyunZikoku;
			C = imaNoZikoku;
		}
		else {
			// 表示する時間
			minute = 99;
			E = 99;
			D = 99;
			// ゲージのパラメータ
			A = 640;
			B = 0;
			C = 0;
		}

		// 全体の残り時間を計算する
		if (imaNoZikoku < hazimariNoZikoku) {
			// 始まっていない
			F = 60 * zenntai;
		} else if (owariNoZikoku < imaNoZikoku) {
			// 終わった後
			F = 0;
		} else {
			// 実行中
			F = owariNoZikoku - imaNoZikoku;
		}
		// 円グラフのパラメータを設定する
		Percent = (60 * zenntai - F) * 100 / (60 * zenntai);
		// 棒グラフのパラメータを設定する
		G = F * Width / (60 * zenntai);
		// 残り時間を分に変換する
		F = (F + 59) / 60;

		// 情報が正しくなるように補正する
		if (imaNoZikoku % 60 == 0) D--;

		// 午前と午後を分ける
		if (Date.Hour >= 13){
			jikann = Date.Hour - 12;
			gogo = 1;
		}
		else{
			jikann = Date.Hour;
			gogo = 0;
		}

		NowJikann = NowJikann / zenntai;	//今の時間から全体の時間を割る事で残り時間の比率を計算

		//壁紙
		//Handle = LoadGraph(""); // 画像をロード
		//DrawGraph(0, 0, Handle, TRUE); // データハンドルを使って画像を描画

		
		DrawFormatStringToHandle(40, 180, keikaZikanNoIro, g_Lagefont, "経過時間"); //説明
		DrawFormatStringToHandle(350, 180, nokoriZikanNoIro, g_Lagefont, "残り時間"); //説明
		DrawFormatStringToHandle(70, 250, keikaZikanNoIro, g_Lagefont, "%d分", minute); //経過時間を描画します
		DrawFormatStringToHandle(230, 250, moziNoIro, g_Lagefont, "/%d分/", E); //全体の時間を描画します
		DrawFormatStringToHandle(450, 250, nokoriZikanNoIro, g_Lagefont, "%d分", D + 1); //残り時間
		DrawFormatStringToHandle(150, 390, moziNoIro, g_Lagefont, "全体の残り時間%d分", F);//420分
		

		if (maeNiOtoWoNarasitaZikantai != imaNoZikantai) {
			maeNiOtoWoNarasitaZikantai = imaNoZikantai;

			PlaySoundFile("test.wav", DX_PLAYTYPE_BACK);
		}


		DrawFormatStringToHandle(200, 350, moziNoIro, g_Lagefont, "%s%d時%d分", gogo ? "午後" : "午前", jikann, Date.Min);

		//ゲージの描画
		DrawBox(0, 0, 640, 150, nokoriZikanNoIro, TRUE);
		int geeziNoKawarime = X1 + (X2 - X1)*(C - B) / (A - B);

		DrawBox(X1, Y1, geeziNoKawarime, 150, keikaZikanNoIro, TRUE);
		DrawLine(0, Y1, X2, Y1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, Y1 - 1, X2, Y1 - 1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, Y1 + 1, X2, Y1 + 1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, 150, X2, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(0, 150 - 1, X2, 150 - 1, geeziNoKyoukaiSenNoIro);
		DrawLine(0, 150 + 1, X2, 150 + 1, geeziNoKyoukaiSenNoIro);
		DrawLine(geeziNoKawarime, Y1, geeziNoKawarime, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(geeziNoKawarime - 1, Y1, geeziNoKawarime - 1, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(geeziNoKawarime + 1, Y1, geeziNoKawarime + 1, 150, geeziNoKyoukaiSenNoIro);
		DrawLine(0, Y1, 0, 150, hidariNoSenNoIro);
		DrawLine(0 + 1, Y1, 0 + 1, 150, hidariNoSenNoIro);
		DrawLine(0 + 2, Y1, 0 + 2, 150, hidariNoSenNoIro);

		// 画面右の線の描画
		DrawLine(640 - 3, 0, 640 - 3, 480, migiNoSenNoIro);
		DrawLine(640 - 2, 0, 640 - 2, 480, migiNoSenNoIro);
		DrawLine(640 - 1, 0, 640 - 1, 480, migiNoSenNoIro);

		////////////////////////////////////////////////////
		//円の描画 ここに円グラフを表示する 基準時間に合わせて円のゲージが減っていきます
		/*int kizyunZikoku[12][2] = {
			{ 9, 0 }, { 9, 55 },
			{ 10, 0 }, { 10, 55 },
			{ 11, 0 }, { 12, 0 },
			{ 12, 40 }, { 13, 40 },
			{ 13, 45 }, { 14, 50 },
			{ 14, 55 }, { 16, 0 }
			*/
		DrawCircle(100, 350, 50, keikaZikanNoIro, TRUE);
		DrawCircleGauge(CenterX, CenterY, Percent, GrHandle, StartPercent = 0.0);
		//////////////////////////////////////////////////////

		/////////////////////////////////////////////////////
		//全体のゲージ420分が徐々に減っていく。9時から420分で途中からソフトを立ち上げても自動で残りゲージ、残り時間が減ります
		DrawBox(0, 420, 640, 480, nokoriZikanNoIro, TRUE);
		//DrawBox(0, 420, NowJikann / zenntai * Width, 480, keikaZikanNoIro, TRUE);//全体の経過時間
		DrawBox(0, 420, G, 480, keikaZikanNoIro, TRUE);//全体の経過時間
		//?NowJikann  -= 1/60;
		////////////////////////////////////////////////////


		if (1 <= Date.Hour && Date.Hour <= 17) {
			if (Date.Hour == 12 && Date.Min > 40){
				DrawFormatStringToHandle(0, 0, moziNoIro, g_Lagefont, messages[Date.Hour + 1], D); //メッセージを表示
			}
			else
				DrawFormatStringToHandle(0, 0, moziNoIro, g_Lagefont, messages[Date.Hour], D); //メッセージを表示
		}
		
		ScreenFlip(); //DX_SCREEN_BACKに描画した画像を表示します


	}

	DxLib_End(); // DXライブラリ使用の終了処理

	return 0; // ソフトの終了 
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ノダッシー

Re: 現在時刻をリアルタイムに表示したい

#12

投稿記事 by ノダッシー » 10年前

大変お世話になりました
ありがとうございました

閉鎖

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