Creating time keeping for the game using c++ threads instead of relying on GTK
This commit is contained in:
@@ -12,6 +12,20 @@ MineField::MineField(int cols, int rows, int mines): m_rows(rows),
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MineField::timerTick() {
|
||||||
|
|
||||||
|
auto start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
while((m_exploded == false) && (m_gameWon == false)) {
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(200));
|
||||||
|
auto now = std::chrono::system_clock::now();
|
||||||
|
const auto duration = now - start;
|
||||||
|
std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
|
||||||
|
m_time += duration.count();
|
||||||
|
timerSignal.emit(m_time);
|
||||||
|
start = std::chrono::system_clock::now();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MineField::initBombs(int x, int y) {
|
void MineField::initBombs(int x, int y) {
|
||||||
|
|
||||||
@@ -28,6 +42,11 @@ void MineField::initBombs(int x, int y) {
|
|||||||
m_cells.at(position)->isBomb = true;
|
m_cells.at(position)->isBomb = true;
|
||||||
--remainingMines;
|
--remainingMines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//init the timer to zero and start the timer thread
|
||||||
|
m_time = 0;
|
||||||
|
timerThread = std::thread(&MineField::timerTick, this);
|
||||||
|
timerThread.detach(); //not sure if this is okay
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MineField::openCell(int x, int y) {
|
bool MineField::openCell(int x, int y) {
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// #include <emmintrin.h>
|
|
||||||
#include <sigc++/signal.h>
|
#include <sigc++/signal.h>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <thread>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
struct Cell {
|
struct Cell {
|
||||||
bool isFlagged;
|
bool isFlagged;
|
||||||
@@ -17,19 +18,20 @@ struct Cell {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class MineField {
|
class MineField {
|
||||||
|
|
||||||
std::vector<std::shared_ptr<Cell>> m_cells;
|
std::vector<std::shared_ptr<Cell>> m_cells;
|
||||||
int m_rows;
|
int m_rows;
|
||||||
int m_cols;
|
int m_cols;
|
||||||
int m_totalMines;
|
int m_totalMines;
|
||||||
int m_remainingFlags;
|
int m_remainingFlags;
|
||||||
int m_openCells;
|
int m_openCells;
|
||||||
bool m_exploded;
|
bool m_exploded;
|
||||||
|
bool m_gameWon;
|
||||||
|
size_t m_time;
|
||||||
|
std::thread timerThread;
|
||||||
void computeBombsNearby(int x, int y);
|
void computeBombsNearby(int x, int y);
|
||||||
void openNeighboorhood(int x, int y);
|
void openNeighboorhood(int x, int y);
|
||||||
void setOpenCell(int x, int y);
|
void setOpenCell(int x, int y);
|
||||||
//bint vecToPosition(int x, int y) {return (x + y * m_rows); };
|
void timerTick();
|
||||||
//std::pair<int, int> positionToVec(int pos) {return std::make_pair(pos % m_cols, pos / m_cols); };
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MineField(int cols, int rows, int mines);
|
MineField(int cols, int rows, int mines);
|
||||||
@@ -47,8 +49,9 @@ public:
|
|||||||
int getTotalMines() {return m_totalMines; };
|
int getTotalMines() {return m_totalMines; };
|
||||||
void startNewGame(int cols, int rows, int mines);
|
void startNewGame(int cols, int rows, int mines);
|
||||||
|
|
||||||
sigc::signal<void(int, int)> openCellSignal;
|
sigc::signal<void(int, int)> openCellSignal;
|
||||||
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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user