Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed N5110 ShiftReg PinDetect
State.h@12:8178fad5e660, 2015-05-08 (annotated)
- Committer:
- Siriagus
- Date:
- Fri May 08 23:51:26 2015 +0000
- Revision:
- 12:8178fad5e660
- Parent:
- 10:f2488a0ecab7
- Child:
- 13:7ab71c7c311b
Added template drawImage function which can draw images of any dimension.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Siriagus | 1:0cfe2255092a | 1 | #ifndef STATE_H |
Siriagus | 1:0cfe2255092a | 2 | #define STATE_H |
Siriagus | 1:0cfe2255092a | 3 | |
Siriagus | 4:d6661b976359 | 4 | #include "N5110.h" |
Siriagus | 4:d6661b976359 | 5 | #include "PinDetect.h" |
Siriagus | 4:d6661b976359 | 6 | #include "InputManager.h" |
Siriagus | 4:d6661b976359 | 7 | |
Siriagus | 10:f2488a0ecab7 | 8 | /** @file State.h |
Siriagus | 10:f2488a0ecab7 | 9 | * @author Andreas Garmannslund |
Siriagus | 10:f2488a0ecab7 | 10 | * @date April 2015 |
Siriagus | 10:f2488a0ecab7 | 11 | */ |
Siriagus | 10:f2488a0ecab7 | 12 | |
Siriagus | 4:d6661b976359 | 13 | class StateManager; |
Siriagus | 4:d6661b976359 | 14 | |
Siriagus | 10:f2488a0ecab7 | 15 | /// States used in the finite state machine. |
Siriagus | 8:9ac6a428fa26 | 16 | enum MainState {MAIN_MENU, GAME, SUBMIT_HIGHSCORE, GAME_OVER, NO_STATE, TITLE_SCREEN}; |
Siriagus | 4:d6661b976359 | 17 | |
Siriagus | 10:f2488a0ecab7 | 18 | /// Abstract class for states in the program's main finite state machine. All state implementations is derived from this abstract class. |
Siriagus | 1:0cfe2255092a | 19 | class State |
Siriagus | 5:100d960fc6d5 | 20 | { |
Siriagus | 1:0cfe2255092a | 21 | public: |
Siriagus | 10:f2488a0ecab7 | 22 | |
Siriagus | 10:f2488a0ecab7 | 23 | /* Creates a new state object. Should be called from child's constructor. |
Siriagus | 10:f2488a0ecab7 | 24 | * @param fsm Pointer to finished state machine. |
Siriagus | 10:f2488a0ecab7 | 25 | * @param lcd Pointer to the N5110 lcd object. |
Siriagus | 10:f2488a0ecab7 | 26 | * @param input Pointer to the InputManager object, used for controlling user input. |
Siriagus | 10:f2488a0ecab7 | 27 | */ |
Siriagus | 4:d6661b976359 | 28 | State(StateManager* fsm, N5110 *lcd, InputManager* input) |
Siriagus | 7:678873947b29 | 29 | :lcd(lcd), input(input), fsm(fsm){} |
Siriagus | 4:d6661b976359 | 30 | |
Siriagus | 10:f2488a0ecab7 | 31 | /// Handle user input and update logic. |
Siriagus | 7:678873947b29 | 32 | virtual void update(float dt) = 0; |
Siriagus | 10:f2488a0ecab7 | 33 | |
Siriagus | 10:f2488a0ecab7 | 34 | /// Draw to screen. |
Siriagus | 4:d6661b976359 | 35 | virtual void render() = 0; |
Siriagus | 4:d6661b976359 | 36 | |
Siriagus | 7:678873947b29 | 37 | protected: |
Siriagus | 10:f2488a0ecab7 | 38 | /* Requests the finite state machine to switch to a new state when possible. |
Siriagus | 10:f2488a0ecab7 | 39 | * @param newState The state the fsm should switch to. |
Siriagus | 10:f2488a0ecab7 | 40 | **/ |
Siriagus | 7:678873947b29 | 41 | void requestStateChange(MainState newState); |
Siriagus | 10:f2488a0ecab7 | 42 | |
Siriagus | 10:f2488a0ecab7 | 43 | /** Draws an image to the lcd |
Siriagus | 10:f2488a0ecab7 | 44 | * @param img Array with the same size as the display, where 1 is opaque, 0 is blank. |
Siriagus | 10:f2488a0ecab7 | 45 | */ |
Siriagus | 12:8178fad5e660 | 46 | //void drawImage(const int img[BANKS][WIDTH]); // Draws an image from array |
Siriagus | 12:8178fad5e660 | 47 | |
Siriagus | 12:8178fad5e660 | 48 | |
Siriagus | 12:8178fad5e660 | 49 | /** Draws an image/sprite to the lcd |
Siriagus | 12:8178fad5e660 | 50 | * @param img const int array where a solid pixel equals 1, and a blank pixel equals zero |
Siriagus | 12:8178fad5e660 | 51 | * @param x Horizontal position of image (leftmost pixel) |
Siriagus | 12:8178fad5e660 | 52 | * @param y Vertical position of image (uppermost pixel) |
Siriagus | 12:8178fad5e660 | 53 | * See seperate program for how this array can be generated from an image file using SFML! |
Siriagus | 12:8178fad5e660 | 54 | */ |
Siriagus | 12:8178fad5e660 | 55 | template<size_t rows, size_t cols> |
Siriagus | 12:8178fad5e660 | 56 | void drawImage(const int (&img)[rows][cols], int x, int y); |
Siriagus | 12:8178fad5e660 | 57 | |
Siriagus | 12:8178fad5e660 | 58 | /** Draws an image/sprite to the lcd with origin in upper-left corner of the lcd |
Siriagus | 12:8178fad5e660 | 59 | * @param img Array where 1 corresponds to opaque and 0 corresponds to blank |
Siriagus | 12:8178fad5e660 | 60 | */ |
Siriagus | 12:8178fad5e660 | 61 | template <size_t rows, size_t cols> |
Siriagus | 12:8178fad5e660 | 62 | void drawImage(const int (&img)[rows][cols]) { drawImage(img, 0, 0); } |
Siriagus | 4:d6661b976359 | 63 | |
Siriagus | 4:d6661b976359 | 64 | protected: |
Siriagus | 4:d6661b976359 | 65 | N5110 *lcd; |
Siriagus | 4:d6661b976359 | 66 | InputManager *input; |
Siriagus | 4:d6661b976359 | 67 | |
Siriagus | 4:d6661b976359 | 68 | private: |
Siriagus | 4:d6661b976359 | 69 | StateManager *fsm; |
Siriagus | 4:d6661b976359 | 70 | |
Siriagus | 1:0cfe2255092a | 71 | }; |
Siriagus | 1:0cfe2255092a | 72 | |
Siriagus | 12:8178fad5e660 | 73 | // Template functions needs to be declared in the header file |
Siriagus | 12:8178fad5e660 | 74 | // TODO: Add functions for inverse drawing |
Siriagus | 12:8178fad5e660 | 75 | template<size_t rows, size_t cols> |
Siriagus | 12:8178fad5e660 | 76 | void State::drawImage(const int (&img)[rows][cols], int x, int y) |
Siriagus | 12:8178fad5e660 | 77 | { |
Siriagus | 12:8178fad5e660 | 78 | for (int i = 0; i < rows; ++i) |
Siriagus | 12:8178fad5e660 | 79 | { |
Siriagus | 12:8178fad5e660 | 80 | // Skip if outside dimensions of LCD |
Siriagus | 12:8178fad5e660 | 81 | if (y + i < 0) continue; |
Siriagus | 12:8178fad5e660 | 82 | else if (y + i >= HEIGHT) break; // Drawing top to bottom, so all succeding points will also be outside |
Siriagus | 12:8178fad5e660 | 83 | |
Siriagus | 12:8178fad5e660 | 84 | for (int j = 0; j < cols; ++j) |
Siriagus | 12:8178fad5e660 | 85 | { |
Siriagus | 12:8178fad5e660 | 86 | // Dimensions check. Draws left to right. |
Siriagus | 12:8178fad5e660 | 87 | if (x + j < 0) continue; |
Siriagus | 12:8178fad5e660 | 88 | else if (x + j >= WIDTH) break; |
Siriagus | 12:8178fad5e660 | 89 | |
Siriagus | 12:8178fad5e660 | 90 | if (img[i][j]) |
Siriagus | 12:8178fad5e660 | 91 | lcd->setPixel(x+j,y+i); |
Siriagus | 12:8178fad5e660 | 92 | |
Siriagus | 12:8178fad5e660 | 93 | } |
Siriagus | 12:8178fad5e660 | 94 | } |
Siriagus | 12:8178fad5e660 | 95 | } |
Siriagus | 1:0cfe2255092a | 96 | #endif |