Menu class used as basis for program; running the game and allowing the user to change the style and difficulty of the game via an interface.
Menu.cpp
- Committer:
- el15mh
- Date:
- 2017-04-16
- Revision:
- 3:a79daa7c2b55
- Parent:
- 2:917211a4551b
- Child:
- 4:4f20bcef2c0c
File content as of revision 3:a79daa7c2b55:
/* @file Menu.cpp (c) Max Houghton 02.14.17 Roller Maze Project, ELEC2645, Univeristy of Leeds */ #include "Menu.h" // constructor function used when object is initialised Menu::Menu() { } // destructor function Menu::~Menu() { } void Menu::init() { // set all default game parameters _mazeIndex = 0; _control = true; _colour = true; } /// MAIN MENU METHOD /// void Menu::main(N5110 &lcd, Gamepad &pad, FXOS8700CQ &device, Sound &tune, Animations &animate) { int selected = 0; while(1) { char d = pad.get_direction(); if ((d == NW) || (d == N) || (d == NE)){ tune.playTone(pad, 196.00, 0.20); selected -= 1; } if ((d == SW) || (d == S) || (d == SE)){ tune.playTone(pad, 196.00, 0.20); selected += 1; } // lcd.printString("Testing", 0, 2); switch (selected) { case 1: lcd.clear(); lcd.printString(">Play game", 0, 0); lcd.printString(" Game options", 0, 1); lcd.printString(" LCD settings", 0, 2); lcd.printString(" Sound", 0, 3); lcd.refresh(); // either clicking joystick or pressing A selects function if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { tune.playTone(pad, 261.63, 0.20); playGame(lcd, pad, device, tune, _mazeIndex); // call the game function } wait_ms(250); // 250ms propogation delay break; case 2: lcd.clear(); lcd.printString(" Play game", 0, 0); lcd.printString(">Game options", 0, 1); lcd.printString(" LCD settings", 0, 2); lcd.printString(" Sound", 0, 3); lcd.refresh(); if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { tune.playTone(pad, 261.63, 0.20); options(lcd, pad, animate); } wait_ms(250); // 250ms propogation delay break; case 3: lcd.clear(); lcd.printString(" Play game", 0, 0); lcd.printString(" Game options", 0, 1); lcd.printString(">LCD settings", 0, 2); lcd.printString(" Sound", 0, 3); lcd.refresh(); if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { tune.playTone(pad, 261.63, 0.20); lcdSettings(lcd, pad); } wait_ms(250); // 250ms propogation delay break; case 4: lcd.clear(); lcd.printString(" Play game", 0, 0); lcd.printString(" Game options", 0, 1); lcd.printString(" LCD settings", 0, 2); lcd.printString(">Sound", 0, 3); lcd.refresh(); if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { tune.playTone(pad, 261.63, 0.20); soundSettings(lcd, pad); } wait_ms(250); // 250ms propogation delay break; default: selected = 1; break; } // printf("Joystick position = %c \n", d); // printf("Selected = %i \n", selected); } } /// INTRO LOOP /// void Menu::intro(N5110 &lcd, Gamepad &pad, Sound &tune, Animations &animate) { // printf("intro started \n"); while (pad.check_event(Gamepad::START_PRESSED) == false){ animate.intro(lcd, pad, tune); } } /// GAME LOOP /// void Menu::playGame(N5110 &lcd, Gamepad &pad, FXOS8700CQ &device, Sound &tune, int mazeIndex) { int exit = 0; int x; int y; int radius; _mazeIndex = mazeIndex; if (_mazeIndex == 0) { x = 40; // place ball in start of screen approx. y = 20; radius = 4; } else if (_mazeIndex == 1){ x = 3; y = 3; radius = 2; } else if (_mazeIndex == 2){ x = 4; y = 3; radius = 1; } _engine.init(_mazeIndex, // selects maze difficulty x, // defines starting x position for ball y, // defines starting y position for ball radius, // radius of ball _control, // control method _colour); // type of ball // printf out all game parameters printf("Game parameters: \nDifficulty = %i \n", _mazeIndex); printf("Ball position = (%i, %i)\n", x, y); printf("Ball radius = %i \n", radius); if (_colour){ printf("Ball colour = black \n"); } if (!_colour){ printf("Ball colour = transparent \n"); } if (_control){ printf("Control method: Joystick \n"); } if (!_control){ printf("Control method: Accelerometer \n"); } while (exit == 0){ _engine.readInput(pad, device); _engine.update(pad, lcd); // rendering screen lcd.clear(); _engine.draw(lcd); lcd.refresh(); wait_ms(100); // get direction of the joystick char d = pad.get_direction(); if (pad.check_event(Gamepad::BACK_PRESSED)){ exit++; } } } /// MENU FUNCTIONS /// void Menu::options(N5110 &lcd, Gamepad &pad, Animations &animate) { int exit = 0; int selected = 0; while(exit == 0) { // get direction of the joystick char d = pad.get_direction(); if ((d == NW) || (d == N) || (d == NE)){ selected -= 1; } if ((d == SW) || (d == S) || (d == SE)){ selected += 1; } // printf("While loop 1 \n"); // printf("Selected = %i \n", selected); switch (selected) { case 1: lcd.clear(); // displays options page with indicator on first lcd.printString("Game Options:", 0, 0); lcd.printString(">Difficulty", 0, 2); lcd.printString(" Ball Colour", 0, 3); lcd.printString(" Control", 0, 4); lcd.refresh(); if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { difficultyOptions(lcd, pad); } wait_ms(250); break; case 2: lcd.clear(); // displays options page with indicator on second lcd.printString("Game Options:", 0, 0); lcd.printString(" Difficulty", 0, 2); lcd.printString(">Ball Colour", 0, 3); lcd.printString(" Control", 0, 4); lcd.refresh(); // if second option selected if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { lcdColourOptions(lcd, pad); } wait_ms(250); break; case 3: lcd.clear(); // displays options page with indicator on first lcd.printString("Game Options:", 0, 0); lcd.printString(" Difficulty", 0, 2); lcd.printString(" Ball Colour", 0, 3); lcd.printString(">Control", 0, 4); lcd.refresh(); if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { controlOptions(lcd, pad, animate); } wait_ms(250); break; default: selected = 1; break; } if ((pad.check_event(Gamepad::BACK_PRESSED)) || (d == W)){ exit++; } } } void Menu::lcdSettings(N5110 &lcd, Gamepad &pad) { int exit = 0; int selected = 0; while(exit == 0) { char d = pad.get_direction(); if ((d == NW) || (d == N) || (d == NE)){ selected -= 1; } if ((d == SW) || (d == S) || (d == SE)){ selected += 1; } // printf("While loop 1 \n"); // printf("Selected = %i \n", selected); switch (selected) { case 1: lcd.clear(); // displays options page with indicator on first lcd.printString("LCD Settings:", 0, 0); lcd.printString(">Brightness", 0, 2); lcd.printString(" Invert Colour", 0, 3); lcd.refresh(); if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { lcdBackgroundColour(lcd, pad); } wait_ms(250); break; case 2: lcd.clear(); // displays options page with indicator on second lcd.printString("LCD Settings:", 0, 0); lcd.printString(" Brightness", 0, 2); lcd.printString(">Invert Colour", 0, 3); lcd.refresh(); // if second option selected if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { lcdInverseColour(lcd, pad); } wait_ms(250); break; default: selected = 1; break; } if ((pad.check_event(Gamepad::BACK_PRESSED)) || (d == W)){ exit++; } } } void Menu::soundSettings(N5110 &lcd, Gamepad &pad) { int selected = 0; int exit = 0; // pad.tone(750.0,0.1); while (exit == 0){ char d = pad.get_direction(); if ((d == NW) || (d == N) || (d == NE)){ selected -= 1; } if ((d == SW) || (d == S) || (d == SE)){ selected += 1; } switch (selected) { case 1: lcd.clear(); // displays options page with indicator on first lcd.printString("Sound Settings", 0, 0); lcd.printString(">Sound effects", 0, 2); lcd.printString(" Music", 0, 3); lcd.refresh(); if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { // soundEffects(lcd, pad); } wait_ms(250); break; case 2: lcd.clear(); // displays options page with indicator on second lcd.printString("Sound Settings", 0, 0); lcd.printString(" Sound effects", 0, 2); lcd.printString(">Music", 0, 3); lcd.refresh(); // if second option selected if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { // soundEffects(lcd, pad); } wait_ms(250); break; default: selected = 1; break; } if ((pad.check_event(Gamepad::BACK_PRESSED)) || (d == W)){ exit++; } } } void Menu::controlOptions(N5110 &lcd, Gamepad &pad, Animations &animate) { int selected = 0; int exit = 0; while (exit == 0){ char d = pad.get_direction(); if (d == W){ selected--; } if (d == E){ selected++; } switch(selected){ case 1: animateJoystick(lcd, pad, animate); break; case 2: animateGamepad(lcd, pad, animate); break; default: selected = 1; break; } if (pad.check_event(Gamepad::BACK_PRESSED)){ exit++; } } } void Menu::difficultyOptions(N5110 &lcd, Gamepad &pad) { int selected = 0; int exit = 0; while(exit == 0){ char d = pad.get_direction(); if ((d == NW) || (d == N) || (d == NE)){ selected -= 1; } if ((d == SW) || (d == S) || (d == SE)){ selected += 1; } switch(selected){ case 1: lcd.clear(); lcd.printString("Difficulty: ", 0, 0); lcd.printString(">Easy", 0, 2); lcd.printString(" Medium", 0, 3); lcd.printString(" Hard", 0, 4); lcd.printString(" Extreme", 0, 5); lcd.refresh(); wait_ms(250); // 250ms propogation delay if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { _mazeIndex = 0; lcd.clear(); lcd.printString("Easy mode", 0, 1); lcd.refresh(); wait(2); exit++; } break; case 2: lcd.clear(); lcd.printString("Difficulty: ", 0, 0); lcd.printString(" Easy", 0, 2); lcd.printString(">Medium", 0, 3); lcd.printString(" Hard", 0, 4); lcd.printString(" Extreme", 0, 5); lcd.refresh(); wait_ms(250); // 250ms propogation delay if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { _mazeIndex = 1; // maze.mazeIndex = 1; lcd.clear(); lcd.printString("Medium mode", 0, 1); lcd.refresh(); wait(2); exit++; } break; case 3: lcd.clear(); lcd.printString("Difficulty: ", 0, 0); lcd.printString(" Easy", 0, 2); lcd.printString(" Medium", 0, 3); lcd.printString(">Hard", 0, 4); lcd.printString(" Extreme", 0, 5); lcd.refresh(); wait_ms(250); // 250ms propogation delay if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { _mazeIndex = 3; lcd.clear(); lcd.printString("Hard mode", 0, 1); lcd.refresh(); wait(2); exit++; } break; case 4: lcd.clear(); lcd.printString("Difficulty: ", 0, 0); lcd.printString(" Easy", 0, 2); lcd.printString(" Medium", 0, 3); lcd.printString(" Hard", 0, 4); lcd.printString(">Extreme", 0, 5); lcd.refresh(); wait_ms(250); // 250ms propogation delay if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { _mazeIndex = 4; lcd.clear(); lcd.printString("Extreme mode", 0, 1); lcd.refresh(); wait(2); exit++; } break; default: selected = 1; break; } if ((pad.check_event(Gamepad::BACK_PRESSED)) || (d == W)){ exit++; } } } void Menu::lcdColourOptions(N5110 &lcd, Gamepad &pad) { int selected = 0; int exit = 0; while(exit == 0){ char d = pad.get_direction(); if ((d == NW) || (d == N) || (d == NE)){ selected -= 1; } if ((d == SW) || (d == S) || (d == SE)){ selected += 1; } switch(selected){ case 1: // printf("case 2.1"); lcd.clear(); lcd.printString("Ball colour: ", 0, 0); lcd.printString(">Outline", 0, 2); lcd.printString(" Solid", 0, 3); lcd.refresh(); wait_ms(250); // 250ms propogation delay if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { _colour = true; // shows ball rolling across the screen for (int i = 0; i < 100; i++){ lcd.clear(); lcd.printString(" Outline ", 0, 1); lcd.drawCircle(i, 32, 8, FILL_TRANSPARENT); lcd.refresh(); wait_ms(40); } // wait(2); exit++; } break; case 2: // printf("case 2.2"); lcd.clear(); lcd.printString("Ball colour: ", 0, 0); lcd.printString(" Outline", 0, 2); lcd.printString(">Solid", 0, 3); lcd.refresh(); wait_ms(250); // 250ms propogation delay if ((pad.check_event(Gamepad::A_PRESSED) || pad.check_event(Gamepad::JOY_PRESSED)) || (d == E)) { _colour = false; // shows ball rolling across the screen for (int i = 0; i < 100; i++){ lcd.clear(); lcd.printString(" Solid ", 0, 1); lcd.drawCircle(i, 32, 8, FILL_BLACK); lcd.refresh(); wait_ms(40); } } exit++; break; default: selected = 1; break; } if ((pad.check_event(Gamepad::BACK_PRESSED)) || (d == W)){ exit++; } } } void Menu::lcdInverseColour(N5110 &lcd, Gamepad &pad) { int exit = 0; while (exit == 0) { lcd.clear(); lcd.printString("Press A to", 0, 0); lcd.printString("invert colours", 0, 1); lcd.printString("Press B to", 0, 3); lcd.printString("revert to", 0, 4); lcd.printString("normal", 0, 5); if (pad.check_event(Gamepad::A_PRESSED)){ lcd.inverseMode(); } if (pad.check_event(Gamepad::B_PRESSED)){ lcd.normalMode(); } lcd.refresh(); char d = pad.get_direction(); if ((pad.check_event(Gamepad::BACK_PRESSED)) || (d == W)){ exit++; } } } void Menu::lcdBackgroundColour(N5110 &lcd, Gamepad &pad) { // method to change the brightness of the LED backlight int exit = 0; while (exit == 0) { lcd.clear(); lcd.printString("BRIGHTNESS", 0, 0); lcd.printString("Use DIAL --->", 0, 1); lcd.printString("to adjust", 0, 2); double brightness = pad.read_pot(); // returns value between 0.0 - 1.0 lcd.setBrightness(brightness); lcd.refresh(); int width = brightness * 40; lcd.drawRect(10, 30, 41, 8, FILL_TRANSPARENT); lcd.drawRect(11, 31, width, 6, FILL_BLACK); lcd.refresh(); wait_ms(10); char d = pad.get_direction(); if ((pad.check_event(Gamepad::BACK_PRESSED)) || (d == W)){ exit++; } } } void Menu::animateJoystick(N5110 &lcd, Gamepad &pad, Animations &animate) { int exit = 0; while (exit == 0){ char d = pad.get_direction(); lcd.clear(); lcd.printString("Control: ", 0, 0); lcd.printString(" Joystick ", 0, 2); lcd.printString(" >", 0, 3); animate.drawLeftJoystick(lcd); lcd.refresh(); lcd.clear(); wait_ms(500); if (pad.check_event(Gamepad::A_PRESSED)|| pad.check_event(Gamepad::JOY_PRESSED)){ _control = true; lcd.clear(); lcd.printString(" JOYSTICK ", 0, 1); lcd.printString(" SELECTED ", 0, 2); lcd.refresh(); wait(1); return; } if (d == E){ exit++; } lcd.clear(); lcd.printString("Control: ", 0, 0); lcd.printString(" Joystick ", 0, 2); lcd.printString(" >", 0, 3); animate.drawVerticalJoystick(lcd); lcd.refresh(); wait_ms(500); if (pad.check_event(Gamepad::A_PRESSED)|| pad.check_event(Gamepad::JOY_PRESSED)){ _control = true; lcd.clear(); lcd.printString(" JOYSTICK ", 0, 1); lcd.printString(" SELECTED ", 0, 2); lcd.refresh(); wait(1); return; } if (d == E){ exit++; } lcd.clear(); lcd.printString("Control: ", 0, 0); lcd.printString(" Joystick ", 0, 2); lcd.printString(" >", 0, 3); animate.drawRightJoystick(lcd); lcd.refresh(); wait_ms(500); if (pad.check_event(Gamepad::A_PRESSED)|| pad.check_event(Gamepad::JOY_PRESSED)){ _control = true; lcd.clear(); lcd.printString(" JOYSTICK ", 0, 1); lcd.printString(" SELECTED ", 0, 2); lcd.refresh(); wait(1); return; } if (d == E){ exit++; } lcd.clear(); lcd.printString("Control: ", 0, 0); lcd.printString(" Joystick ", 0, 2); lcd.printString(" >", 0, 3); animate.drawVerticalJoystick(lcd); lcd.refresh(); wait_ms(500); if (pad.check_event(Gamepad::A_PRESSED)|| pad.check_event(Gamepad::JOY_PRESSED)){ _control = true; lcd.clear(); lcd.printString(" JOYSTICK ", 0, 1); lcd.printString(" SELECTED ", 0, 2); lcd.refresh(); wait(1); return; } if (d == E){ return; } } } void Menu::animateGamepad(N5110 &lcd, Gamepad &pad, Animations &animate) { int exit = 0; while (exit == 0){ char d = pad.get_direction(); if (d == W){ exit++; } lcd.clear(); lcd.printString("Control: ", 0, 0); lcd.printString(" Gamepad ", 0, 2); lcd.printString("< ", 0, 3); animate.drawLeftGamepad(lcd); lcd.refresh(); lcd.clear(); wait_ms(500); if (d == W){ exit++; } if (pad.check_event(Gamepad::A_PRESSED)|| pad.check_event(Gamepad::JOY_PRESSED)){ _control = false; lcd.clear(); lcd.printString(" TILT ", 0, 1); lcd.printString(" SELECTED ", 0, 2); lcd.refresh(); wait(2); return; } if (d == W){ exit++; } lcd.clear(); lcd.printString("Control: ", 0, 0); lcd.printString(" Gamepad ", 0, 2); lcd.printString("< ", 0, 3); animate.drawVerticalGamepad(lcd); lcd.refresh(); wait_ms(500); if (d == W){ exit++; } if (pad.check_event(Gamepad::A_PRESSED)|| pad.check_event(Gamepad::JOY_PRESSED)){ _control = false; lcd.clear(); lcd.printString(" TILT ", 0, 1); lcd.printString(" SELECTED ", 0, 2); lcd.refresh(); wait(1); return; } if (d == W){ exit++; } if (pad.check_event(Gamepad::A_PRESSED)|| pad.check_event(Gamepad::JOY_PRESSED)){ _control = false; lcd.clear(); lcd.printString(" TILT ", 0, 1); lcd.printString(" SELECTED ", 0, 2); lcd.refresh(); wait(1); return; } if (d == W){ exit++; } lcd.clear(); lcd.printString("Control: ", 0, 0); lcd.printString(" Gamepad ", 0, 2); lcd.printString("< ", 0, 3); animate.drawRightGamepad(lcd); lcd.refresh(); wait_ms(500); if (d == W){ exit++; } if (pad.check_event(Gamepad::A_PRESSED)|| pad.check_event(Gamepad::JOY_PRESSED)){ _control = false; lcd.clear(); lcd.printString(" TILT ", 0, 1); lcd.printString(" SELECTED ", 0, 2); lcd.refresh(); wait(1); return; } if (d == W){ exit++; } lcd.clear(); lcd.printString("Control: ", 0, 0); lcd.printString(" Gamepad ", 0, 2); lcd.printString("< ", 0, 3); animate.drawVerticalGamepad(lcd); lcd.refresh(); wait_ms(500); if (d == W){ exit++; } if (pad.check_event(Gamepad::A_PRESSED)|| pad.check_event(Gamepad::JOY_PRESSED)){ _control = false; lcd.clear(); lcd.printString(" TILT ", 0, 1); lcd.printString(" SELECTED ", 0, 2); lcd.refresh(); wait(1); return; } if (d == W){ exit++; } } }