Skip to content
Snippets Groups Projects
Commit 6a10118b authored by ja3-saxby's avatar ja3-saxby
Browse files

Revert "Revert "Perhaps C++ event-handlers are broken...""

This reverts commit 26c8f41b.
parent 26c8f41b
Branches
Tags
No related merge requests found
...@@ -17,128 +17,23 @@ ...@@ -17,128 +17,23 @@
#include "MicroBit.h" #include "MicroBit.h"
MicroBit micro_bit;
/** void event_handler(MicroBitEvent) {
* @brief Main class responsible for the game loop and logic micro_bit.display.printAsync("A", 200);
*/
class Game {
public:
/**
* @brief Constructor
* @details takes reference to the micro-bit instance for the sake of not
* using global variables.
*/
Game(MicroBit& micro_bit);
/**
* @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 e);
/**
* Handles Button B Press event
*/
void press_button_b(MicroBitEvent e);
/* end event handler methods */
private:
/**
* @brief Draws whatever's in the screen buffer to display
*/
void draw();
// reference to our MicroBit instance
MicroBit& micro_bit;
// internal screen-buffer, which we draw to first before pasting to display
MicroBitImage screen_buffer;
};
Game::Game(MicroBit& micro_bit)
: micro_bit(micro_bit)
, screen_buffer(5, 5) // our screen buffer mirrors the display dimensions
{}
void Game::run() {
// this->micro_bit.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
// this->micro_bit.display.setDisplayMode(DISPLAY_MODE_BLACK_AND_WHITE);
// register event-handlers
this->micro_bit.messageBus.listen(
MICROBIT_ID_BUTTON_A,
MICROBIT_BUTTON_EVT_CLICK,
this,
&Game::press_button_a
);
this->micro_bit.messageBus.listen(
MICROBIT_ID_BUTTON_B,
MICROBIT_BUTTON_EVT_CLICK,
this,
&Game::press_button_b
);
while (true) { // TODO: change to use game-over condition
// this->draw(); // render screen buffer
// sleep to conserve CPU cycles and allow other fibers a chance to run
this->micro_bit.sleep(100); // a 100ms sleep gives us a 10Hz tick-rate
}
// TODO: add the rest of the game logic
this->micro_bit.display.scroll("GAME OVER!");
// TODO: display final score
// TODO: de-register event-handlers
this->micro_bit.messageBus.ignore(
MICROBIT_ID_BUTTON_A,
MICROBIT_BUTTON_EVT_CLICK,
this,
&Game::press_button_a
);
this->micro_bit.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();
// render our screen buffer
this->micro_bit.display.image.paste(this->screen_buffer);
}
void Game::press_button_a(MicroBitEvent e) {
// XXX: debug
this->micro_bit.display.print("A");
}
void Game::press_button_b(MicroBitEvent e) {
// XXX: debug
this->micro_bit.display.print("B");
} }
MicroBit micro_bit;
int main() { int main() {
// Initialise the micro:bit runtime. // Initialise the micro:bit runtime.
micro_bit.init(); micro_bit.init();
// startup message displays the name of the game micro_bit.messageBus.listen(
micro_bit.display.scroll("BLOCKS!"); MICROBIT_ID_BUTTON_A, MICROBIT_BUTTON_EVT_CLICK, event_handler
);
// infinitely start new games
while (true) { while (true) {
Game game(micro_bit); micro_bit.sleep(10); // 10ms sleep, or 100Hz tick rate
game.run();
} }
// TODO: potentially remove this call, if clarified that it is not required. // TODO: potentially remove this call, if clarified that it is not required.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment