Joe Shotton / Mbed 2 deprecated ELEC2645_Project_ll16j23s

Dependencies:   mbed ll16j23s_test_docs

Revision:
7:dd84e0fab346
Parent:
6:6c9453397f4a
Child:
8:bcc3403d7e79
--- a/SnakeEngine/SnakeEngine.cpp	Sat May 23 20:01:00 2020 +0000
+++ b/SnakeEngine/SnakeEngine.cpp	Sun May 24 22:18:55 2020 +0000
@@ -1,9 +1,11 @@
 #include "SnakeEngine.h"
 
-SnakeEngine::SnakeEngine()
-{
-//constructor
+SnakeEngine::SnakeEngine() {
+    //constructor
     score = 0;
+    _menu_select = 1;
+    _map = 1;
+    _game_state = 1;
 }
 
 SnakeEngine::~SnakeEngine()
@@ -23,57 +25,114 @@
     }
 }
 */
-void SnakeEngine::init(FXOS8700CQ &mag){
+void SnakeEngine::game_init(Gamepad &pad, N5110 &lcd, FXOS8700CQ &mag){
     _food.init(mag);
     _body.init();
-    //_food.rand_pos(_food._x, _food._y);
-}
+    _food.rand_pos(pad);
+    transition_black(lcd);
+    transition_white(lcd);
+} 
+
 
-void SnakeEngine::move_body(Gamepad &pad, N5110 &lcd, bool &death){
+void SnakeEngine::game_run(Gamepad &pad, N5110 &lcd){
+    //input???
+    move_body(pad, lcd);
+    map();
+    //snake-snake collision
+    //snake-wall collision 
+    snake_food_collision(pad, _body._length);  
+} 
+
+
+void SnakeEngine::move_body(Gamepad &pad, N5110 &lcd){
     _body.snake_movement(pad);
     _body.draw_body(lcd);
     //printf("Moving!");
     _food.do_food(lcd);
     snake_food_collision(pad, _body._length);
     if (_body._state > 0){
-        _body.snake_snake_collision(pad, death);
+        _body.snake_snake_collision(pad);
     }
-}
+} 
 
 void SnakeEngine::snake_food_collision(Gamepad &pad, int &_length) {
     if (_food._x == _body._x_head && _food._y == _body._y_head){
         //printf("FOOD!");
-    _food.rand_pos(pad, _food._x, _food._y);
+    _food.rand_pos(pad);
     pad.led(3,0.9);
     _length += 5;
     score++;
     }
 }
 
+void SnakeEngine::map() {
+    
+    switch(_map) {
+      case 2:
+         break;
+      case 3:
+         break;
+      case 4:
+         break;
+    }
+}
+
+void SnakeEngine::draw_map2(N5110 &lcd){
+       lcd.drawRect(0, 0, 84, 48,FILL_TRANSPARENT);
+       lcd.drawRect(1, 1, 82, 46,FILL_TRANSPARENT);
+}
+
+void SnakeEngine::draw_map3(N5110 &lcd){
+        lcd.drawRect(40, 0, 4, 16,FILL_BLACK);
+        lcd.drawRect(40, 32, 4, 16,FILL_BLACK);
+        lcd.drawRect(0, 21, 16, 4,FILL_BLACK);
+        lcd.drawRect(68, 21, 16, 4,FILL_BLACK);
+}
+
+void SnakeEngine::draw_map4(N5110 &lcd){
+        lcd.drawRect(12, 8, 4, 4,FILL_BLACK); //NW square
+        lcd.drawRect(12, 36, 4, 4,FILL_BLACK);//SW square
+        lcd.drawRect(68, 8, 4, 4,FILL_BLACK); //NE square
+        lcd.drawRect(68, 36, 4, 4,FILL_BLACK);//SE square
+        
+        lcd.drawRect(40, 6, 4, 8,FILL_BLACK); //N spot, vertical
+        lcd.drawRect(38, 8, 8, 4,FILL_BLACK); //N spot, horizontal
+        
+        lcd.drawRect(26, 20, 4, 8,FILL_BLACK);//E spot, vertical
+        lcd.drawRect(24, 22, 8, 4,FILL_BLACK);//E spot, horizontal
+        
+        lcd.drawRect(40, 34, 4, 8,FILL_BLACK);//S spot, vertical
+        lcd.drawRect(38, 36, 8, 4,FILL_BLACK);//S spot, horizontal
+        
+        lcd.drawRect(54, 20, 4, 8,FILL_BLACK);//W spot, vertical
+        lcd.drawRect(52, 22, 8, 4,FILL_BLACK);//W spot, horizontal
+}
+
+
 void SnakeEngine::transition_black(N5110 &lcd) {
     //lcd.clear();
-    for (int j = 0; j < 21; j += 4) {
-        printf("j: %d\n", j);
-        for (int i = 1; i < 84 - (2*j); i += 2) {
-            lcd.drawRect(j, j, i + 1, 4, FILL_BLACK);
-            lcd.drawRect(83 - j - i, 44 - j, i + 1, 4, FILL_BLACK);  
+    for (int j = 0; j < 21; j += 4) {   //j iterator controls the size and location of current loop
+        //printf("j: %d\n", j); 
+        for (int i = 1; i < 84 - (2*j); i += 2) { //i iterator controls length of rectangles
+            lcd.drawRect(j, j, i + 1, 4, FILL_BLACK); //top horizontal rectangle              
+            lcd.drawRect(83 - j - i, 44 - j, i + 1, 4, FILL_BLACK);  //bottom horizontal rectangle
             wait_ms(5);   
-            lcd.refresh();
+            lcd.refresh(); //refreshes screen without clearing it to maintain previous loops
         }
-        for (int i = 1; i < 43 - (2*j); i += 2) {
-            lcd.drawRect(80 - j, 4 + j, 4, i,FILL_BLACK);
-            lcd.drawRect(j, 44 - i - j, 4, i,FILL_BLACK); 
+        for (int i = 1; i < 43 - (2*j); i += 2) { //i iterator controls length of rectangles
+            lcd.drawRect(80 - j, 4 + j, 4, i,FILL_BLACK); //right vertical rectangle    
+            lcd.drawRect(j, 44 - i - j, 4, i,FILL_BLACK); //left vertical rectangle    
             wait_ms(5);   
-            lcd.refresh();
+            lcd.refresh(); //refreshes screen without clearing it to maintain previous loops
         }
     }
-    wait_ms(500);      
+    //wait_ms(500);      
 }
 
 void SnakeEngine::transition_white(N5110 &lcd) {
     //lcd.clear();
     for (int j = 0; j < 21; j += 4) {
-        printf("j: %d\n", j);
+        //printf("j: %d\n", j);
         for (int i = 1; i < 84 - (2*j); i += 2) {
             lcd.drawRect(j, j, i + 1, 4, FILL_WHITE);
             lcd.drawRect(83 - j - i, 44 - j, i + 1, 4, FILL_WHITE);  
@@ -89,3 +148,147 @@
     }
     //wait_ms(500);      
 }
+
+void SnakeEngine::menu1_init(N5110 &lcd){
+         transition_black(lcd);
+         transition_white(lcd);
+         lcd.clear();
+         lcd.refresh();
+         //printf("Menu 2\n");
+         lcd.printString("    SNAKE",3,0);
+         lcd.printString("Play",30,2);
+         lcd.drawCircle(24,19,3,FILL_TRANSPARENT);
+         lcd.printString("Maps",30,3);
+         lcd.drawCircle(24,27,3,FILL_TRANSPARENT);
+         lcd.refresh();   
+}
+
+void SnakeEngine::menu1_select(N5110 &lcd, Gamepad &pad){    
+    //printf("Menu 1\n");
+    if (pad.X_pressed() == true){ //detect if 'up' selection
+        _menu_select--;
+    } else if (pad.B_pressed() == true){ //detect if 'down' selection
+        _menu_select++;
+    }
+    //printf("Option: %d\n", _menu_select);
+    if (pad.A_pressed() == true && _menu_select == 1){ //if option 1 selected and 'A' pressed
+        //game_init();      //Initialise game
+        _game_state = 3;    //switch state
+    } else if (pad.A_pressed() == true && _menu_select == 2){ //if option 2 selected and 'A' pressed
+        menu2_init(lcd);    //Initialise map menu 
+        _game_state = 2;    //switch state
+    }
+    if (_menu_select > 2) { //bottom - top wrap around
+        _menu_select = 1;
+    } else if (_menu_select < 1) { ////top - bottom wrap around
+        _menu_select = 2;
+    }
+    select_circles(lcd, _menu_select); //draw black circle in selected option
+}
+
+void SnakeEngine::menu2_init(N5110 &lcd){
+         //transition_black(lcd);
+         //transition_white(lcd);
+         //printf("Menu 1\n");
+         lcd.clear();   
+         lcd.printString("     MAPS",0,0);
+         lcd.printString("Empty",30,2);
+         lcd.drawCircle(24,19,3,FILL_TRANSPARENT);
+         lcd.printString("Ring",30,3);
+         lcd.drawCircle(24,27,3,FILL_TRANSPARENT);
+         lcd.printString("Cross",30,4);
+         lcd.drawCircle(24,35,3,FILL_TRANSPARENT);
+         lcd.printString("Spots",30,5);
+         lcd.drawCircle(24,43,3,FILL_TRANSPARENT);
+         lcd.refresh();   
+}
+
+void SnakeEngine::menu2_select(N5110 &lcd, Gamepad &pad){   
+    
+    //printf("Menu 2\n");
+    if (pad.X_pressed() == true){
+        _map--;
+    } else if (pad.B_pressed() == true){
+        _map++;
+    } else if (pad.Y_pressed() == true){
+        preview(lcd, _map);
+    } else if (pad.A_pressed() == true){
+        //game_init();
+        _game_state = 3;
+    }
+    
+    //printf("Map: %d\n", _map);
+    if (_map > 4) {
+        _map = 1;
+    } else if (_map < 1) {
+        _map = 4;
+    }
+    select_circles(lcd, _map);
+}
+
+
+void SnakeEngine::death_init(N5110 &lcd){
+         wait_ms(500);
+         transition_black(lcd);
+         transition_white(lcd);
+         //printf("Game over\n");
+         lcd.printString("  GAME  OVER  ",0,0);
+         lcd.printString("   Score =",3,1);
+         char buffer[14];
+         if (score < 10){
+            sprintf(buffer,"      0%2d",score);
+         } else {
+            sprintf(buffer,"       %2d",score);   
+         }
+         lcd.printString(buffer,0,2);
+         lcd.printString("Again!",24,4);
+         lcd.drawCircle(24,35,3,FILL_TRANSPARENT);
+         lcd.printString("Menu",24,5);
+         lcd.drawCircle(24,44,3,FILL_TRANSPARENT);
+         lcd.refresh();   
+} 
+
+void SnakeEngine::death_select(N5110 &lcd, Gamepad &pad){
+    
+} 
+
+void SnakeEngine::select_circles(N5110 &lcd, int line) {
+    for(int i = 19; i < 52; i +=8) {
+        lcd.drawCircle(24,i,2,FILL_WHITE);
+    }       
+    lcd.drawCircle(24,11+line*8,2,FILL_BLACK);
+    lcd.refresh();
+    wait_ms(200);
+    //snake_select1.render(lcd, 0, 8);
+    //wait_ms(200);
+    //snake_select2.render(lcd, 0, 8);
+    //wait_ms(200);
+    //snake_select3.render(lcd, 0, 8);
+    //wait_ms(200);
+}
+
+void SnakeEngine::preview(N5110 &lcd, int _map){
+    lcd.clear(); 
+    switch(_map) {
+        case 1:
+            lcd.clear(); 
+            lcd.printString("Empty",27,2);
+            break;
+        case 2:
+            draw_map2(lcd);
+            lcd.printString("Ring",30,2);
+            break;   
+        case 3:
+            draw_map3(lcd);
+            lcd.printString("Cross",27,2);
+            break;
+        case 4:
+            draw_map4(lcd);
+            lcd.printString("Spots",27,2);
+            break;
+        }
+    lcd.refresh(); 
+    wait_ms(1000);
+    lcd.clear();
+    menu2_init(lcd);
+}
\ No newline at end of file