A complex 2D-dungeon game on LPC1768 in SWJTU-Leeds Joint School XJEL2645 project. Referenced from the framework contributed by https://os.mbed.com/users/Siriagus/code/SimplePlatformGame/
Dependencies: mbed N5110 ShiftReg PinDetect
main.cpp@21:e19709a07756, 2021-03-25 (annotated)
- Committer:
- hugohu
- Date:
- Thu Mar 25 03:56:22 2021 +0000
- Branch:
- BRAVEHEART
- Revision:
- 21:e19709a07756
- Parent:
- 19:89c3eeb3761b
Combined some files, removed codes for my personal needs, created new maps, new ways to play.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hugohu | 19:89c3eeb3761b | 1 | /* |
Siriagus | 10:f2488a0ecab7 | 2 | * @file main.cpp |
hugohu | 19:89c3eeb3761b | 3 | * @brief BRAVEHEART -- 2D dungeon game in XJEL2645 Project |
hugohu | 19:89c3eeb3761b | 4 | * @author Yadong Hu |
hugohu | 19:89c3eeb3761b | 5 | * @date March, 2021 |
Siriagus | 10:f2488a0ecab7 | 6 | */ |
Siriagus | 0:1f92de30d43e | 7 | |
hugohu | 19:89c3eeb3761b | 8 | /// libs |
Siriagus | 0:1f92de30d43e | 9 | #include "mbed.h" |
Siriagus | 0:1f92de30d43e | 10 | #include "N5110.h" |
Siriagus | 1:0cfe2255092a | 11 | #include "PinDetect.h" |
hugohu | 19:89c3eeb3761b | 12 | #include "ShiftReg.h" |
Siriagus | 4:d6661b976359 | 13 | #include <string> |
Siriagus | 7:678873947b29 | 14 | #include <sstream> |
Siriagus | 4:d6661b976359 | 15 | #include <ctime> |
Siriagus | 1:0cfe2255092a | 16 | |
hugohu | 19:89c3eeb3761b | 17 | /// customize libs |
Siriagus | 5:100d960fc6d5 | 18 | #include "StateManager.h" |
Siriagus | 1:0cfe2255092a | 19 | #include "State.h" |
Siriagus | 4:d6661b976359 | 20 | #include "InputManager.h" |
hugohu | 19:89c3eeb3761b | 21 | #include "Music.h" |
Siriagus | 1:0cfe2255092a | 22 | |
hugohu | 19:89c3eeb3761b | 23 | /// pin specification |
hugohu | 19:89c3eeb3761b | 24 | #define JOY_H p19 |
hugohu | 19:89c3eeb3761b | 25 | #define JOY_V p20 |
hugohu | 19:89c3eeb3761b | 26 | #define JOY_BTN p17 |
hugohu | 19:89c3eeb3761b | 27 | #define LIGHT_SENSOR p15 |
hugohu | 19:89c3eeb3761b | 28 | #define BUTTON_A p29 |
hugohu | 19:89c3eeb3761b | 29 | #define BUTTON_B p28 |
hugohu | 19:89c3eeb3761b | 30 | #define BUTTON_C p27 |
hugohu | 19:89c3eeb3761b | 31 | #define BUTTON_D p26 |
Siriagus | 1:0cfe2255092a | 32 | |
hugohu | 19:89c3eeb3761b | 33 | /// global variables |
hugohu | 19:89c3eeb3761b | 34 | int seven_seg_array [] = { |
hugohu | 19:89c3eeb3761b | 35 | 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71 |
hugohu | 19:89c3eeb3761b | 36 | }; |
Siriagus | 1:0cfe2255092a | 37 | |
hugohu | 19:89c3eeb3761b | 38 | /// I/O specification |
hugohu | 19:89c3eeb3761b | 39 | // screen |
Siriagus | 18:709ea375b0df | 40 | N5110 *lcd; |
Siriagus | 4:d6661b976359 | 41 | |
hugohu | 19:89c3eeb3761b | 42 | // create ShiftReg object |
hugohu | 19:89c3eeb3761b | 43 | ShiftReg *shiftreg; |
hugohu | 19:89c3eeb3761b | 44 | ShiftReg shift; |
hugohu | 19:89c3eeb3761b | 45 | |
hugohu | 19:89c3eeb3761b | 46 | // background music |
Siriagus | 18:709ea375b0df | 47 | Sound *sound; |
Siriagus | 4:d6661b976359 | 48 | |
hugohu | 19:89c3eeb3761b | 49 | // inputs assemble |
Siriagus | 18:709ea375b0df | 50 | InputManager *input; |
Siriagus | 0:1f92de30d43e | 51 | |
hugohu | 19:89c3eeb3761b | 52 | // light brightness detector |
hugohu | 19:89c3eeb3761b | 53 | AnalogIn light_sensor(LIGHT_SENSOR); |
Siriagus | 14:b4fed570abaf | 54 | |
hugohu | 19:89c3eeb3761b | 55 | // to generate rand seeds from noise |
hugohu | 19:89c3eeb3761b | 56 | AnalogIn randomPin(p16); |
hugohu | 19:89c3eeb3761b | 57 | AnalogIn randomPin2(p17); |
Siriagus | 18:709ea375b0df | 58 | |
Siriagus | 18:709ea375b0df | 59 | /// Finite state machine |
Siriagus | 18:709ea375b0df | 60 | StateManager* fsm; |
Siriagus | 18:709ea375b0df | 61 | |
hugohu | 19:89c3eeb3761b | 62 | /// Access file system |
Siriagus | 18:709ea375b0df | 63 | LocalFileSystem local("local"); |
Siriagus | 17:d6a3b29cab31 | 64 | |
hugohu | 19:89c3eeb3761b | 65 | /// Initialize |
hugohu | 19:89c3eeb3761b | 66 | void init(); |
hugohu | 19:89c3eeb3761b | 67 | |
hugohu | 19:89c3eeb3761b | 68 | /// Generate seeds |
Siriagus | 17:d6a3b29cab31 | 69 | unsigned int getRandSeed(); |
Siriagus | 18:709ea375b0df | 70 | |
hugohu | 19:89c3eeb3761b | 71 | /// Access the records file |
Siriagus | 17:d6a3b29cab31 | 72 | void readHighscoreFile(); |
Siriagus | 14:b4fed570abaf | 73 | |
Siriagus | 1:0cfe2255092a | 74 | int main() |
Siriagus | 14:b4fed570abaf | 75 | { |
Siriagus | 14:b4fed570abaf | 76 | srand(getRandSeed()); |
Siriagus | 1:0cfe2255092a | 77 | init(); |
Siriagus | 7:678873947b29 | 78 | Timer timer; |
Siriagus | 7:678873947b29 | 79 | timer.start(); |
Siriagus | 0:1f92de30d43e | 80 | while(true) |
Siriagus | 7:678873947b29 | 81 | { |
Siriagus | 8:9ac6a428fa26 | 82 | while (timer.read() < 0.08) |
hugohu | 19:89c3eeb3761b | 83 | sleep(); |
hugohu | 19:89c3eeb3761b | 84 | |
Siriagus | 7:678873947b29 | 85 | // update |
hugohu | 19:89c3eeb3761b | 86 | lcd->setBrightness(1.0 - light_sensor); // Update brightness of screen |
Siriagus | 7:678873947b29 | 87 | fsm->update(timer.read()); |
Siriagus | 7:678873947b29 | 88 | input->joystick->update(); |
Siriagus | 4:d6661b976359 | 89 | |
Siriagus | 4:d6661b976359 | 90 | // render |
Siriagus | 5:100d960fc6d5 | 91 | lcd->clear(); |
Siriagus | 7:678873947b29 | 92 | fsm->render(); |
Siriagus | 5:100d960fc6d5 | 93 | lcd->refresh(); |
Siriagus | 1:0cfe2255092a | 94 | |
Siriagus | 7:678873947b29 | 95 | fsm->processRequest(); // Change the state if requested. |
Siriagus | 7:678873947b29 | 96 | |
Siriagus | 7:678873947b29 | 97 | timer.reset(); |
Siriagus | 0:1f92de30d43e | 98 | } |
Siriagus | 0:1f92de30d43e | 99 | |
Siriagus | 3:4e3f342a135c | 100 | } |
Siriagus | 3:4e3f342a135c | 101 | |
Siriagus | 3:4e3f342a135c | 102 | void init() |
Siriagus | 3:4e3f342a135c | 103 | { |
Siriagus | 3:4e3f342a135c | 104 | // Init LCD |
hugohu | 19:89c3eeb3761b | 105 | lcd = new N5110(p14, p8, p9, p10, p11, p13, p21); |
Siriagus | 3:4e3f342a135c | 106 | lcd->init(); |
Siriagus | 3:4e3f342a135c | 107 | lcd->normalMode(); |
hugohu | 19:89c3eeb3761b | 108 | lcd->setBrightness(1.0 - light_sensor); // Update brightness of screen |
hugohu | 19:89c3eeb3761b | 109 | |
hugohu | 19:89c3eeb3761b | 110 | // write 0 to 7-seg to turn it off |
hugohu | 19:89c3eeb3761b | 111 | shift.write(0x00); |
Siriagus | 3:4e3f342a135c | 112 | |
Siriagus | 4:d6661b976359 | 113 | // Input |
hugohu | 19:89c3eeb3761b | 114 | input = new InputManager(BUTTON_A, BUTTON_B, BUTTON_C, BUTTON_D, JOY_H, JOY_V, JOY_BTN); |
Siriagus | 17:d6a3b29cab31 | 115 | |
Siriagus | 17:d6a3b29cab31 | 116 | // Finite state machine |
hugohu | 19:89c3eeb3761b | 117 | fsm = new StateManager(lcd, input, sound, shiftreg, TITLE_SCREEN); |
Siriagus | 17:d6a3b29cab31 | 118 | |
Siriagus | 17:d6a3b29cab31 | 119 | readHighscoreFile(); // load highscores from file system |
hugohu | 19:89c3eeb3761b | 120 | sound = new Sound(p18); |
Siriagus | 17:d6a3b29cab31 | 121 | sound->playNote(SFX::RESTART); |
Siriagus | 17:d6a3b29cab31 | 122 | } |
Siriagus | 17:d6a3b29cab31 | 123 | |
Siriagus | 17:d6a3b29cab31 | 124 | void readHighscoreFile() |
Siriagus | 17:d6a3b29cab31 | 125 | { |
Siriagus | 17:d6a3b29cab31 | 126 | FILE *fp = fopen("/local/highscores.txt", "r"); // read from local file |
Siriagus | 17:d6a3b29cab31 | 127 | |
Siriagus | 17:d6a3b29cab31 | 128 | if (!fp) // if file is not created yet the highscores will default values as defined in Global.cpp |
Siriagus | 17:d6a3b29cab31 | 129 | return; |
Siriagus | 17:d6a3b29cab31 | 130 | |
Siriagus | 17:d6a3b29cab31 | 131 | char initials[4]; |
Siriagus | 17:d6a3b29cab31 | 132 | char scoreStr[8]; |
Siriagus | 17:d6a3b29cab31 | 133 | |
Siriagus | 17:d6a3b29cab31 | 134 | for (int i = 0; i < 3; ++i) |
Siriagus | 17:d6a3b29cab31 | 135 | { |
Siriagus | 17:d6a3b29cab31 | 136 | fscanf(fp, "%s %s", initials, scoreStr); // read from file |
Siriagus | 17:d6a3b29cab31 | 137 | |
Siriagus | 17:d6a3b29cab31 | 138 | int score = atoi(scoreStr); // convert to int |
Siriagus | 17:d6a3b29cab31 | 139 | |
Siriagus | 17:d6a3b29cab31 | 140 | // update global highscore table |
Siriagus | 17:d6a3b29cab31 | 141 | Global::highscores[i].initials = initials; |
Siriagus | 17:d6a3b29cab31 | 142 | Global::highscores[i].score = score; |
Siriagus | 17:d6a3b29cab31 | 143 | } |
Siriagus | 17:d6a3b29cab31 | 144 | |
Siriagus | 17:d6a3b29cab31 | 145 | fclose(fp); |
Siriagus | 3:4e3f342a135c | 146 | } |
Siriagus | 3:4e3f342a135c | 147 | |
Siriagus | 17:d6a3b29cab31 | 148 | |
Siriagus | 18:709ea375b0df | 149 | /** Get a random seed based on unconnected analog input pins |
Siriagus | 18:709ea375b0df | 150 | * @see https://developer.mbed.org/questions/2886/Why-is-the-rand-function-not-the-least-b/ |
Siriagus | 18:709ea375b0df | 151 | */ |
Siriagus | 17:d6a3b29cab31 | 152 | unsigned int getRandSeed() |
Siriagus | 17:d6a3b29cab31 | 153 | { |
Siriagus | 17:d6a3b29cab31 | 154 | unsigned int randNum = 0; |
Siriagus | 17:d6a3b29cab31 | 155 | unsigned int lsb; // least significant bit |
Siriagus | 17:d6a3b29cab31 | 156 | |
Siriagus | 17:d6a3b29cab31 | 157 | for (unsigned int i = 0; i < 16; ++i) |
Siriagus | 17:d6a3b29cab31 | 158 | { |
Siriagus | 17:d6a3b29cab31 | 159 | lsb = 1 & (randomPin.read_u16()); // Read least significant bit in randomInput - value depends on noise |
Siriagus | 17:d6a3b29cab31 | 160 | randNum |= (lsb << i); // Set bit nr.i to lsb in randomInput |
Siriagus | 17:d6a3b29cab31 | 161 | |
Siriagus | 17:d6a3b29cab31 | 162 | lsb = 1 & (randomPin2.read_u16()); |
Siriagus | 17:d6a3b29cab31 | 163 | randNum |= (lsb << (16+i)); |
Siriagus | 17:d6a3b29cab31 | 164 | } |
Siriagus | 17:d6a3b29cab31 | 165 | |
Siriagus | 17:d6a3b29cab31 | 166 | return randNum; |
Siriagus | 1:0cfe2255092a | 167 | } |