From 9439f3beb0d6fe8632b793b7957dc6cb512117ff Mon Sep 17 00:00:00 2001 From: Daniel Jones Date: Fri, 12 Jun 2020 00:51:51 +0930 Subject: added timer --- MainWindow.cpp | 33 +++++++++++++++++++++++++++++++-- MainWindow.h | 6 ++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index fa1efa8..063b22b 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -25,6 +25,7 @@ FXDEFMAP(MainWindow) MainWindow_Map[]= FXMAPFUNC(SEL_COMMAND, MainWindow::UI_Tile, MainWindow::on_Tile_Click), FXMAPFUNC(SEL_COMMAND, MainWindow::UI_New, MainWindow::on_New_Click), FXMAPFUNC(SEL_RIGHTBUTTONPRESS, MainWindow::UI_Tile, MainWindow::on_Tile_Right_Click), + FXMAPFUNC(SEL_TIMEOUT, MainWindow::UI_Timer_Tick, MainWindow::on_Timer_Tick), }; FXIMPLEMENT(MainWindow, FXMainWindow, MainWindow_Map, ARRAYNUMBER(MainWindow_Map)) @@ -47,6 +48,15 @@ MainWindow::~MainWindow() delete board; } +long +MainWindow::on_Timer_Tick(FXObject *sender, FXSelector sel, void *data) +{ + seconds++; + time_label->setText(FXStringVal(seconds)); + getApp()->addTimeout(this, UI_Timer_Tick, 1000, nullptr); + return 1; +} + void MainWindow::create() { @@ -75,6 +85,7 @@ MainWindow::create_ui() // Label above the canvas new FXLabel(canvasFrame,"foxminesweeper", NULL, JUSTIFY_CENTER_X|LAYOUT_FILL_X); + time_label = new FXLabel(canvasFrame, "0", nullptr, LAYOUT_CENTER_X); // Horizontal divider line new FXHorizontalSeparator(canvasFrame, SEPARATOR_GROOVE|LAYOUT_FILL_X); @@ -109,6 +120,8 @@ MainWindow::create_ui() void MainWindow::new_game(int width, int height, int minecount) { + seconds = 0; + ticking = false; if (board) delete board; puts("starting new game.."); @@ -196,6 +209,11 @@ MainWindow::draw_buttons() long MainWindow::on_Tile_Click(FXObject *sender, FXSelector sel, void *data) { + if (!ticking) + { + app->addTimeout(this, UI_Timer_Tick, 1000); + ticking = true; + } if (game_over == true) return 1; int x = 0, y = 0; @@ -216,20 +234,26 @@ MainWindow::on_Tile_Click(FXObject *sender, FXSelector sel, void *data) if (!board->is_game_running() && !board->is_game_won()) { /* lost */ + app->removeTimeout(this, UI_Timer_Tick); puts("you lose the game"); - FXMessageBox *msgbox = new FXMessageBox(app, "Game Over", "You lost", nullptr, FX::MBOX_OK); + std::string message = "You lost in: " + std::to_string(seconds) + " seconds"; + FXMessageBox *msgbox = new FXMessageBox(app, "Game Over", FXString(message.c_str()), nullptr, FX::MBOX_OK); msgbox->create(); msgbox->show(); game_over = true; + ticking = false; } else if (!board->is_game_running() && board->is_game_won()) { /* won */ + app->removeTimeout(this, UI_Timer_Tick); puts("you won the game"); - FXMessageBox *msgbox = new FXMessageBox(app, "Game Over", "You win", nullptr, FX::MBOX_OK); + std::string message = "You won in: " + std::to_string(seconds) + " seconds"; + FXMessageBox *msgbox = new FXMessageBox(app, "Game Over", FXString(message.c_str()), nullptr, FX::MBOX_OK); msgbox->create(); msgbox->show(); game_over = true; + ticking = false; } button->setFrameStyle(0); draw_buttons(); @@ -239,6 +263,11 @@ MainWindow::on_Tile_Click(FXObject *sender, FXSelector sel, void *data) long MainWindow::on_Tile_Right_Click(FXObject *sender, FXSelector sel, void *data) { + if (!ticking) + { + app->addTimeout(this, UI_Timer_Tick, 1000); + ticking = true; + } if (game_over == true) return 1; int x = 0, y = 0; diff --git a/MainWindow.h b/MainWindow.h index 0cc0841..29e998c 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -20,6 +20,7 @@ #include #include #include +#include #include "Board.h" #include "icons.h" @@ -37,12 +38,14 @@ class MainWindow : public FXMainWindow enum { UI_Tile = FXMainWindow::ID_LAST, UI_New, + UI_Timer_Tick, }; /* Event handlers */ long on_Tile_Click(FXObject *sender, FXSelector sel, void *data); long on_New_Click(FXObject *sender, FXSelector sel, void *data); long on_Tile_Right_Click(FXObject *sender, FXSelector sel, void *data); + long on_Timer_Tick(FXObject *sender, FXSelector sel, void *data); FXApp *get_app(){ return app; }; @@ -55,6 +58,8 @@ class MainWindow : public FXMainWindow void new_game(int width, int height, int minecount); void draw_buttons(); bool game_over; + long unsigned int seconds; + bool ticking; FXHorizontalFrame *contents; // Content frame FXVerticalFrame *canvasFrame; // Canvas frame FXVerticalFrame *buttonFrame; // Button frame @@ -62,6 +67,7 @@ class MainWindow : public FXMainWindow FXApp *app; Board *board; FXMatrix *matrix; + FXLabel *time_label; std::vector> tile_buttons; /* icons */ FXIcon *bomb_icon; -- cgit v1.2.3