コード:
#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; // ソフトの終了
}