ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el19tb

Dependencies:   mbed

Revision:
50:9ffeb4a10c0a
Parent:
49:6cad8b6ec5f2
Child:
51:4c1f49729d88
--- a/Frogger/Frogger.cpp	Sun May 24 02:30:49 2020 +0000
+++ b/Frogger/Frogger.cpp	Mon May 25 02:18:57 2020 +0000
@@ -9,6 +9,15 @@
     initializeParams(w, h, grid); // initialize the software parameters
     initializeEmbeddedSystem(); // initialize the hardware paramaters
     setupLevelOne();
+
+    intro.selection = 0;
+    intro.tutorial_screens = 0;
+
+    introScreen = true;
+    nextLevel = false;
+    play_game = false;
+    tutorial = false;
+    settings = false;
 }
 
 GraphicEngine graphics;
@@ -18,12 +27,14 @@
     // screen sizes
     lcd_w = w; // width
     lcd_h = h; // height
-    state_frog = 0 ;
+    state_frog = 0;
+    end_post = false;
     
     water_level = 48- 4*6; // row 7 and up is the water level
     frogDie = false;
     frogOnLog = false;
-    
+    goal_post_xpos = (84/2); // generate random position for end post
+    next_goal = false;
     // grid values
     grid = 4; // size of game grid system
     grid_width = 22; // size of screen width in grid units
@@ -94,33 +105,209 @@
     while(1) {
         graphics.clear(); // clear the lcd screen
         
-        graphics.drawDangerZone();
-        graphics.drawSafetyLanes();
-        graphics.drawEndPost();
-        process_input(); // user controls the frog object   
-        
-        if(frog->y >= water_level)
-        {
-            frogDie = false;
-            runCurrentLevel(); // add velocity to level vehicles and logs
-
-        } else {
-            frogDie = true;
-            runCurrentLevel(); // add velocity to level vehicles and logs
+        if(introScreen) { // shows tutorial, setting
+            graphics.getPointerPos(intro.selection); // draw the initial pointer pos
+            home(); // draw menu selections
+        } else if (play_game) { // shows actual gameplay
+            run();
             
-            if(!frogOnLog){
-                graphics.print();
-            }
-        }
-
-        graphics.showFrog(frog->x, frog->y, frog->width, frog->height, state_frog); // display current position of frog
-
+        } else if(tutorial) {
+            gotoPage();
+            
+        } else if(nextLevel) {
+            displayLevelIntro();
+        } 
+         
         graphics.refresh(); // refresh the lcd screen
         
         wait_ms(85); // fpms
     } 
 }
 
+void Frogger::displayLevelIntro()
+{
+    graphics.clear();
+    graphics.newLevel1();
+    wait_ms(1000);   
+    graphics.refresh(); // refresh the lcd screen
+        
+    graphics.refresh(); // refresh the lcd screen
+    graphics.clear();
+    graphics.newLevel2();
+    wait_ms(1000); 
+    graphics.refresh(); // refresh the lcd screen
+
+    graphics.refresh(); // refresh the lcd screen
+    graphics.clear();
+    graphics.newLevelIntro();
+    wait_ms(1000);
+    graphics.refresh(); // refresh the lcd screen
+}
+
+void Frogger::run()
+{
+    checkProgression();   
+
+    drawBackGround();
+        
+    generateLevelOneGoalPost();
+            
+    process_input(); // user controls the frog object
+       
+    actOnFrogPos();
+        
+    graphics.showFrog(frog->x, frog->y, frog->width, frog->height, state_frog); // display current position of frog 
+}
+
+void Frogger::checkProgression()
+{ 
+//frog->x > 80 && frog->x < 90 && 
+ if((frog->y == 48 - 4*11 || frog->y == 48 - 4*10)){
+        exit(1);
+    }
+   
+}
+
+/*
+void Frogger::goalReached()
+{
+  if(!(frog->up >= goal_post->rectangle.bottom ||
+    (frog->right_side <= goal_post->rectangle.left_side)  ||
+    (frog->down <= goal_post->rectangle.up) ||
+    (frog->left_side >= goal_post->rectangle.right_side))) {
+        next_goal = true;
+    } 
+}*/
+
+void Frogger::actOnFrogPos()
+{
+    if(frog->y >= water_level)
+    {
+        frogDie = false;
+        runCurrentLevel(); // add velocity to level vehicles and logs
+
+    } else {
+        frogDie = true;
+        runCurrentLevel(); // add velocity to level vehicles and logs
+            
+        if((!frogOnLog) && frog->y != (48 - 4*10)){
+            frog->reset();
+        }
+    }
+}
+
+void Frogger::home()
+{
+    determineSelection();
+    graphics.drawMenu();   
+}
+
+void Frogger::determineSelection()
+{
+   if(intro.selection < 2 && gamepad.B_pressed()){
+        graphics.getPointerPos(intro.selection++);
+
+    } else if(intro.selection > 0 && gamepad.X_pressed()){
+        graphics.getPointerPos(intro.selection--);
+    }
+    
+    wait_ms(10);
+
+    if(gamepad.A_pressed())
+    {
+        gotoPage();
+    }
+
+}
+
+void Frogger::gotoPage()
+{
+    switch(intro.selection)
+    {
+        case 0:
+            play_game = true;
+            
+            introScreen = false;
+            tutorial = false;
+            settings = false;
+            break;
+        case 1:
+            displayTutorial();
+            play_game = false;  
+            introScreen = false;
+            tutorial = true;
+            settings = false;
+            break;
+        case 2:
+            //settings();
+            break;
+    }
+}
+
+void Frogger::displayTutorial()
+{
+    wait_ms(15);  
+
+    switch(intro.tutorial_screens)
+    {
+        case 0:
+            graphics.drawTutor1();
+            gotoNextTutorialSlide();
+            break;
+        case 1:
+            graphics.drawTutor2();
+            gotoNextTutorialSlide();
+            break;
+        case 2:
+            graphics.drawTutor3();
+            gotoNextTutorialSlide();
+            break;
+        default:
+            home();
+            intro.selection = 0;            
+    }
+}
+
+void Frogger::gotoNextTutorialSlide()
+{
+    if(gamepad.A_pressed()){
+        intro.tutorial_screens++;
+        wait_ms(25);  
+    }
+    
+    if(intro.tutorial_screens > 2){
+        intro.tutorial_screens = 7;
+        tutorial = false;
+    }
+}
+
+void Frogger::drawBackGround()
+{
+    graphics.drawDangerZone();
+    graphics.drawSafetyLanes(); 
+}
+
+void Frogger::generateLevelOneGoalPost()
+{
+    //setUpGoalPost();
+    graphics.drawEndPost(goal_post_xpos);
+}
+
+/*
+void Frogger::setUpGoalPost()
+{
+    int y = (48 - 4*11);
+    goal_post->rectangle.left_side = goal_post_xpos;
+    goal_post->rectangle.right_side = 12 + goal_post_xpos;
+    goal_post->rectangle.up = 8;
+    goal_post->rectangle.bottom = 8 + y; 
+}
+*/
+int Frogger::randEndPost()
+{
+    return (rand() % 80) + 12;      
+}
+
 void Frogger::process_input() 
 {
     //determine the input 
@@ -143,6 +330,8 @@
         moveFrog(-1,0);
         frogOnLog = false;
     } 
+    
+    wait_ms(10);
 }
 
 void Frogger::drawFrogStates()
@@ -234,7 +423,7 @@
 {
     if(frog->y < water_level) // if the frog is past the safety lane
     {
-        frogDie = true; // frog will die if not on turtle/log
+       frogDie = true; // frog will die if not on turtle/log
     } else {
         frogDie = false;   
     }
@@ -292,21 +481,6 @@
     }
 }
 
-/*
-void Frogger::checkCurrentLevelCollision()
-{
-    switch (current_level)
-    {
-        case 1:
-            level->levelOneCollision();
-            break;
-        case 2:
-            level->levelTwoCollision();
-            break;
-    }
-}
-*/
-
 void Frogger::checkCollison(Object object)
 {
     if(!(frog->up >= object.rectangle.bottom ||
@@ -314,14 +488,14 @@
     (frog->down <= object.rectangle.up) ||
     (frog->left_side >= object.rectangle.right_side))) {
         moveFrogWithLog(object);
-        checkFrogAction(object); // check to do what do with frog based on height
+        checkFrogAction(object); // check to do what do with frog based on height    
     }
 }
 
 void Frogger::checkFrogReachedRiver()
 {
     if(frog->y < water_level) {
-        frogDie = true; // frog can die if it touches water
+       frogDie = true; // frog can die if it touches water
     } else {
         frogDie = false;
     }
@@ -331,7 +505,7 @@
 {
     if(frog->y < water_level) { // frog is in water zone
         frogOnLog = true; // moving same speed as log
-        //frogDie = false;
+        frogDie = false;
 
     } else { // frog is on the road 
         state_frog = 0; // facing upward
@@ -341,21 +515,25 @@
         frogOnLog = false;
         frogDie = false;
     }
+    
+    if(frog->y == (48 - (4*10)))
+    {
+        end_post = true;   
+    }
 }
 
 void Frogger::moveFrogWithLog(Object log)
 {
-    if(log.seperation != 0){
-        switch (log.object.dir)
-        {
-            case 1:
-                frog->x += log.speed;
-                break;
+    switch (log.object.dir)
+    {
+        case 1:
+            frog->x += log.speed;
+            break;
                 
-            case 2:
-                frog->x = frog->x - log.speed;
-                break;
-        } 
+        case 2:
+            frog->x = frog->x - log.speed;
+            break;
+        
     }
 }