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

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?

UserRevisionLine numberNew 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 }