-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcountdown.cpp
More file actions
161 lines (147 loc) · 6.13 KB
/
Copy pathcountdown.cpp
File metadata and controls
161 lines (147 loc) · 6.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include "common.h"
// Hàm định dạng thời gian từ giây thành chuỗi "HH:MM:SS"
string formatTime(int seconds)
{
// Tính số giờ, phút giây
int hours = seconds / 3600;
seconds %= 3600;
int minutes = seconds / 60;
int secs = seconds % 60;
// Trả về chuỗi định dạng "HH:MM:SS"
return (hours < 10 ? "0" : "") + to_string(hours) + ":" +
(minutes < 10 ? "0" : "") + to_string(minutes) + ":" +
(secs < 10 ? "0" : "") + to_string(secs);
}
// Hàm thực hiện việc đếm ngược
bool runCountdown(SDL_Window *window, SDL_Renderer *renderer, int &countdownTime)
{
// Mở font chữ với kích thước 100
TTF_Font *font = TTF_OpenFont("data/digital.ttf", 100);
// Mở font chữ với kích thước 50
TTF_Font *textFont = TTF_OpenFont("data/digital.ttf", 50);
Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048);
// Mở âm thanh
Mix_Chunk *alarm = Mix_LoadWAV("data/alarm.mp3");
// Biến điều khiển vòng lặp
bool running = true, paused = false, alarmPlayed = false;
SDL_Event e;
// Lấy thời gian bắt đầu
Uint32 startTime = SDL_GetTicks(); // Thời gian bắt đầu của bộ đếm ngược
Uint32 pauseStartTime = 0; // Thời gian bắt đầu của trạng thái tạm dừng
Uint32 elapsedPausedTime = 0; // Tổng thời gian đã tạm dừng
int lastRemainingTime = -1; // Thời gian còn lại cuối cùng của bộ đếm ngược
while (running)
{
// Định nghĩa vị trí và kích thước của nút "Pause"
SDL_Rect pauseButton = {WINDOW_WIDTH / 2 - 100, WINDOW_HEIGHT / 2 + 50, 80, 40};
// Định nghĩa vị trí và kích thước của nút "Reset"
SDL_Rect resetButton = {WINDOW_WIDTH / 2 + 20, WINDOW_HEIGHT / 2 + 50, 80, 40};
// Xử lý sự kiện
while (SDL_PollEvent(&e) != 0)
{
// Kiểm tra sự kiện thoát
if (e.type == SDL_QUIT)
{
closeSDL(window, renderer);
exit(0);
}
// Xử lý sự kiện cửa sổ
if (e.type == SDL_WINDOWEVENT)
handleWindowEvent(e, window);
if (e.type == SDL_MOUSEBUTTONDOWN)
{
int x, y;
SDL_GetMouseState(&x, &y);
// Xử lý nhấn nút "Pause" hoặc "Repeat"
if (checkClickButton(x, y, pauseButton))
{
if (lastRemainingTime > 0)
{
// Đổi trạng thái tạm dừng
paused = !paused;
if (paused)
pauseStartTime = SDL_GetTicks(); // Lưu thời gian bắt đầu tạm dừng
else
elapsedPausedTime += SDL_GetTicks() - pauseStartTime; // Cộng thời gian tạm dừng
}
else
{
// Khởi động lại countdown
startTime = SDL_GetTicks();
elapsedPausedTime = 0;
paused = false;
alarmPlayed = false;
// Dừng âm thanh ngay lập tức
Mix_HaltChannel(-1);
}
}
// Nếu nhấn nút "Reset", khởi động lại countdown
if (checkClickButton(x, y, resetButton))
{
// Dừng âm thanh ngay lập tức
Mix_HaltChannel(-1);
return true;
}
}
}
if (!paused)
{
// Tính toán thời gian còn lại
int remainingTime = countdownTime - (SDL_GetTicks() - startTime - elapsedPausedTime) / 1000;
if (remainingTime < 0)
remainingTime = 0;
lastRemainingTime = remainingTime;
// Xóa renderer với màu nền
clearRenderer(renderer, BACKGROUND_COLOR);
// Vẽ thời gian còn lại hoặc "TIME OUT"
string timeText = (remainingTime > 0) ? formatTime(remainingTime) : "TIME OUT";
drawText(renderer, font, timeText.c_str(), TIME_COLOR, 0, -80);
// Vẽ thanh tiến trình
drawProgressBar(renderer, countdownTime, remainingTime);
if (remainingTime > 0)
{
// Vẽ nút "Pause" hoặc "Resume"
drawButton(renderer, paused ? "Resume" : "Pause", pauseButton);
}
else
{
// Khi hết thời gian, đổi nút "Pause" thành "Repeat"
drawButton(renderer, "Repeat", pauseButton);
if (!alarmPlayed)
{
// Phát âm thanh báo động khi hết thời gian
Mix_PlayChannel(-1, alarm, 0);
// Đánh dấu đã phát âm thanh
alarmPlayed = true;
}
}
// Vẽ nút "Reset"
drawButton(renderer, "Reset", resetButton);
// Hiển thị renderer
SDL_RenderPresent(renderer);
}
else
{
// Xóa renderer với màu nền
clearRenderer(renderer, BACKGROUND_COLOR);
// Vẽ chữ "Paused"
drawText(renderer, textFont, "Paused", PAUSE_TEXT_COLOR, 0, -150);
// Vẽ thời gian còn lại
drawText(renderer, font, formatTime(lastRemainingTime).c_str(), TIME_COLOR, 0, -80);
// Vẽ nút "Resume"
drawButton(renderer, "Resume", pauseButton);
// Vẽ nút "Reset"
drawButton(renderer, "Reset", resetButton);
// Hiển thị renderer
SDL_RenderPresent(renderer);
}
// Giảm tải CPU
SDL_Delay(1000 / 60);
}
// Đóng font chữ và giải phóng âm thanh
TTF_CloseFont(font);
TTF_CloseFont(textFont);
Mix_FreeChunk(alarm);
// Kết thúc hàm
return false;
}