Changing the clocklabel to work with the timerThread signal

* src/minefield.hpp:
This commit is contained in:
Bernardo Magri
2025-03-10 18:55:45 +00:00
parent efc523c0c9
commit 8afb29b680
4 changed files with 20 additions and 15 deletions

View File

@@ -17,7 +17,7 @@ void MineField::timerTick() {
auto start = std::chrono::system_clock::now(); auto start = std::chrono::system_clock::now();
while((m_exploded == false) && (m_gameWon == false)) { while((m_exploded == false) && (m_gameWon == false)) {
std::this_thread::sleep_for(std::chrono::milliseconds(200)); std::this_thread::sleep_for(std::chrono::milliseconds(100));
auto now = std::chrono::system_clock::now(); auto now = std::chrono::system_clock::now();
const auto duration = now - start; const auto duration = now - start;
std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(duration); std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
@@ -47,12 +47,13 @@ void MineField::initBombs(int x, int y) {
//init the timer to zero and start the timer thread //init the timer to zero and start the timer thread
m_time = 0; m_time = 0;
timerThread = std::thread(&MineField::timerTick, this); timerThread = std::thread(&MineField::timerTick, this);
timerThread.detach(); //not sure if this is okay (better to call join() when I set the condition to stop the thread) //timerThread.detach(); //not sure if this is okay (better to call join() when I set the condition to stop the thread)
} }
bool MineField::openCell(int x, int y) { bool MineField::openCell(int x, int y) {
if(isBomb(x, y)) { if(isBomb(x, y)) {
m_exploded = true; m_exploded = true;
timerThread.join();
gameOverSignal.emit(); gameOverSignal.emit();
return false; return false;
} }
@@ -120,6 +121,7 @@ void MineField::setOpenCell(int x, int y) {
openCellSignal.emit(x, y); openCellSignal.emit(x, y);
if((++m_openCells == (m_cols * m_rows - m_totalMines)) && (m_exploded == false)) { if((++m_openCells == (m_cols * m_rows - m_totalMines)) && (m_exploded == false)) {
m_gameWon = true; m_gameWon = true;
timerThread.join();
gameWonSignal.emit(); gameWonSignal.emit();
} }
} }

View File

@@ -53,5 +53,5 @@ public:
sigc::signal<void(int)> remainingFlagsSignal; sigc::signal<void(int)> remainingFlagsSignal;
sigc::signal<void(void)> gameWonSignal; sigc::signal<void(void)> gameWonSignal;
sigc::signal<void(void)> gameOverSignal; sigc::signal<void(void)> gameOverSignal;
sigc::signal<void(unsigned int)> timerSignal; sigc::signal<void(size_t)> timerSignal;
}; };

View File

@@ -163,20 +163,22 @@ void MainWindow::gameOver() {
//std::cout << "Signal gameOver emmited\n"; //std::cout << "Signal gameOver emmited\n";
} }
bool MainWindow::updateClockLabel() void MainWindow::updateClockLabel(size_t time)
{ {
++m_elapsedTime; //++m_elapsedTime;
int deciseconds = m_elapsedTime % 10; //int deciseconds = m_elapsedTime % 10;
int seconds = (m_elapsedTime / 10) % 60; //int seconds = (m_elapsedTime / 10) % 60;
int minutes = (m_elapsedTime /600) % 60; //int minutes = (m_elapsedTime /600) % 60;
Glib::ustring msg = Glib::ustring::compose("Elapsed time: %1:%2.%3", \ Glib::ustring msg = Glib::ustring::compose("Elapsed time: %1", time);
Glib::ustring::format(std::setfill(L'0'), std::setw(2), minutes), \
Glib::ustring::format(std::setfill(L'0'), std::setw(2), seconds), \ // Glib::ustring msg = Glib::ustring::compose("Elapsed time: %1:%2.%3", \
Glib::ustring::format(std::setfill(L'0'), std::setw(1), deciseconds)); // Glib::ustring::format(std::setfill(L'0'), std::setw(2), minutes), \
// Glib::ustring::format(std::setfill(L'0'), std::setw(2), seconds), \
// Glib::ustring::format(std::setfill(L'0'), std::setw(1), deciseconds));
clockLabel.set_label(msg); clockLabel.set_label(msg);
return true; //return true;
} }
MainWindow::MainWindow() MainWindow::MainWindow()
@@ -273,9 +275,10 @@ MainWindow::MainWindow()
//optionButton.set_icon_name("open-menu"); //optionButton.set_icon_name("open-menu");
field.timerSignal.connect(sigc::bind(sigc::mem_fun(*this, &MainWindow::updateClockLabel)));
//if (clockSignalConn.connected()) clockSignalConn.disconnect(); //if (clockSignalConn.connected()) clockSignalConn.disconnect();
//elapsedTime = 0; //elapsedTime = 0;
clockSignalConn = Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWindow::updateClockLabel), 100); //clockSignalConn = Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWindow::updateClockLabel), 100);
//} //}
//create the minefield //create the minefield
//field = new MineField(COLS, MINES); //field = new MineField(COLS, MINES);

View File

@@ -32,7 +32,7 @@ class MainWindow : public Gtk::Window
void updateCell(int x, int y); void updateCell(int x, int y);
void openBombs(); void openBombs();
void updateFlagsLabel(int flags); void updateFlagsLabel(int flags);
bool updateClockLabel(); void updateClockLabel(size_t time);
void gameWon(); void gameWon();
void gameOver(); void gameOver();
sigc::connection clockSignalConn; sigc::connection clockSignalConn;