Simple fish eat program
Dependencies: mbed mbed-rtos N5110 ShiftReg Tone
classes/FishEngine.cpp@11:7c1e2a9303d3, 2021-04-21 (annotated)
- Committer:
- el18a2k
- Date:
- Wed Apr 21 11:08:02 2021 +0000
- Revision:
- 11:7c1e2a9303d3
- Parent:
- 10:e221bd1ce3ec
- Child:
- 12:20ac766b3175
highscore file writing complete
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el18a2k | 1:7dfa61225fcf | 1 | #include "FishEngine.h" |
el18a2k | 1:7dfa61225fcf | 2 | |
el18a2k | 2:532b0225519f | 3 | #define UP 0 |
el18a2k | 2:532b0225519f | 4 | #define DOWN 1 |
el18a2k | 2:532b0225519f | 5 | #define CENTRE 2 |
el18a2k | 2:532b0225519f | 6 | |
el18a2k | 2:532b0225519f | 7 | //objects |
el18a2k | 10:e221bd1ce3ec | 8 | Game game; |
el18a2k | 6:7aafcaf7cbe2 | 9 | Settings settings; |
el18a2k | 1:7dfa61225fcf | 10 | Graphics graphics; |
el18a2k | 11:7c1e2a9303d3 | 11 | HighScore highscore; |
el18a2k | 1:7dfa61225fcf | 12 | |
el18a2k | 6:7aafcaf7cbe2 | 13 | int ButtonA; |
el18a2k | 6:7aafcaf7cbe2 | 14 | int ButtonB; |
el18a2k | 1:7dfa61225fcf | 15 | |
el18a2k | 2:532b0225519f | 16 | // creates intro sequence |
el18a2k | 1:7dfa61225fcf | 17 | void FishEngine::titleSequence(N5110 &lcd){ |
el18a2k | 1:7dfa61225fcf | 18 | lcd.clear(); |
el18a2k | 2:532b0225519f | 19 | graphics.titleScreen(lcd); //prints titlescreen (held in graphics.h) |
el18a2k | 1:7dfa61225fcf | 20 | lcd.refresh(); |
el18a2k | 2:532b0225519f | 21 | wait_ms(2000); |
el18a2k | 1:7dfa61225fcf | 22 | |
el18a2k | 6:7aafcaf7cbe2 | 23 | while(settings.buttonA_state(ButtonA) == 0){ |
el18a2k | 1:7dfa61225fcf | 24 | lcd.clear(); |
el18a2k | 2:532b0225519f | 25 | graphics.confirmationScreen(lcd); //calls confirmation function (held in graphics.h) |
el18a2k | 1:7dfa61225fcf | 26 | lcd.refresh(); |
el18a2k | 1:7dfa61225fcf | 27 | wait_ms(1000/10); |
el18a2k | 1:7dfa61225fcf | 28 | } |
el18a2k | 1:7dfa61225fcf | 29 | |
el18a2k | 2:532b0225519f | 30 | graphics.screenFlash(lcd); //calls screen flash function (held in graphics.h) |
el18a2k | 1:7dfa61225fcf | 31 | lcd.refresh(); |
el18a2k | 1:7dfa61225fcf | 32 | } |
el18a2k | 1:7dfa61225fcf | 33 | |
el18a2k | 10:e221bd1ce3ec | 34 | void FishEngine::gamePlay(N5110 &lcd, Tone &dac, Joystick &joystick){ |
el18a2k | 10:e221bd1ce3ec | 35 | game.init(lcd, 20, 20, 1); |
el18a2k | 10:e221bd1ce3ec | 36 | |
el18a2k | 10:e221bd1ce3ec | 37 | do{ |
el18a2k | 10:e221bd1ce3ec | 38 | DIRECTION direction = {joystick.get_direction()}; |
el18a2k | 10:e221bd1ce3ec | 39 | game.gamePlay(lcd, direction); |
el18a2k | 11:7c1e2a9303d3 | 40 | playerScore = game.Score(lcd); |
el18a2k | 10:e221bd1ce3ec | 41 | |
el18a2k | 10:e221bd1ce3ec | 42 | }while(game.Lives() != 0); |
el18a2k | 11:7c1e2a9303d3 | 43 | |
el18a2k | 11:7c1e2a9303d3 | 44 | fileValue = highscore.read_File(); |
el18a2k | 11:7c1e2a9303d3 | 45 | |
el18a2k | 11:7c1e2a9303d3 | 46 | if(playerScore > fileValue){ |
el18a2k | 11:7c1e2a9303d3 | 47 | highscore.write_File(playerScore); |
el18a2k | 11:7c1e2a9303d3 | 48 | lcd.clear(); |
el18a2k | 11:7c1e2a9303d3 | 49 | lcd.printString("New Score", 5, 1); |
el18a2k | 11:7c1e2a9303d3 | 50 | lcd.refresh(); |
el18a2k | 11:7c1e2a9303d3 | 51 | wait_ms(1000); |
el18a2k | 11:7c1e2a9303d3 | 52 | } |
el18a2k | 11:7c1e2a9303d3 | 53 | } |
el18a2k | 11:7c1e2a9303d3 | 54 | |
el18a2k | 11:7c1e2a9303d3 | 55 | void FishEngine::highScore(N5110 &lcd){ |
el18a2k | 11:7c1e2a9303d3 | 56 | do{ |
el18a2k | 11:7c1e2a9303d3 | 57 | highscore.display_File(lcd); |
el18a2k | 11:7c1e2a9303d3 | 58 | }while(settings.buttonB_state(ButtonB) == false); |
el18a2k | 10:e221bd1ce3ec | 59 | } |
el18a2k | 10:e221bd1ce3ec | 60 | |
el18a2k | 8:fe51fbf81dee | 61 | void FishEngine::Instructions(N5110 &lcd){ |
el18a2k | 8:fe51fbf81dee | 62 | do{ |
el18a2k | 8:fe51fbf81dee | 63 | lcd.clear(); |
el18a2k | 8:fe51fbf81dee | 64 | lcd.printString(" -- Welcome --",0,0); |
el18a2k | 8:fe51fbf81dee | 65 | lcd.printString("Use the",0,2); |
el18a2k | 8:fe51fbf81dee | 66 | lcd.printString("joystick to ",0,3); |
el18a2k | 8:fe51fbf81dee | 67 | lcd.printString("move the fish",0,4); |
el18a2k | 8:fe51fbf81dee | 68 | lcd.refresh(); |
el18a2k | 8:fe51fbf81dee | 69 | |
el18a2k | 8:fe51fbf81dee | 70 | wait_ms(2000); |
el18a2k | 8:fe51fbf81dee | 71 | |
el18a2k | 8:fe51fbf81dee | 72 | lcd.clear(); |
el18a2k | 8:fe51fbf81dee | 73 | lcd.printString("remeber to",0,1); |
el18a2k | 8:fe51fbf81dee | 74 | lcd.printString("only eat fish",0,2); |
el18a2k | 8:fe51fbf81dee | 75 | lcd.printString("smaller than",0,3); |
el18a2k | 8:fe51fbf81dee | 76 | lcd.printString("you!!",0,4); |
el18a2k | 8:fe51fbf81dee | 77 | lcd.refresh(); |
el18a2k | 8:fe51fbf81dee | 78 | |
el18a2k | 8:fe51fbf81dee | 79 | wait_ms(2000); |
el18a2k | 8:fe51fbf81dee | 80 | |
el18a2k | 8:fe51fbf81dee | 81 | lcd.clear(); |
el18a2k | 8:fe51fbf81dee | 82 | lcd.printString("Hold B to Exit",0,2); |
el18a2k | 8:fe51fbf81dee | 83 | lcd.refresh(); |
el18a2k | 8:fe51fbf81dee | 84 | |
el18a2k | 8:fe51fbf81dee | 85 | wait_ms(2000); |
el18a2k | 8:fe51fbf81dee | 86 | |
el18a2k | 8:fe51fbf81dee | 87 | }while(settings.buttonB_state(ButtonB) == false); |
el18a2k | 8:fe51fbf81dee | 88 | } |
el18a2k | 8:fe51fbf81dee | 89 | |
el18a2k | 2:532b0225519f | 90 | // creates the games main menu screen with scrolling ability through the use of a |
el18a2k | 2:532b0225519f | 91 | // state machine. |
el18a2k | 2:532b0225519f | 92 | void FishEngine::mainMenu(N5110 &lcd, Tone &dac, Joystick &joystick){ |
el18a2k | 2:532b0225519f | 93 | const int Fish_1[4][9]= { |
el18a2k | 2:532b0225519f | 94 | { 1,0,0,1,1,1,1,1,0, }, |
el18a2k | 2:532b0225519f | 95 | { 1,1,1,1,1,1,1,0,1, }, |
el18a2k | 2:532b0225519f | 96 | { 1,1,1,1,1,1,1,1,1, }, |
el18a2k | 2:532b0225519f | 97 | { 1,0,0,1,1,1,1,1,0, }, |
el18a2k | 2:532b0225519f | 98 | }; |
el18a2k | 2:532b0225519f | 99 | |
el18a2k | 2:532b0225519f | 100 | // outputs for the state machine are used to draw Fish_1 beside the corrosponding |
el18a2k | 2:532b0225519f | 101 | // menu choice |
el18a2k | 2:532b0225519f | 102 | int g_menu_output[4] = {10, 18, 26, 34}; |
el18a2k | 2:532b0225519f | 103 | int state = 0; //set inital state to 0 |
el18a2k | 2:532b0225519f | 104 | int direction = CENTRE; //set inital direction to remain on that state until an input is received |
el18a2k | 2:532b0225519f | 105 | int y_pos; |
el18a2k | 2:532b0225519f | 106 | |
el18a2k | 2:532b0225519f | 107 | while(1){ |
el18a2k | 2:532b0225519f | 108 | lcd.clear(); |
el18a2k | 2:532b0225519f | 109 | lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border |
el18a2k | 2:532b0225519f | 110 | |
el18a2k | 2:532b0225519f | 111 | //prints players options |
el18a2k | 2:532b0225519f | 112 | lcd.printString("New Game", 15, 1); |
el18a2k | 2:532b0225519f | 113 | lcd.printString("High Score", 15, 2); |
el18a2k | 2:532b0225519f | 114 | lcd.printString("How to Play", 15, 3); |
el18a2k | 2:532b0225519f | 115 | lcd.printString("Settings", 15, 4); |
el18a2k | 2:532b0225519f | 116 | |
el18a2k | 2:532b0225519f | 117 | |
el18a2k | 2:532b0225519f | 118 | /*implementation of state machine allows the determination of the position of the fish marker |
el18a2k | 2:532b0225519f | 119 | based on the users joystick input: |
el18a2k | 2:532b0225519f | 120 | |
el18a2k | 2:532b0225519f | 121 | inputs |
el18a2k | 2:532b0225519f | 122 | state 0 1 2 where 0 is UP and 1 is DOWN 2 is CENTRE |
el18a2k | 2:532b0225519f | 123 | |
el18a2k | 2:532b0225519f | 124 | 0 3 1 0 |
el18a2k | 2:532b0225519f | 125 | 1 0 2 1 |
el18a2k | 2:532b0225519f | 126 | 2 1 3 2 |
el18a2k | 2:532b0225519f | 127 | 3 2 0 3 */ |
el18a2k | 2:532b0225519f | 128 | |
el18a2k | 2:532b0225519f | 129 | |
el18a2k | 2:532b0225519f | 130 | if(joystick.get_direction() == N){ //if the joystick is moved upward, then direction is UP |
el18a2k | 2:532b0225519f | 131 | direction = UP; |
el18a2k | 2:532b0225519f | 132 | }else if (joystick.get_direction() == S){//if the joystick is moved downward, then direction is DOWN |
el18a2k | 2:532b0225519f | 133 | direction = DOWN; |
el18a2k | 2:532b0225519f | 134 | }else{ |
el18a2k | 2:532b0225519f | 135 | direction = CENTRE; //if the joystick is left in the centre position then direction is CENTRE |
el18a2k | 2:532b0225519f | 136 | }; |
el18a2k | 2:532b0225519f | 137 | |
el18a2k | 2:532b0225519f | 138 | y_pos = g_menu_output[state];//y_position is the array output at position 'state' |
el18a2k | 2:532b0225519f | 139 | |
el18a2k | 2:532b0225519f | 140 | |
el18a2k | 2:532b0225519f | 141 | //implement state machine |
el18a2k | 2:532b0225519f | 142 | switch(state) { |
el18a2k | 4:db929dab4f13 | 143 | |
el18a2k | 4:db929dab4f13 | 144 | //case for new game |
el18a2k | 2:532b0225519f | 145 | case 0: |
el18a2k | 6:7aafcaf7cbe2 | 146 | if(settings.buttonA_state(ButtonA)){ |
el18a2k | 10:e221bd1ce3ec | 147 | graphics.screenFlash(lcd); |
el18a2k | 10:e221bd1ce3ec | 148 | gamePlay(lcd, dac, joystick); |
el18a2k | 4:db929dab4f13 | 149 | } |
el18a2k | 2:532b0225519f | 150 | switch(direction) { |
el18a2k | 2:532b0225519f | 151 | case UP: |
el18a2k | 2:532b0225519f | 152 | state = 3; |
el18a2k | 2:532b0225519f | 153 | break; |
el18a2k | 2:532b0225519f | 154 | case DOWN: |
el18a2k | 2:532b0225519f | 155 | state = 1; |
el18a2k | 2:532b0225519f | 156 | break; |
el18a2k | 2:532b0225519f | 157 | case CENTRE: |
el18a2k | 2:532b0225519f | 158 | state = 0; |
el18a2k | 2:532b0225519f | 159 | break; |
el18a2k | 2:532b0225519f | 160 | } |
el18a2k | 2:532b0225519f | 161 | break; |
el18a2k | 4:db929dab4f13 | 162 | |
el18a2k | 4:db929dab4f13 | 163 | //case for HighScore |
el18a2k | 2:532b0225519f | 164 | case 1: |
el18a2k | 6:7aafcaf7cbe2 | 165 | if(settings.buttonA_state(ButtonA)){ |
el18a2k | 11:7c1e2a9303d3 | 166 | graphics.screenFlash(lcd); |
el18a2k | 11:7c1e2a9303d3 | 167 | highScore(lcd); |
el18a2k | 4:db929dab4f13 | 168 | } |
el18a2k | 2:532b0225519f | 169 | switch(direction) { |
el18a2k | 2:532b0225519f | 170 | case UP: |
el18a2k | 2:532b0225519f | 171 | state = 0; |
el18a2k | 2:532b0225519f | 172 | break; |
el18a2k | 2:532b0225519f | 173 | case DOWN: |
el18a2k | 2:532b0225519f | 174 | state = 2; |
el18a2k | 2:532b0225519f | 175 | break; |
el18a2k | 2:532b0225519f | 176 | case CENTRE: |
el18a2k | 2:532b0225519f | 177 | state = 1; |
el18a2k | 2:532b0225519f | 178 | break; |
el18a2k | 2:532b0225519f | 179 | } |
el18a2k | 2:532b0225519f | 180 | break; |
el18a2k | 4:db929dab4f13 | 181 | |
el18a2k | 4:db929dab4f13 | 182 | //case for how to play |
el18a2k | 2:532b0225519f | 183 | case 2: |
el18a2k | 6:7aafcaf7cbe2 | 184 | if(settings.buttonA_state(ButtonA)){ |
el18a2k | 8:fe51fbf81dee | 185 | graphics.screenFlash(lcd); |
el18a2k | 4:db929dab4f13 | 186 | Instructions(lcd); |
el18a2k | 4:db929dab4f13 | 187 | } |
el18a2k | 2:532b0225519f | 188 | switch(direction) { |
el18a2k | 2:532b0225519f | 189 | case UP: |
el18a2k | 2:532b0225519f | 190 | state = 1; |
el18a2k | 2:532b0225519f | 191 | break; |
el18a2k | 2:532b0225519f | 192 | case DOWN: |
el18a2k | 2:532b0225519f | 193 | state = 3; |
el18a2k | 2:532b0225519f | 194 | break; |
el18a2k | 2:532b0225519f | 195 | case CENTRE: |
el18a2k | 2:532b0225519f | 196 | state = 2; |
el18a2k | 2:532b0225519f | 197 | break; |
el18a2k | 2:532b0225519f | 198 | } |
el18a2k | 2:532b0225519f | 199 | break; |
el18a2k | 4:db929dab4f13 | 200 | |
el18a2k | 4:db929dab4f13 | 201 | //case for settings |
el18a2k | 2:532b0225519f | 202 | case 3: |
el18a2k | 6:7aafcaf7cbe2 | 203 | if(settings.buttonA_state(ButtonA)){ |
el18a2k | 6:7aafcaf7cbe2 | 204 | graphics.screenFlash(lcd); |
el18a2k | 6:7aafcaf7cbe2 | 205 | settings.settingsMenu(lcd, dac, joystick); |
el18a2k | 4:db929dab4f13 | 206 | } |
el18a2k | 2:532b0225519f | 207 | switch(direction) { |
el18a2k | 2:532b0225519f | 208 | case UP: |
el18a2k | 2:532b0225519f | 209 | state = 2; |
el18a2k | 2:532b0225519f | 210 | break; |
el18a2k | 2:532b0225519f | 211 | case DOWN: |
el18a2k | 2:532b0225519f | 212 | state = 0; |
el18a2k | 2:532b0225519f | 213 | break; |
el18a2k | 2:532b0225519f | 214 | case CENTRE: |
el18a2k | 2:532b0225519f | 215 | state = 3; |
el18a2k | 2:532b0225519f | 216 | break; |
el18a2k | 4:db929dab4f13 | 217 | |
el18a2k | 2:532b0225519f | 218 | } |
el18a2k | 2:532b0225519f | 219 | break; |
el18a2k | 2:532b0225519f | 220 | default: |
el18a2k | 2:532b0225519f | 221 | state = 0; |
el18a2k | 2:532b0225519f | 222 | break; |
el18a2k | 2:532b0225519f | 223 | } |
el18a2k | 2:532b0225519f | 224 | |
el18a2k | 2:532b0225519f | 225 | //draw sprite at position (3, y_pos) |
el18a2k | 2:532b0225519f | 226 | lcd.drawSprite(3, y_pos, 4, 9, (int*)Fish_1); |
el18a2k | 2:532b0225519f | 227 | lcd.refresh(); |
el18a2k | 2:532b0225519f | 228 | wait_ms(500); |
el18a2k | 2:532b0225519f | 229 | } |
el18a2k | 8:fe51fbf81dee | 230 | } |