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@13:7ab71c7c311b, 2015-05-09 (annotated)
- Committer:
- Siriagus
- Date:
- Sat May 09 13:56:14 2015 +0000
- Revision:
- 13:7ab71c7c311b
- Parent:
- 12:8178fad5e660
- Child:
- 17:d6a3b29cab31
Expanded functionallity of drawImage - inverse, flipX, flipY. Collision test for all entities. Added simple enemy.
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 | 13:7ab71c7c311b | 50 | * Only the solid pixels are drawn. If two images overlap, the second image drawn will |
Siriagus | 13:7ab71c7c311b | 51 | * not clear pixels which are solid in the first image. |
Siriagus | 12:8178fad5e660 | 52 | * @param img const int array where a solid pixel equals 1, and a blank pixel equals zero |
Siriagus | 12:8178fad5e660 | 53 | * @param x Horizontal position of image (leftmost pixel) |
Siriagus | 12:8178fad5e660 | 54 | * @param y Vertical position of image (uppermost pixel) |
Siriagus | 13:7ab71c7c311b | 55 | * @param Inverses images. Default value is false |
Siriagus | 12:8178fad5e660 | 56 | * See seperate program for how this array can be generated from an image file using SFML! |
Siriagus | 12:8178fad5e660 | 57 | */ |
Siriagus | 12:8178fad5e660 | 58 | template<size_t rows, size_t cols> |
Siriagus | 13:7ab71c7c311b | 59 | void drawImage(const int (&img)[rows][cols], int x = 0, int y = 0, bool inverse = false, bool flipX = false, bool flipY = false); |
Siriagus | 4:d6661b976359 | 60 | |
Siriagus | 4:d6661b976359 | 61 | protected: |
Siriagus | 4:d6661b976359 | 62 | N5110 *lcd; |
Siriagus | 4:d6661b976359 | 63 | InputManager *input; |
Siriagus | 4:d6661b976359 | 64 | |
Siriagus | 4:d6661b976359 | 65 | private: |
Siriagus | 4:d6661b976359 | 66 | StateManager *fsm; |
Siriagus | 4:d6661b976359 | 67 | |
Siriagus | 1:0cfe2255092a | 68 | }; |
Siriagus | 1:0cfe2255092a | 69 | |
Siriagus | 12:8178fad5e660 | 70 | // Template functions needs to be declared in the header file |
Siriagus | 12:8178fad5e660 | 71 | // TODO: Add functions for inverse drawing |
Siriagus | 12:8178fad5e660 | 72 | template<size_t rows, size_t cols> |
Siriagus | 13:7ab71c7c311b | 73 | void State::drawImage(const int (&img)[rows][cols], int x, int y, bool inverse, bool flipX, bool flipY) |
Siriagus | 12:8178fad5e660 | 74 | { |
Siriagus | 13:7ab71c7c311b | 75 | int targetX, targetY; // The position on the lcd we are writing to |
Siriagus | 13:7ab71c7c311b | 76 | |
Siriagus | 12:8178fad5e660 | 77 | for (int i = 0; i < rows; ++i) |
Siriagus | 12:8178fad5e660 | 78 | { |
Siriagus | 13:7ab71c7c311b | 79 | targetY = (flipY) ? (y + (rows-1) - i) : (y + i); |
Siriagus | 13:7ab71c7c311b | 80 | |
Siriagus | 12:8178fad5e660 | 81 | // Skip if outside dimensions of LCD |
Siriagus | 13:7ab71c7c311b | 82 | if (targetY < 0) continue; |
Siriagus | 13:7ab71c7c311b | 83 | else if (targetY >= HEIGHT) continue; |
Siriagus | 12:8178fad5e660 | 84 | |
Siriagus | 12:8178fad5e660 | 85 | for (int j = 0; j < cols; ++j) |
Siriagus | 12:8178fad5e660 | 86 | { |
Siriagus | 13:7ab71c7c311b | 87 | targetX = (flipX) ? (x + ((cols - 1) - j)) : (x + j); |
Siriagus | 13:7ab71c7c311b | 88 | |
Siriagus | 12:8178fad5e660 | 89 | // Dimensions check. Draws left to right. |
Siriagus | 13:7ab71c7c311b | 90 | if (targetX < 0) continue; |
Siriagus | 13:7ab71c7c311b | 91 | else if (targetX >= WIDTH) continue; |
Siriagus | 12:8178fad5e660 | 92 | |
Siriagus | 13:7ab71c7c311b | 93 | int solid = img[i][j]; |
Siriagus | 13:7ab71c7c311b | 94 | |
Siriagus | 13:7ab71c7c311b | 95 | if ((solid && !inverse) || (!solid && inverse)) |
Siriagus | 13:7ab71c7c311b | 96 | lcd->setPixel(targetX, targetY); |
Siriagus | 12:8178fad5e660 | 97 | |
Siriagus | 12:8178fad5e660 | 98 | } |
Siriagus | 12:8178fad5e660 | 99 | } |
Siriagus | 12:8178fad5e660 | 100 | } |
Siriagus | 1:0cfe2255092a | 101 | #endif |