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.

Revision:
3:a79daa7c2b55
Parent:
2:917211a4551b
Child:
4:4f20bcef2c0c
--- a/Menu.cpp	Fri Apr 07 10:28:49 2017 +0000
+++ b/Menu.cpp	Sun Apr 16 12:31:48 2017 +0000
@@ -21,28 +21,16 @@
     
 }
 
-void Menu::init(int mazeIndex)
+void Menu::init()
 {
-    _mazeIndex = mazeIndex;
-    
-    _engine.init(_mazeIndex, 4, 4, 4);
-    
-    /*
-    if ((_mazeIndex == 0) ||
-        (_mazeIndex == 1)) {
-        
-        _engine.init(_mazeIndex, 4, 4, 4);
-    }
-    
-    else {
-        _engine.init(_mazeIndex, 2, 2, 2);
-    }
-     */
+    // set all default game parameters
+    _mazeIndex = 0;
+    _control = true;
+    _colour = true;
 }
 
 /// MAIN MENU METHOD ///
-
-void Menu::main(N5110 &lcd, Gamepad &pad, FXOS8700CQ &device)
+void Menu::main(N5110 &lcd, Gamepad &pad, FXOS8700CQ &device, Sound &tune, Animations &animate)
 {
     int selected = 0;
     
@@ -54,6 +42,7 @@
             (d == N)  ||
             (d == NE)){
             
+            tune.playTone(pad, 196.00, 0.20);
             selected -= 1;
         }
         
@@ -61,6 +50,7 @@
             (d == S)  ||
             (d == SE)){
             
+            tune.playTone(pad, 196.00, 0.20);
             selected += 1;
         }
         
@@ -82,7 +72,8 @@
                       pad.check_event(Gamepad::JOY_PRESSED))  ||
                      (d == E)) {
                     
-                    playGame(_mazeIndex, lcd, pad, device); // call the game function
+                    tune.playTone(pad, 261.63, 0.20);
+                    playGame(lcd, pad, device, tune, _mazeIndex); // call the game function
                 }
                 
                 wait_ms(250);    // 250ms propogation delay
@@ -104,7 +95,8 @@
                       pad.check_event(Gamepad::JOY_PRESSED))  ||
                      (d == E)) {
                     
-                    options(lcd, pad);
+                    tune.playTone(pad, 261.63, 0.20);
+                    options(lcd, pad, animate);
                 }
                 
                 wait_ms(250);    // 250ms propogation delay
@@ -126,6 +118,7 @@
                       pad.check_event(Gamepad::JOY_PRESSED))  ||
                      (d == E)) {
                     
+                    tune.playTone(pad, 261.63, 0.20);
                     lcdSettings(lcd, pad);
                 }
                 
@@ -148,6 +141,7 @@
                       pad.check_event(Gamepad::JOY_PRESSED))  ||
                      (d == E)) {
                     
+                    tune.playTone(pad, 261.63, 0.20);
                     soundSettings(lcd, pad);
                 }
                 
@@ -169,167 +163,80 @@
 }
 
 /// INTRO LOOP ///
-
-void intro(N5110 &lcd, Gamepad &pad)
+void Menu::intro(N5110 &lcd, Gamepad &pad, Sound &tune, Animations &animate)
 {
-    
     // printf("intro started \n");
     while (pad.check_event(Gamepad::START_PRESSED) == false){
         
-        // animation sequence
-        // lcd.drawCircle(x, y, radius, type);
-        
-        // DRAW FIRST SEQUENCE OF CIRLCES MOVING ACROSS LCD //
-        for (int i = 0; i < 61; i++){
-            
-            lcd.clear();
-            lcd.printString("  Welcome to  ", 0, 1);
-            lcd.printString("  Roller Maze ", 0, 2);
-            // printf("loop \n");
-            lcd.drawLine(56, 40, 68, 40, FILL_BLACK);
-            lcd.drawLine(56, 41, 68, 41, FILL_BLACK);
-            lcd.refresh();
-            
-            if (i < 57){
-                lcd.drawCircle(i, 36, 4, FILL_BLACK);
-                lcd.refresh();
-                wait_ms(50);
-                
-            }
-            
-            else if (i == 57){
-                
-                lcd.clear();
-                lcd.printString("  Welcome to  ", 0, 1);
-                lcd.printString("  Roller Maze ", 0, 2);
-                // printf("loop \n");
-                lcd.drawLine(56, 40, 68, 40, FILL_BLACK);
-                lcd.drawLine(56, 41, 68, 41, FILL_BLACK);
-                lcd.drawCircle(i, 37, 4, FILL_BLACK);
-                
-                wait_ms(25);
-                
-                for (int c = 55; c < 68; c++){
-                    for (int d = 42; d < 47; d++){
-                        
-                        lcd.clearPixel(c, 42);
-                        lcd.clearPixel(c, 43);
-                        lcd.clearPixel(c, 44);
-                        lcd.clearPixel(c, 45);
-                        lcd.clearPixel(c, 46);
-                        lcd.clearPixel(c, 47);
-                        lcd.refresh();
-                        
-                    }
-                }
-                
-                lcd.refresh();
-            }
-            else if (i == 58){
-                
-                lcd.clear();
-                lcd.printString("  Welcome to  ", 0, 1);
-                lcd.printString("  Roller Maze ", 0, 2);
-                // printf("loop \n");
-                lcd.drawLine(56, 40, 68, 40, FILL_BLACK);
-                lcd.drawLine(56, 41, 68, 41, FILL_BLACK);
-                lcd.drawCircle(i, 38, 4, FILL_BLACK);
-                
-                wait_ms(25);
-                
-                for (int c = 55; c < 68; c++){
-                    for (int d = 42; d < 47; d++){
-                        
-                        lcd.clearPixel(c, 42);
-                        lcd.clearPixel(c, 43);
-                        lcd.clearPixel(c, 44);
-                        lcd.clearPixel(c, 45);
-                        lcd.clearPixel(c, 46);
-                        lcd.clearPixel(c, 47);
-                        lcd.refresh();
-                        
-                    }
-                }
-                
-                lcd.refresh();
-                
-            }
-            else if (i == 59){
-                
-                lcd.clear();
-                lcd.printString("  Welcome to  ", 0, 1);
-                lcd.printString("  Roller Maze ", 0, 2);
-                // printf("loop \n");
-                lcd.drawLine(56, 40, 68, 40, FILL_BLACK);
-                lcd.drawLine(56, 41, 68, 41, FILL_BLACK);
-                lcd.drawCircle(i, 39, 4, FILL_BLACK);
-                
-                wait_ms(25);
-                
-                for (int c = 55; c < 68; c++){
-                    for (int d = 42; d < 47; d++){
-                        
-                        lcd.clearPixel(c, 42);
-                        lcd.clearPixel(c, 43);
-                        lcd.clearPixel(c, 44);
-                        lcd.clearPixel(c, 45);
-                        lcd.clearPixel(c, 46);
-                        lcd.clearPixel(c, 47);
-                        lcd.refresh();
-                        
-                    }
-                }
-                
-                lcd.refresh();
-                
-            }
-            else {
-                
-                for (int j = 40; j < 48; j++){
-                    
-                    lcd.clear();
-                    lcd.printString("  Welcome to  ", 0, 1);
-                    lcd.printString("  Roller Maze ", 0, 2);
-                    // printf("loop \n");
-                    lcd.drawLine(56, 40, 68, 40, FILL_BLACK);
-                    lcd.drawLine(56, 41, 68, 41, FILL_BLACK);
-                    lcd.drawCircle(i, j, 4, FILL_BLACK);
-                    
-                    wait_ms(125);
-                    
-                    for (int c = 55; c < 68; c++){
-                        for (int d = 42; d < 47; d++){
-                            
-                            lcd.clearPixel(c, 42);
-                            lcd.clearPixel(c, 43);
-                            lcd.clearPixel(c, 44);
-                            lcd.clearPixel(c, 45);
-                            lcd.clearPixel(c, 46);
-                            lcd.clearPixel(c, 47);
-                        }
-                    }
-                    
-                }
-                
-                lcd.refresh();
-            }
-            
-            // printf("%i \n", i);
-        }
+        animate.intro(lcd, pad, tune);
     }
-    
-    
 }
 
 /// GAME LOOP ///
-void playGame(N5110 &lcd, Gamepad &pad, FXOS8700CQ &device)
+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);
+        _engine.update(pad, lcd);
+        
         // rendering screen
         lcd.clear();
         _engine.draw(lcd);
@@ -339,17 +246,15 @@
         
         // get direction of the joystick
         char d = pad.get_direction();
-        if ((pad.check_event(Gamepad::BACK_PRESSED)) ||
-            (d == W)){
+        if (pad.check_event(Gamepad::BACK_PRESSED)){
             
-            exit = 1;
+            exit++;
         }
     }
 }
 
 /// MENU FUNCTIONS ///
-
-void Menu::options(N5110 &lcd, Gamepad &pad)
+void Menu::options(N5110 &lcd, Gamepad &pad, Animations &animate)
 {
     int exit = 0;
     int selected = 0;
@@ -384,6 +289,7 @@
                 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)     ||
@@ -404,6 +310,7 @@
                 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
@@ -418,6 +325,28 @@
                 
                 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;
@@ -428,7 +357,7 @@
         if ((pad.check_event(Gamepad::BACK_PRESSED)) ||
             (d == W)){
             
-            exit = 1;
+            exit++;
         }
     }
 }
@@ -473,7 +402,6 @@
                       pad.check_event(Gamepad::JOY_PRESSED))  ||
                      (d == E)) {
                     
-                    
                     lcdBackgroundColour(lcd, pad);
                 }
                 
@@ -490,13 +418,11 @@
                 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);
                 }
                 
@@ -514,7 +440,7 @@
         if ((pad.check_event(Gamepad::BACK_PRESSED)) ||
             (d == W)){
             
-            exit = 1;
+            exit++;
         }
         
     }
@@ -524,92 +450,120 @@
 
 void Menu::soundSettings(N5110 &lcd, Gamepad &pad)
 {
-    
+    int selected = 0;
     int exit = 0;
     // pad.tone(750.0,0.1);
     
     while (exit == 0){
         
-        lcd.clear();
-        lcd.printString("Sound settings", 0, 2);
-        lcd.refresh();
+        char d = pad.get_direction();
+        
+        if ((d == NW) ||
+            (d == N)  ||
+            (d == NE)){
+            
+            selected -= 1;
+        }
+        
+        if ((d == SW) ||
+            (d == S)  ||
+            (d == SE)){
+            
+            selected += 1;
+        }
+        
         
-        char d = pad.get_direction();
+        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 = 1;
+            exit++;
         }
     }
     
 }
 
-void Menu::controlOptions(N5110 &lcd, Gamepad &pad)
+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 -= 1;
+            selected--;
         }
         
         if (d == E){
             
-            selected += 1;
+            selected++;
+            
         }
         
         switch(selected){
                 
             case 1:
                 
-                while (selected == 0){
-                    
-                    lcd.clear();
-                    lcd.printString("Control: ", 0, 0);
-                    lcd.printString("   Joystick", 0, 2);
-                    
-                    lcd.refresh();
-                    wait_ms(250);   // 250ms propogation delay
-                    
-                    if (pad.check_event(Gamepad::A_PRESSED)||
-                        pad.check_event(Gamepad::JOY_PRESSED)){
-                        
-                        CONTROL = true;
-                    }
-                    
-                    break;
-                    
-                }
+                animateJoystick(lcd, pad, animate);
+                
+                break;
                 
                 
             case 2:
                 
-                lcd.clear();
-                lcd.printString("Difficulty: ", 0, 0);
-                lcd.printString(" Easy", 0, 2);
-                lcd.printString(">Hard", 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)) {
-                    
-                    
-                    // maze.mazeIndex = 1;
-                    lcd.clear();
-                    lcd.printString("Hard mode", 0, 1);
-                    lcd.refresh();
-                    wait(2);
-                    
-                    exit = 1;
-                }
+                animateGamepad(lcd, pad, animate);
                 
                 break;
                 
@@ -623,7 +577,7 @@
         
         if (pad.check_event(Gamepad::BACK_PRESSED)){
             
-            exit = 1;
+            exit++;
         }
         
     }
@@ -660,7 +614,9 @@
                 lcd.clear();
                 lcd.printString("Difficulty: ", 0, 0);
                 lcd.printString(">Easy", 0, 2);
-                lcd.printString(" Hard", 0, 3);
+                lcd.printString(" Medium", 0, 3);
+                lcd.printString(" Hard", 0, 4);
+                lcd.printString(" Extreme", 0, 5);
                 lcd.refresh();
                 
                 wait_ms(250);   // 250ms propogation delay
@@ -676,7 +632,7 @@
                     lcd.refresh();
                     wait(2);
                     
-                    exit = 1;
+                    exit++;
                 }
                 
                 break;
@@ -686,9 +642,12 @@
                 lcd.clear();
                 lcd.printString("Difficulty: ", 0, 0);
                 lcd.printString(" Easy", 0, 2);
-                lcd.printString(">Hard", 0, 3);
+                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)     ||
@@ -699,15 +658,75 @@
                     
                     // 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 = 1;
+                    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;
@@ -719,7 +738,7 @@
         if ((pad.check_event(Gamepad::BACK_PRESSED)) ||
             (d == W)){
             
-            exit = 1;
+            exit++;
         }
         
     }
@@ -768,13 +787,22 @@
                       pad.check_event(Gamepad::JOY_PRESSED))  ||
                      (d == E)) {
                     
-                    // ball.ballColour = 0;
-                    lcd.clear();
-                    lcd.printString("Outline", 0, 1);
-                    lcd.refresh();
-                    wait(2);
+                    _colour = true;
                     
-                    exit = 1;
+                    // 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;
@@ -796,15 +824,23 @@
                       pad.check_event(Gamepad::JOY_PRESSED))  ||
                      (d == E)) {
                     
-                    // ball.ballColour = 1;
-                    lcd.clear();
-                    lcd.printString("Solid", 0, 1);
-                    lcd.refresh();
-                    wait(2);
+                    _colour = false;
                     
-                    exit = 1;
+                    // 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:
@@ -817,7 +853,7 @@
         if ((pad.check_event(Gamepad::BACK_PRESSED)) ||
             (d == W)){
             
-            exit = 1;
+            exit++;
         }
     }
     
@@ -856,7 +892,7 @@
         if ((pad.check_event(Gamepad::BACK_PRESSED)) ||
             (d == W)){
             
-            exit = 1;
+            exit++;
         }
     }
     
@@ -893,72 +929,292 @@
         if ((pad.check_event(Gamepad::BACK_PRESSED)) ||
             (d == W)){
             
-            exit = 1;
+            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::animateJoystick(N5110 &lcd)
-{
-    drawVerticalJoystick(lcd);
-    
-}
-
-
-void Menu::drawVerticalJoystick(N5110 &lcd)
+void Menu::animateGamepad(N5110 &lcd, Gamepad &pad, Animations &animate)
 {
-    /* Drawing a vertical joystick image
-     
-     33             ####
-     34         ############
-     35       ################
-     36              ##
-     37              ##
-     38           ########
-     39       ################
-     40    ######################
-     41   ########################
-     42  ##########################
-     43  ##########################
-     44  23456789012345678901234567
-     3       4         5
-     
-     */
+    int exit = 0;
     
-    for (int i = 32; i < 58; i++){
-        lcd.setPixel(i, 43);
-        lcd.setPixel(i, 42);
-    }
-    for (int i = 33; i < 57; i++){
-        lcd.setPixel(i, 41);
-    }
-    for (int i = 34; i < 56; i++){
-        lcd.setPixel(i, 40);
-    }
-    for (int i = 37; i < 54; i++){
-        lcd.setPixel(i, 39);
-    }
-    for (int i = 41; i < 49; i++){
-        lcd.setPixel(i, 38);
-    }
-    
-    lcd.setPixel(44, 37);
-    lcd.setPixel(45, 37);
-    lcd.setPixel(44, 36);
-    lcd.setPixel(45, 36);
-    
-    for (int i = 37; i < 54; i++){
-        lcd.setPixel(i, 35);
-    }
-    for (int i = 39; i < 52; i++){
-        lcd.setPixel(i, 34);
-    }
-    for (int i = 43; i < 47; i++){
-        lcd.setPixel(i, 33);
+    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++;
+        }
     }
 }
 
 
-
-