Simple fish eat program

Dependencies:   mbed mbed-rtos N5110 ShiftReg Tone

Committer:
el18a2k
Date:
Mon Aug 02 14:35:02 2021 +0000
Revision:
14:f1552b691274
Parent:
13:183bd19f3d7d
final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el18a2k 14:f1552b691274 1 /* Fish Eat Game v2.0
el18a2k 14:f1552b691274 2 * Author: Andrew Knowles
el18a2k 14:f1552b691274 3 * Date: 21/04/2021
el18a2k 14:f1552b691274 4 * Note: See hearder files for additional recognistion */
el18a2k 14:f1552b691274 5
el18a2k 1:7dfa61225fcf 6 #include "FishEngine.h"
el18a2k 1:7dfa61225fcf 7
el18a2k 12:20ac766b3175 8 //definitions
el18a2k 2:532b0225519f 9 #define UP 0
el18a2k 2:532b0225519f 10 #define DOWN 1
el18a2k 2:532b0225519f 11 #define CENTRE 2
el18a2k 2:532b0225519f 12
el18a2k 2:532b0225519f 13 //objects
el18a2k 10:e221bd1ce3ec 14 Game game;
el18a2k 6:7aafcaf7cbe2 15 Settings settings;
el18a2k 1:7dfa61225fcf 16 Graphics graphics;
el18a2k 11:7c1e2a9303d3 17 HighScore highscore;
el18a2k 1:7dfa61225fcf 18
el18a2k 2:532b0225519f 19 // creates intro sequence
el18a2k 1:7dfa61225fcf 20 void FishEngine::titleSequence(N5110 &lcd){
el18a2k 1:7dfa61225fcf 21 lcd.clear();
el18a2k 2:532b0225519f 22 graphics.titleScreen(lcd); //prints titlescreen (held in graphics.h)
el18a2k 1:7dfa61225fcf 23 lcd.refresh();
el18a2k 2:532b0225519f 24 wait_ms(2000);
el18a2k 1:7dfa61225fcf 25
el18a2k 12:20ac766b3175 26 while(settings.buttonB_state(ButtonB) == 0){
el18a2k 1:7dfa61225fcf 27 lcd.clear();
el18a2k 2:532b0225519f 28 graphics.confirmationScreen(lcd); //calls confirmation function (held in graphics.h)
el18a2k 1:7dfa61225fcf 29 lcd.refresh();
el18a2k 1:7dfa61225fcf 30 wait_ms(1000/10);
el18a2k 1:7dfa61225fcf 31 }
el18a2k 1:7dfa61225fcf 32
el18a2k 2:532b0225519f 33 graphics.screenFlash(lcd); //calls screen flash function (held in graphics.h)
el18a2k 1:7dfa61225fcf 34 lcd.refresh();
el18a2k 1:7dfa61225fcf 35 }
el18a2k 1:7dfa61225fcf 36
el18a2k 12:20ac766b3175 37 //plays the game
el18a2k 13:183bd19f3d7d 38 void FishEngine::gamePlay(N5110 &lcd, Joystick &joystick){
el18a2k 12:20ac766b3175 39 game.init(lcd, 20, 20, 1); //initalise game conditions
el18a2k 10:e221bd1ce3ec 40 do{
el18a2k 10:e221bd1ce3ec 41 DIRECTION direction = {joystick.get_direction()};
el18a2k 13:183bd19f3d7d 42 game.gamePlay(lcd, direction);
el18a2k 12:20ac766b3175 43 playerScore = game.Score(lcd); //updates playerScore in real time
el18a2k 10:e221bd1ce3ec 44 }while(game.Lives() != 0);
el18a2k 11:7c1e2a9303d3 45
el18a2k 12:20ac766b3175 46 graphics.gameOver(lcd); //display game over screen
el18a2k 12:20ac766b3175 47 fileValue = highscore.readFile(); //reads current value stored in file, saves it to fileValue
el18a2k 11:7c1e2a9303d3 48
el18a2k 12:20ac766b3175 49 //if player score is higher that current file value save new highscore
el18a2k 11:7c1e2a9303d3 50 if(playerScore > fileValue){
el18a2k 12:20ac766b3175 51 highscore.writeFile(playerScore);
el18a2k 12:20ac766b3175 52 graphics.newHighscore(lcd, playerScore);
el18a2k 11:7c1e2a9303d3 53 }
el18a2k 11:7c1e2a9303d3 54 }
el18a2k 11:7c1e2a9303d3 55
el18a2k 12:20ac766b3175 56 //displays current highscore
el18a2k 11:7c1e2a9303d3 57 void FishEngine::highScore(N5110 &lcd){
el18a2k 11:7c1e2a9303d3 58 do{
el18a2k 12:20ac766b3175 59 highscore.displayFile(lcd);
el18a2k 11:7c1e2a9303d3 60 }while(settings.buttonB_state(ButtonB) == false);
el18a2k 10:e221bd1ce3ec 61 }
el18a2k 10:e221bd1ce3ec 62
el18a2k 12:20ac766b3175 63 //displays player instructions
el18a2k 8:fe51fbf81dee 64 void FishEngine::Instructions(N5110 &lcd){
el18a2k 12:20ac766b3175 65 graphics.playerInstruc(lcd);
el18a2k 8:fe51fbf81dee 66 }
el18a2k 8:fe51fbf81dee 67
el18a2k 12:20ac766b3175 68 // creates the games main menu screen with scrolling ability through the use of a state machine.
el18a2k 2:532b0225519f 69 void FishEngine::mainMenu(N5110 &lcd, Tone &dac, Joystick &joystick){
el18a2k 2:532b0225519f 70 const int Fish_1[4][9]= {
el18a2k 2:532b0225519f 71 { 1,0,0,1,1,1,1,1,0, },
el18a2k 2:532b0225519f 72 { 1,1,1,1,1,1,1,0,1, },
el18a2k 2:532b0225519f 73 { 1,1,1,1,1,1,1,1,1, },
el18a2k 2:532b0225519f 74 { 1,0,0,1,1,1,1,1,0, },
el18a2k 2:532b0225519f 75 };
el18a2k 2:532b0225519f 76
el18a2k 2:532b0225519f 77 // outputs for the state machine are used to draw Fish_1 beside the corrosponding
el18a2k 2:532b0225519f 78 // menu choice
el18a2k 2:532b0225519f 79 int g_menu_output[4] = {10, 18, 26, 34};
el18a2k 12:20ac766b3175 80 state = 0; //set inital state to 0
el18a2k 12:20ac766b3175 81 direction = CENTRE; //set inital direction to remain on that state until an input is received
el18a2k 2:532b0225519f 82
el18a2k 2:532b0225519f 83 while(1){
el18a2k 2:532b0225519f 84 lcd.clear();
el18a2k 2:532b0225519f 85 lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
el18a2k 2:532b0225519f 86
el18a2k 2:532b0225519f 87 //prints players options
el18a2k 2:532b0225519f 88 lcd.printString("New Game", 15, 1);
el18a2k 2:532b0225519f 89 lcd.printString("High Score", 15, 2);
el18a2k 2:532b0225519f 90 lcd.printString("How to Play", 15, 3);
el18a2k 12:20ac766b3175 91 lcd.printString("Settings", 15, 4);
el18a2k 2:532b0225519f 92
el18a2k 2:532b0225519f 93 if(joystick.get_direction() == N){ //if the joystick is moved upward, then direction is UP
el18a2k 2:532b0225519f 94 direction = UP;
el18a2k 2:532b0225519f 95 }else if (joystick.get_direction() == S){//if the joystick is moved downward, then direction is DOWN
el18a2k 2:532b0225519f 96 direction = DOWN;
el18a2k 2:532b0225519f 97 }else{
el18a2k 2:532b0225519f 98 direction = CENTRE; //if the joystick is left in the centre position then direction is CENTRE
el18a2k 2:532b0225519f 99 };
el18a2k 2:532b0225519f 100
el18a2k 2:532b0225519f 101 y_pos = g_menu_output[state];//y_position is the array output at position 'state'
el18a2k 2:532b0225519f 102
el18a2k 2:532b0225519f 103
el18a2k 2:532b0225519f 104 //implement state machine
el18a2k 2:532b0225519f 105 switch(state) {
el18a2k 4:db929dab4f13 106
el18a2k 4:db929dab4f13 107 //case for new game
el18a2k 2:532b0225519f 108 case 0:
el18a2k 6:7aafcaf7cbe2 109 if(settings.buttonA_state(ButtonA)){
el18a2k 10:e221bd1ce3ec 110 graphics.screenFlash(lcd);
el18a2k 13:183bd19f3d7d 111 gamePlay(lcd, joystick);
el18a2k 4:db929dab4f13 112 }
el18a2k 2:532b0225519f 113 switch(direction) {
el18a2k 2:532b0225519f 114 case UP:
el18a2k 2:532b0225519f 115 state = 3;
el18a2k 2:532b0225519f 116 break;
el18a2k 2:532b0225519f 117 case DOWN:
el18a2k 2:532b0225519f 118 state = 1;
el18a2k 2:532b0225519f 119 break;
el18a2k 2:532b0225519f 120 case CENTRE:
el18a2k 2:532b0225519f 121 state = 0;
el18a2k 2:532b0225519f 122 break;
el18a2k 2:532b0225519f 123 }
el18a2k 2:532b0225519f 124 break;
el18a2k 4:db929dab4f13 125
el18a2k 12:20ac766b3175 126 //case to view HighScore
el18a2k 2:532b0225519f 127 case 1:
el18a2k 6:7aafcaf7cbe2 128 if(settings.buttonA_state(ButtonA)){
el18a2k 11:7c1e2a9303d3 129 graphics.screenFlash(lcd);
el18a2k 11:7c1e2a9303d3 130 highScore(lcd);
el18a2k 4:db929dab4f13 131 }
el18a2k 2:532b0225519f 132 switch(direction) {
el18a2k 2:532b0225519f 133 case UP:
el18a2k 2:532b0225519f 134 state = 0;
el18a2k 2:532b0225519f 135 break;
el18a2k 2:532b0225519f 136 case DOWN:
el18a2k 2:532b0225519f 137 state = 2;
el18a2k 2:532b0225519f 138 break;
el18a2k 2:532b0225519f 139 case CENTRE:
el18a2k 2:532b0225519f 140 state = 1;
el18a2k 2:532b0225519f 141 break;
el18a2k 2:532b0225519f 142 }
el18a2k 2:532b0225519f 143 break;
el18a2k 4:db929dab4f13 144
el18a2k 4:db929dab4f13 145 //case for how to play
el18a2k 2:532b0225519f 146 case 2:
el18a2k 6:7aafcaf7cbe2 147 if(settings.buttonA_state(ButtonA)){
el18a2k 8:fe51fbf81dee 148 graphics.screenFlash(lcd);
el18a2k 4:db929dab4f13 149 Instructions(lcd);
el18a2k 4:db929dab4f13 150 }
el18a2k 2:532b0225519f 151 switch(direction) {
el18a2k 2:532b0225519f 152 case UP:
el18a2k 2:532b0225519f 153 state = 1;
el18a2k 2:532b0225519f 154 break;
el18a2k 2:532b0225519f 155 case DOWN:
el18a2k 2:532b0225519f 156 state = 3;
el18a2k 2:532b0225519f 157 break;
el18a2k 2:532b0225519f 158 case CENTRE:
el18a2k 2:532b0225519f 159 state = 2;
el18a2k 2:532b0225519f 160 break;
el18a2k 2:532b0225519f 161 }
el18a2k 2:532b0225519f 162 break;
el18a2k 4:db929dab4f13 163
el18a2k 4:db929dab4f13 164 //case for settings
el18a2k 2:532b0225519f 165 case 3:
el18a2k 6:7aafcaf7cbe2 166 if(settings.buttonA_state(ButtonA)){
el18a2k 6:7aafcaf7cbe2 167 graphics.screenFlash(lcd);
el18a2k 6:7aafcaf7cbe2 168 settings.settingsMenu(lcd, dac, joystick);
el18a2k 4:db929dab4f13 169 }
el18a2k 2:532b0225519f 170 switch(direction) {
el18a2k 2:532b0225519f 171 case UP:
el18a2k 2:532b0225519f 172 state = 2;
el18a2k 2:532b0225519f 173 break;
el18a2k 2:532b0225519f 174 case DOWN:
el18a2k 2:532b0225519f 175 state = 0;
el18a2k 2:532b0225519f 176 break;
el18a2k 2:532b0225519f 177 case CENTRE:
el18a2k 2:532b0225519f 178 state = 3;
el18a2k 2:532b0225519f 179 break;
el18a2k 4:db929dab4f13 180
el18a2k 2:532b0225519f 181 }
el18a2k 2:532b0225519f 182 break;
el18a2k 2:532b0225519f 183 default:
el18a2k 2:532b0225519f 184 state = 0;
el18a2k 2:532b0225519f 185 break;
el18a2k 2:532b0225519f 186 }
el18a2k 2:532b0225519f 187
el18a2k 2:532b0225519f 188 //draw sprite at position (3, y_pos)
el18a2k 2:532b0225519f 189 lcd.drawSprite(3, y_pos, 4, 9, (int*)Fish_1);
el18a2k 2:532b0225519f 190 lcd.refresh();
el18a2k 2:532b0225519f 191 wait_ms(500);
el18a2k 2:532b0225519f 192 }
el18a2k 8:fe51fbf81dee 193 }