diff --git a/source/main.cpp b/source/main.cpp index cc011df37178ab9a74c058e3de3d466fe5d42af9..aabdb9c05cad69b52d0309b0cabbf94486f6a52c 100755 --- a/source/main.cpp +++ b/source/main.cpp @@ -28,125 +28,12 @@ MicroBit UBIT; -/** - * @brief Main class responsible for the game loop and logic - */ -class Game { -public: - /** - * @brief Default Constructor - */ - Game(); - - /** - * @brief Starts a new run of the game - * @note method blocks until game over. - */ - void run(); - - /* begin event handler methods */ - - /** - * Handles Button A Press event - */ - void press_button_a(MicroBitEvent); - - /** - * Handles Button B Press event - */ - void press_button_b(MicroBitEvent); - - /* end event handler methods */ - -private: - bool on; // whether flasher should be on or off - /** - * @brief Draws whatever's in the screen buffer to display - */ - void draw(); - - // internal screen-buffer, which we draw to first before pasting to display - MicroBitImage screen_buffer; -}; - -Game::Game() - : screen_buffer(5, 5) // our screen buffer mirrors the display dimensions -{} - -void Game::press_button_a(MicroBitEvent e) { - // XXX: debug - this->on = true; -} - -void Game::press_button_b(MicroBitEvent e) { - // XXX: debug - this->on = false; -} - -void Game::run() { - // UBIT.display.scroll("NEW GAME!"); - // init screen display mode, to be sure it is in a known-state - // TODO: consider changing to greyscale to allow "mutli-coloured" blocks - UBIT.display.setDisplayMode(DISPLAY_MODE_BLACK_AND_WHITE); - // register event-handlers - UBIT.messageBus.listen( - MICROBIT_ID_BUTTON_A, - MICROBIT_BUTTON_EVT_CLICK, - this, - &Game::press_button_a - ); - UBIT.messageBus.listen( - MICROBIT_ID_BUTTON_B, - MICROBIT_BUTTON_EVT_CLICK, - this, - &Game::press_button_b - ); - while (true) { // TODO: change to use game-over condition - // sleep to conserve CPU cycles and allow other fibers a chance to run - UBIT.sleep(10); // 10ms sleep, or 100Hz tick rate - } - // TODO: add the rest of the game logic - UBIT.display.scroll("GAME OVER!"); - // TODO: display final score - // TODO: de-register event-handlers - UBIT.messageBus.ignore( - MICROBIT_ID_BUTTON_A, - MICROBIT_BUTTON_EVT_CLICK, - this, - &Game::press_button_a - ); - UBIT.messageBus.ignore( - MICROBIT_ID_BUTTON_B, - MICROBIT_BUTTON_EVT_CLICK, - this, - &Game::press_button_b - ); -} - -void Game::draw() { - // XXX: debug drawing, fill the screen buffer with black - this->screen_buffer.clear(); - if (this->on) { - this->screen_buffer.setPixelValue(2, 2, 255); - } - // render our screen buffer - UBIT.display.print(this->screen_buffer); -} - int main() { // Initialise the micro:bit runtime. UBIT.init(); UBIT.display.scroll("BLOCKS!"); - Game game; - - create_fiber(game.draw); - - while (true) { // indefinitely start new games - game.run(); - } - // TODO: potentially remove this call, if clarified that it is not required. // If main exits, there may still be other fibers running or registered event handlers etc. // Simply release this fiber, which will mean we enter the scheduler. Worse case, we then