Simple fish eat program

Dependencies:   mbed mbed-rtos N5110 ShiftReg Tone

Committer:
el18a2k
Date:
Wed Mar 24 19:33:59 2021 +0000
Revision:
5:02e7b5197827
Parent:
4:db929dab4f13
Child:
6:7aafcaf7cbe2
Settings menu implemented (sound on/off needs creating)

Who changed what in which revision?

UserRevisionLine numberNew 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 //attach
el18a2k 1:7dfa61225fcf 8 BusOut RGB_led(p24,p23,p22); //RGB bus MSB - LSB, inverted logic 1 = low
el18a2k 4:db929dab4f13 9 DigitalIn button_A(p29);
el18a2k 4:db929dab4f13 10 DigitalIn button_B(p28);
el18a2k 4:db929dab4f13 11 DigitalIn button_C(p27);
el18a2k 4:db929dab4f13 12 DigitalIn button_D(p26);
el18a2k 1:7dfa61225fcf 13
el18a2k 2:532b0225519f 14 //objects
el18a2k 1:7dfa61225fcf 15 ShiftReg shift;
el18a2k 1:7dfa61225fcf 16 Graphics graphics;
el18a2k 1:7dfa61225fcf 17
el18a2k 2:532b0225519f 18 //initialise all of the board
el18a2k 2:532b0225519f 19 void FishEngine::system_init(N5110 &lcd, Tone &dac, Joystick &joystick){
el18a2k 1:7dfa61225fcf 20 lcd.init();
el18a2k 1:7dfa61225fcf 21 lcd.setBrightness(0.5);
el18a2k 2:532b0225519f 22 joystick.init();
el18a2k 1:7dfa61225fcf 23 dac.init();
el18a2k 1:7dfa61225fcf 24 shift.write(0x00);
el18a2k 1:7dfa61225fcf 25 RGB_led.write(0b111);
el18a2k 4:db929dab4f13 26 button_A.mode(PullNone);
el18a2k 4:db929dab4f13 27 button_B.mode(PullNone);
el18a2k 4:db929dab4f13 28 button_C.mode(PullNone);
el18a2k 4:db929dab4f13 29 button_D.mode(PullNone);
el18a2k 1:7dfa61225fcf 30 }
el18a2k 1:7dfa61225fcf 31
el18a2k 2:532b0225519f 32 // creates intro sequence
el18a2k 1:7dfa61225fcf 33 void FishEngine::titleSequence(N5110 &lcd){
el18a2k 1:7dfa61225fcf 34 lcd.clear();
el18a2k 2:532b0225519f 35 graphics.titleScreen(lcd); //prints titlescreen (held in graphics.h)
el18a2k 1:7dfa61225fcf 36 lcd.refresh();
el18a2k 2:532b0225519f 37 wait_ms(2000);
el18a2k 1:7dfa61225fcf 38
el18a2k 1:7dfa61225fcf 39 while(button_A.read() == 0){
el18a2k 1:7dfa61225fcf 40 lcd.clear();
el18a2k 2:532b0225519f 41 graphics.confirmationScreen(lcd); //calls confirmation function (held in graphics.h)
el18a2k 1:7dfa61225fcf 42 lcd.refresh();
el18a2k 1:7dfa61225fcf 43 wait_ms(1000/10);
el18a2k 1:7dfa61225fcf 44 }
el18a2k 1:7dfa61225fcf 45
el18a2k 2:532b0225519f 46 graphics.screenFlash(lcd); //calls screen flash function (held in graphics.h)
el18a2k 1:7dfa61225fcf 47 lcd.refresh();
el18a2k 1:7dfa61225fcf 48 }
el18a2k 1:7dfa61225fcf 49
el18a2k 2:532b0225519f 50 // creates the games main menu screen with scrolling ability through the use of a
el18a2k 2:532b0225519f 51 // state machine.
el18a2k 2:532b0225519f 52 void FishEngine::mainMenu(N5110 &lcd, Tone &dac, Joystick &joystick){
el18a2k 2:532b0225519f 53 const int Fish_1[4][9]= {
el18a2k 2:532b0225519f 54 { 1,0,0,1,1,1,1,1,0, },
el18a2k 2:532b0225519f 55 { 1,1,1,1,1,1,1,0,1, },
el18a2k 2:532b0225519f 56 { 1,1,1,1,1,1,1,1,1, },
el18a2k 2:532b0225519f 57 { 1,0,0,1,1,1,1,1,0, },
el18a2k 2:532b0225519f 58 };
el18a2k 2:532b0225519f 59
el18a2k 2:532b0225519f 60 // outputs for the state machine are used to draw Fish_1 beside the corrosponding
el18a2k 2:532b0225519f 61 // menu choice
el18a2k 2:532b0225519f 62 int g_menu_output[4] = {10, 18, 26, 34};
el18a2k 2:532b0225519f 63 int state = 0; //set inital state to 0
el18a2k 2:532b0225519f 64 int direction = CENTRE; //set inital direction to remain on that state until an input is received
el18a2k 2:532b0225519f 65 int y_pos;
el18a2k 2:532b0225519f 66
el18a2k 2:532b0225519f 67 while(1){
el18a2k 2:532b0225519f 68 lcd.clear();
el18a2k 2:532b0225519f 69 lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
el18a2k 2:532b0225519f 70
el18a2k 2:532b0225519f 71 //prints players options
el18a2k 2:532b0225519f 72 lcd.printString("New Game", 15, 1);
el18a2k 2:532b0225519f 73 lcd.printString("High Score", 15, 2);
el18a2k 2:532b0225519f 74 lcd.printString("How to Play", 15, 3);
el18a2k 2:532b0225519f 75 lcd.printString("Settings", 15, 4);
el18a2k 2:532b0225519f 76
el18a2k 2:532b0225519f 77
el18a2k 2:532b0225519f 78 /*implementation of state machine allows the determination of the position of the fish marker
el18a2k 2:532b0225519f 79 based on the users joystick input:
el18a2k 2:532b0225519f 80
el18a2k 2:532b0225519f 81 inputs
el18a2k 2:532b0225519f 82 state 0 1 2 where 0 is UP and 1 is DOWN 2 is CENTRE
el18a2k 2:532b0225519f 83
el18a2k 2:532b0225519f 84 0 3 1 0
el18a2k 2:532b0225519f 85 1 0 2 1
el18a2k 2:532b0225519f 86 2 1 3 2
el18a2k 2:532b0225519f 87 3 2 0 3 */
el18a2k 2:532b0225519f 88
el18a2k 2:532b0225519f 89
el18a2k 2:532b0225519f 90 if(joystick.get_direction() == N){ //if the joystick is moved upward, then direction is UP
el18a2k 2:532b0225519f 91 direction = UP;
el18a2k 2:532b0225519f 92 }else if (joystick.get_direction() == S){//if the joystick is moved downward, then direction is DOWN
el18a2k 2:532b0225519f 93 direction = DOWN;
el18a2k 2:532b0225519f 94 }else{
el18a2k 2:532b0225519f 95 direction = CENTRE; //if the joystick is left in the centre position then direction is CENTRE
el18a2k 2:532b0225519f 96 };
el18a2k 2:532b0225519f 97
el18a2k 2:532b0225519f 98 y_pos = g_menu_output[state];//y_position is the array output at position 'state'
el18a2k 2:532b0225519f 99
el18a2k 2:532b0225519f 100
el18a2k 2:532b0225519f 101 //implement state machine
el18a2k 2:532b0225519f 102 switch(state) {
el18a2k 4:db929dab4f13 103
el18a2k 4:db929dab4f13 104 //case for new game
el18a2k 2:532b0225519f 105 case 0:
el18a2k 4:db929dab4f13 106 if(button_A.read()){
el18a2k 4:db929dab4f13 107 gamePlay(lcd,dac);
el18a2k 4:db929dab4f13 108 }
el18a2k 2:532b0225519f 109 switch(direction) {
el18a2k 2:532b0225519f 110 case UP:
el18a2k 2:532b0225519f 111 state = 3;
el18a2k 2:532b0225519f 112 break;
el18a2k 2:532b0225519f 113 case DOWN:
el18a2k 2:532b0225519f 114 state = 1;
el18a2k 2:532b0225519f 115 break;
el18a2k 2:532b0225519f 116 case CENTRE:
el18a2k 2:532b0225519f 117 state = 0;
el18a2k 2:532b0225519f 118 break;
el18a2k 2:532b0225519f 119 }
el18a2k 2:532b0225519f 120 break;
el18a2k 4:db929dab4f13 121
el18a2k 4:db929dab4f13 122 //case for HighScore
el18a2k 2:532b0225519f 123 case 1:
el18a2k 4:db929dab4f13 124 if(button_A.read()){
el18a2k 4:db929dab4f13 125 highScore(lcd);
el18a2k 4:db929dab4f13 126 }
el18a2k 2:532b0225519f 127 switch(direction) {
el18a2k 2:532b0225519f 128 case UP:
el18a2k 2:532b0225519f 129 state = 0;
el18a2k 2:532b0225519f 130 break;
el18a2k 2:532b0225519f 131 case DOWN:
el18a2k 2:532b0225519f 132 state = 2;
el18a2k 2:532b0225519f 133 break;
el18a2k 2:532b0225519f 134 case CENTRE:
el18a2k 2:532b0225519f 135 state = 1;
el18a2k 2:532b0225519f 136 break;
el18a2k 2:532b0225519f 137 }
el18a2k 2:532b0225519f 138 break;
el18a2k 4:db929dab4f13 139
el18a2k 4:db929dab4f13 140 //case for how to play
el18a2k 2:532b0225519f 141 case 2:
el18a2k 4:db929dab4f13 142 if(button_A.read()){
el18a2k 4:db929dab4f13 143 Instructions(lcd);
el18a2k 4:db929dab4f13 144 }
el18a2k 2:532b0225519f 145 switch(direction) {
el18a2k 2:532b0225519f 146 case UP:
el18a2k 2:532b0225519f 147 state = 1;
el18a2k 2:532b0225519f 148 break;
el18a2k 2:532b0225519f 149 case DOWN:
el18a2k 2:532b0225519f 150 state = 3;
el18a2k 2:532b0225519f 151 break;
el18a2k 2:532b0225519f 152 case CENTRE:
el18a2k 2:532b0225519f 153 state = 2;
el18a2k 2:532b0225519f 154 break;
el18a2k 2:532b0225519f 155 }
el18a2k 2:532b0225519f 156 break;
el18a2k 4:db929dab4f13 157
el18a2k 4:db929dab4f13 158 //case for settings
el18a2k 2:532b0225519f 159 case 3:
el18a2k 4:db929dab4f13 160 if(button_A.read()){
el18a2k 5:02e7b5197827 161 Settings(lcd, dac, joystick);
el18a2k 4:db929dab4f13 162 }
el18a2k 2:532b0225519f 163 switch(direction) {
el18a2k 2:532b0225519f 164 case UP:
el18a2k 2:532b0225519f 165 state = 2;
el18a2k 2:532b0225519f 166 break;
el18a2k 2:532b0225519f 167 case DOWN:
el18a2k 2:532b0225519f 168 state = 0;
el18a2k 2:532b0225519f 169 break;
el18a2k 2:532b0225519f 170 case CENTRE:
el18a2k 2:532b0225519f 171 state = 3;
el18a2k 2:532b0225519f 172 break;
el18a2k 4:db929dab4f13 173
el18a2k 2:532b0225519f 174 }
el18a2k 2:532b0225519f 175 break;
el18a2k 2:532b0225519f 176 default:
el18a2k 2:532b0225519f 177 state = 0;
el18a2k 2:532b0225519f 178 break;
el18a2k 2:532b0225519f 179 }
el18a2k 2:532b0225519f 180
el18a2k 2:532b0225519f 181 //draw sprite at position (3, y_pos)
el18a2k 2:532b0225519f 182 lcd.drawSprite(3, y_pos, 4, 9, (int*)Fish_1);
el18a2k 2:532b0225519f 183 lcd.refresh();
el18a2k 2:532b0225519f 184 wait_ms(500);
el18a2k 2:532b0225519f 185 }
el18a2k 2:532b0225519f 186 }
el18a2k 1:7dfa61225fcf 187
el18a2k 4:db929dab4f13 188 // function for game play
el18a2k 4:db929dab4f13 189 void FishEngine::gamePlay(N5110 &lcd, Tone &dac){
el18a2k 4:db929dab4f13 190 graphics.screenFlash(lcd);
el18a2k 4:db929dab4f13 191
el18a2k 4:db929dab4f13 192 do{
el18a2k 4:db929dab4f13 193 lcd.clear();
el18a2k 4:db929dab4f13 194 lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
el18a2k 4:db929dab4f13 195 lcd.printString(" Play game", 10, 2);
el18a2k 4:db929dab4f13 196 lcd.refresh();
el18a2k 4:db929dab4f13 197 wait_ms(1000/10);
el18a2k 4:db929dab4f13 198 }while(button_B.read() == false);
el18a2k 4:db929dab4f13 199 }
el18a2k 4:db929dab4f13 200
el18a2k 4:db929dab4f13 201 //function for viewing high score
el18a2k 4:db929dab4f13 202 void FishEngine::highScore(N5110 &lcd){
el18a2k 4:db929dab4f13 203 graphics.screenFlash(lcd);
el18a2k 4:db929dab4f13 204
el18a2k 4:db929dab4f13 205 do{
el18a2k 4:db929dab4f13 206 lcd.clear();
el18a2k 4:db929dab4f13 207 lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
el18a2k 4:db929dab4f13 208 lcd.printString(" High score", 10, 2);
el18a2k 4:db929dab4f13 209 lcd.refresh();
el18a2k 4:db929dab4f13 210 wait_ms(1000/10);
el18a2k 4:db929dab4f13 211 }while(button_B.read() == false);
el18a2k 4:db929dab4f13 212 }
el18a2k 4:db929dab4f13 213
el18a2k 4:db929dab4f13 214 //function for providing instruction on how to play
el18a2k 4:db929dab4f13 215 void FishEngine::Instructions(N5110 &lcd){
el18a2k 4:db929dab4f13 216 graphics.screenFlash(lcd);
el18a2k 4:db929dab4f13 217
el18a2k 4:db929dab4f13 218 do{
el18a2k 4:db929dab4f13 219 lcd.clear();
el18a2k 4:db929dab4f13 220 lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
el18a2k 4:db929dab4f13 221 lcd.printString(" How to play", 10, 2);
el18a2k 4:db929dab4f13 222 lcd.refresh();
el18a2k 4:db929dab4f13 223 wait_ms(1000/10);
el18a2k 4:db929dab4f13 224 }while(button_B.read() == false);
el18a2k 4:db929dab4f13 225 }
el18a2k 4:db929dab4f13 226
el18a2k 4:db929dab4f13 227 //functions for changing settings
el18a2k 5:02e7b5197827 228 void FishEngine::Settings(N5110 &lcd, Tone &dac, Joystick &joystick){
el18a2k 4:db929dab4f13 229 graphics.screenFlash(lcd);
el18a2k 5:02e7b5197827 230 RGB_led.write(0b101);
el18a2k 5:02e7b5197827 231 int rect_width = 32;
el18a2k 5:02e7b5197827 232 const int rightArrow[6][3] = {
el18a2k 5:02e7b5197827 233 { 1,0,0, },
el18a2k 5:02e7b5197827 234 { 1,1,0, },
el18a2k 5:02e7b5197827 235 { 1,1,1, },
el18a2k 5:02e7b5197827 236 { 1,1,1, },
el18a2k 5:02e7b5197827 237 { 1,1,0, },
el18a2k 5:02e7b5197827 238 { 1,0,0, },
el18a2k 5:02e7b5197827 239 };
el18a2k 4:db929dab4f13 240
el18a2k 5:02e7b5197827 241 // outputs for the state machine are used to draw Fish_1 beside the corrosponding
el18a2k 5:02e7b5197827 242 // menu choice
el18a2k 5:02e7b5197827 243 int g_setting_menu_output[2] = {7, 37};
el18a2k 5:02e7b5197827 244 int state = 0; //set inital state to 0
el18a2k 5:02e7b5197827 245 int direction = CENTRE; //set inital direction to remain on that state until an input is received
el18a2k 5:02e7b5197827 246 int x_pos;
el18a2k 5:02e7b5197827 247
el18a2k 4:db929dab4f13 248 do{
el18a2k 5:02e7b5197827 249 lcd.clear();
el18a2k 4:db929dab4f13 250 lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
el18a2k 5:02e7b5197827 251 lcd.printString("Contrast", 15, 1);
el18a2k 5:02e7b5197827 252 lcd.printString("Music", 15, 3);
el18a2k 5:02e7b5197827 253 lcd.printString("On", 15, 4);
el18a2k 5:02e7b5197827 254 lcd.printString("Off", 45, 4);
el18a2k 5:02e7b5197827 255
el18a2k 5:02e7b5197827 256 if(joystick.get_direction() == E && rect_width < 64){
el18a2k 5:02e7b5197827 257 rect_width = rect_width + 16;
el18a2k 5:02e7b5197827 258 }else if(joystick.get_direction() == W && rect_width > 0){
el18a2k 5:02e7b5197827 259 rect_width = rect_width - 16;
el18a2k 5:02e7b5197827 260 }
el18a2k 5:02e7b5197827 261
el18a2k 5:02e7b5197827 262 //contrast bar is 20 pixels high and 64 pixels long
el18a2k 5:02e7b5197827 263 lcd.drawRect(10,16,64,5,FILL_TRANSPARENT); //draws outer rectangle
el18a2k 5:02e7b5197827 264 lcd.drawRect(10,16,rect_width,5,FILL_BLACK); //draws inner rectangle
el18a2k 5:02e7b5197827 265
el18a2k 5:02e7b5197827 266 if(rect_width == 0){
el18a2k 5:02e7b5197827 267 lcd.setBrightness(0.3);
el18a2k 5:02e7b5197827 268
el18a2k 5:02e7b5197827 269 }else if(rect_width == 16){
el18a2k 5:02e7b5197827 270 lcd.setBrightness(0.4);
el18a2k 5:02e7b5197827 271
el18a2k 5:02e7b5197827 272 }else if(rect_width == 32){
el18a2k 5:02e7b5197827 273 lcd.setBrightness(0.5);
el18a2k 5:02e7b5197827 274
el18a2k 5:02e7b5197827 275 }else if(rect_width == 48){
el18a2k 5:02e7b5197827 276 lcd.setBrightness(0.6);
el18a2k 5:02e7b5197827 277
el18a2k 5:02e7b5197827 278 }else if(rect_width == 64){
el18a2k 5:02e7b5197827 279 lcd.setBrightness(0.7);
el18a2k 5:02e7b5197827 280 }
el18a2k 5:02e7b5197827 281
el18a2k 5:02e7b5197827 282 /*implementation of state machine allows the determination of the position of the arrow marker
el18a2k 5:02e7b5197827 283 based on the users joystick input:
el18a2k 5:02e7b5197827 284
el18a2k 5:02e7b5197827 285 inputs
el18a2k 5:02e7b5197827 286 state 0 1 2 where 0 is UP and 1 is DOWN 2 is CENTRE
el18a2k 5:02e7b5197827 287
el18a2k 5:02e7b5197827 288 0 1 1 0
el18a2k 5:02e7b5197827 289 1 0 0 1 */
el18a2k 5:02e7b5197827 290
el18a2k 5:02e7b5197827 291 if(joystick.get_direction() == N){ //if the joystick is moved upward, then direction is UP
el18a2k 5:02e7b5197827 292 direction = UP;
el18a2k 5:02e7b5197827 293 }else if (joystick.get_direction() == S){//if the joystick is moved downward, then direction is DOWN
el18a2k 5:02e7b5197827 294 direction = DOWN;
el18a2k 5:02e7b5197827 295 }else{
el18a2k 5:02e7b5197827 296 direction = CENTRE; //if the joystick is left in the centre position then direction is CENTRE
el18a2k 5:02e7b5197827 297 };
el18a2k 5:02e7b5197827 298
el18a2k 5:02e7b5197827 299 x_pos = g_setting_menu_output[state];//x_position is the array output at position 'state'
el18a2k 5:02e7b5197827 300
el18a2k 5:02e7b5197827 301
el18a2k 5:02e7b5197827 302 //implement state machine
el18a2k 5:02e7b5197827 303 switch(state) {
el18a2k 5:02e7b5197827 304 //case for music on
el18a2k 5:02e7b5197827 305 case 0:
el18a2k 5:02e7b5197827 306 if(button_A.read()){
el18a2k 5:02e7b5197827 307 RGB_led.write(0b101);
el18a2k 5:02e7b5197827 308 }
el18a2k 5:02e7b5197827 309 switch(direction) {
el18a2k 5:02e7b5197827 310 case UP:
el18a2k 5:02e7b5197827 311 state = 1;
el18a2k 5:02e7b5197827 312 break;
el18a2k 5:02e7b5197827 313 case DOWN:
el18a2k 5:02e7b5197827 314 state = 1;
el18a2k 5:02e7b5197827 315 break;
el18a2k 5:02e7b5197827 316 case CENTRE:
el18a2k 5:02e7b5197827 317 state = 0;
el18a2k 5:02e7b5197827 318 break;
el18a2k 5:02e7b5197827 319 }
el18a2k 5:02e7b5197827 320 break;
el18a2k 5:02e7b5197827 321
el18a2k 5:02e7b5197827 322 //case for music off
el18a2k 5:02e7b5197827 323 case 1:
el18a2k 5:02e7b5197827 324 if(button_A.read()){
el18a2k 5:02e7b5197827 325 RGB_led.write(0b110);
el18a2k 5:02e7b5197827 326 }
el18a2k 5:02e7b5197827 327 switch(direction) {
el18a2k 5:02e7b5197827 328 case UP:
el18a2k 5:02e7b5197827 329 state = 0;
el18a2k 5:02e7b5197827 330 break;
el18a2k 5:02e7b5197827 331 case DOWN:
el18a2k 5:02e7b5197827 332 state = 0;
el18a2k 5:02e7b5197827 333 break;
el18a2k 5:02e7b5197827 334 case CENTRE:
el18a2k 5:02e7b5197827 335 state = 1;
el18a2k 5:02e7b5197827 336 break;
el18a2k 5:02e7b5197827 337 }
el18a2k 5:02e7b5197827 338 break;
el18a2k 5:02e7b5197827 339
el18a2k 5:02e7b5197827 340 default:
el18a2k 5:02e7b5197827 341 state = 0;
el18a2k 5:02e7b5197827 342 break;
el18a2k 5:02e7b5197827 343 }
el18a2k 5:02e7b5197827 344
el18a2k 5:02e7b5197827 345 //pos / sprite x y / x y
el18a2k 5:02e7b5197827 346 lcd.drawSprite(x_pos,32,6,3,(int*)rightArrow);
el18a2k 4:db929dab4f13 347 lcd.refresh();
el18a2k 5:02e7b5197827 348
el18a2k 4:db929dab4f13 349 wait_ms(1000/10);
el18a2k 4:db929dab4f13 350 }while(button_B.read() == false);
el18a2k 4:db929dab4f13 351 }