WITB2

Dependencies:   mbed 4DGL-uLCD-SE PinDetect

Revision:
2:9ece21082838
Parent:
1:21558533e3b9
Child:
3:462904d1c1a9
--- a/main.cpp	Wed Nov 08 20:19:16 2017 +0000
+++ b/main.cpp	Mon Nov 13 21:49:05 2017 +0000
@@ -1,8 +1,9 @@
 #include "mbed.h"
 #include "MMA8452.h"
 #include "uLCD_4DGL.h"
-#include "PinDetect.h"
+//#include "PinDetect.h"
 #include "Speaker.h"
+#include <ctime>
 
 /*-----Define Statements-----*/
 
@@ -33,7 +34,8 @@
 
 /*-----Sprites------*/
 
-int spaceship_earth1[EARTH_WIDTH * EARTH_HEIGHT] = {
+int spaceship_earth1[EARTH_WIDTH * EARTH_HEIGHT] = 
+{
     _,_,S,S,S,S,S,S,_,_,
     _,S,I,I,I,I,I,I,S,_,
     S,I,I,I,I,I,I,I,I,S,
@@ -43,10 +45,11 @@
     S,I,I,I,I,I,I,I,I,S,
     S,I,I,I,I,I,I,I,I,S,
     S,I,I,I,I,I,I,I,S,_,
-    _,S,S,S,S,S,S,S,_,_,
+    _,S,S,S,S,S,S,S,_,_
 };
 
-int earth_blank[EARTH_WIDTH * EARTH_HEIGHT] = {
+int earth_blank[EARTH_WIDTH * EARTH_HEIGHT] = 
+{
     _,_,_,_,_,_,_,_,_,_,
     _,_,_,_,_,_,_,_,_,_,
     _,_,_,_,_,_,_,_,_,_,
@@ -56,7 +59,87 @@
     _,_,_,_,_,_,_,_,_,_,
     _,_,_,_,_,_,_,_,_,_,
     _,_,_,_,_,_,_,_,_,_,
-    _,_,_,_,_,_,_,_,_,_,
+    _,_,_,_,_,_,_,_,_,_
+};
+
+int asteroid_sprite_1[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
+_,_,_,_,X,X,X,X,X,X,X,X,_,_,_,
+_,_,_,X,_,_,_,_,_,_,_,_,X,_,_,
+_,_,X,_,_,_,_,_,_,_,_,_,X,_,_,
+_,X,_,_,_,_,_,_,_,_,_,_,X,_,_,
+X,X,X,X,_,_,_,_,_,_,_,_,_,X,_,
+_,_,_,X,_,_,_,_,_,_,_,_,_,X,_,
+_,_,X,_,_,_,_,_,_,_,_,_,_,X,_,
+_,X,_,_,_,_,_,X,_,_,_,_,_,X,_,
+X,_,_,_,_,_,X,X,_,_,_,_,X,_,_,
+_,X,_,_,_,X,_,X,_,_,_,_,X,_,_,
+_,_,X,_,X,_,_,X,_,_,_,X,_,_,_,
+_,_,_,X,_,_,_,X,X,X,X,_,_,_,_
+};
+
+
+int asteroid_sprite_2[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
+_,_,X,X,X,X,X,X,X,X,_,_,_,_,_,
+_,_,_,X,_,_,_,_,_,_,X,X,_,_,_,
+_,_,_,_,X,_,_,_,_,_,_,_,X,_,_,
+X,X,X,X,X,X,_,_,_,_,_,_,_,X,_,
+X,_,_,_,_,_,_,_,_,_,_,_,_,_,X,
+X,_,_,_,_,_,_,_,_,_,_,_,_,X,X,
+X,_,_,_,_,_,_,_,_,_,_,X,X,_,_,
+_,X,_,_,_,_,_,_,_,_,X,_,_,_,_,
+_,_,X,_,_,_,_,_,_,_,_,X,X,_,_,
+_,_,_,X,_,_,_,_,X,_,_,_,_,X,X,
+_,_,_,_,X,_,X,X,_,X,X,_,_,X,_,
+_,_,_,_,_,X,_,_,_,_,_,X,X,_,_
+};
+
+
+int asteroid_sprite_3[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
+_,_,X,X,X,_,_,_,_,_,_,X,X,_,_,
+_,X,_,_,_,X,X,_,_,_,X,_,_,X,_,
+X,_,_,_,_,_,_,X,X,X,_,_,_,_,X,
+_,X,_,_,_,_,_,_,_,_,_,_,_,X,_,
+_,_,X,_,_,_,_,_,_,_,X,X,X,_,_,
+_,_,_,X,_,_,_,_,_,_,X,X,_,_,_,
+_,_,X,_,_,_,_,_,_,_,_,_,X,_,_,
+_,X,_,_,_,_,_,_,_,_,_,_,_,X,_,
+X,_,_,_,_,_,_,_,_,_,_,_,_,_,X,
+_,X,_,_,_,X,X,X,_,_,_,_,_,X,_,
+_,_,X,_,X,_,_,_,X,X,_,X,X,_,_,
+_,_,_,X,_,_,_,_,_,_,X,X,X,_,_
+};
+
+
+int asteroid_sprite_4[ASTEROID_HEIGHT * ASTEROID_WIDTH] = {
+_,_,_,X,X,_,_,_,_,_,X,_,_,_,_,
+_,_,X,_,_,X,_,_,_,X,_,X,X,_,_,
+_,X,_,_,_,_,X,_,X,_,_,_,_,X,_,
+X,_,_,_,_,_,_,X,_,_,_,_,_,_,X,
+X,_,_,_,_,_,_,_,_,_,_,_,_,X,_,
+X,_,_,_,_,_,_,_,_,_,_,_,X,_,_,
+X,_,_,_,_,_,_,_,_,_,_,_,_,X,_,
+X,_,_,_,_,_,_,_,_,_,_,_,_,_,X,
+X,_,_,_,_,_,_,_,_,_,_,_,_,X,_,
+_,X,_,_,_,_,_,_,_,_,_,_,X,_,_,
+_,_,X,_,_,_,_,_,_,_,_,X,_,_,_,
+_,_,_,X,X,X,X,X,X,X,X,_,_,_,_
+};
+
+
+int asteroid_blank[ASTEROID_WIDTH * ASTEROID_HEIGHT] = 
+{
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
+_,_,_,_,_,_,_,_,_,_,_,_,_,_,_
 };
 
 
@@ -77,7 +160,6 @@
 
 
 
-
 /*-----ScreenObject Class------*/
 
 class ScreenObject
@@ -85,7 +167,8 @@
 public:
     //ScreenObject();
     //setter functions
-    void setXPos(int x)
+    
+    /*void setXPos(int x)
     {
         x_pos = x;
     }
@@ -93,7 +176,7 @@
     void setYPos(int y)
     {
         y_pos = y;
-    }
+    } */
 
     //getter functions
 //    int getXPos();
@@ -119,13 +202,12 @@
     }
 
     void draw() {
-        uLCD.BLIT(y_pos, x_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,spaceship_earth1);
+        uLCD.BLIT(x_pos, y_pos, EARTH_WIDTH, EARTH_HEIGHT,spaceship_earth1);
     }
 
     void update() {
         
-        uLCD.BLIT(y_pos, x_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,earth_blank);
-        //uLCD.filled_rectangle(-1*y*factor-3+offsety,-1*x*factor+radius+offsety,-1*y*factor+3+offsetx,-1*x*factor+radius+6+offsety, BLACK);
+        uLCD.BLIT(x_pos, y_pos, EARTH_WIDTH, EARTH_HEIGHT,earth_blank);
         
         if(!acc.isXYZReady()) {
             wait(0.02);
@@ -133,18 +215,271 @@
 
         else {
             acc.readXYZGravity(&x,&y,&z); //notice this is passed by reference use pointers
-            setXPos(-1*x*factor + offset);
-            setYPos(-1*y*factor + offset);
-            
-            draw();
-            
+            x_pos = -1*x*factor + offset;
+            y_pos = -1*y*factor + offset;
+
         } //end else
-    }
+    }//end if
 
 };
 
 
 
+/*-----AbstractAsteroid Class-----*/
+
+
+class AbstractAsteroid: public ScreenObject
+{
+public: 
+    void pickCorner(int corner)
+    {   
+        switch (corner)
+        {
+            case 1:     //top left
+                x_pos = 1;
+                y_pos = 1;
+                deltaX = rand() % 3 + 1; 
+                deltaY = rand() % 3 + 1;
+                break;
+            case 2:     //top right
+                x_pos = 125;
+                y_pos = 1;
+                deltaX = -1*(rand() % 3 + 1); 
+                deltaY = rand() % 3 + 1;
+                break;
+            case 3:     //bottom left
+                x_pos = 1;
+                y_pos = 125;
+                deltaX = rand() % 3 + 1; 
+                deltaY = -1*(rand() % 3 + 1);
+                break;
+            case 4:     //bottom right
+                x_pos = 125;
+                y_pos = 125;
+                deltaX = -1*(rand() % 3 + 1); 
+                deltaY = -1*(rand() % 3 + 1);
+                break;
+        }
+    }
+    
+    void pickCorner()
+    {   
+        int corner = rand() % 4 + 1;
+    
+        switch (corner)
+        {
+            case 1:     //top left
+                x_pos = 1;
+                y_pos = 1;
+                deltaX = rand() % 3 + 1; 
+                deltaY = rand() % 3 + 1;
+                break;
+            case 2:     //top right
+                x_pos = 125;
+                y_pos = 1;
+                deltaX = -1*(rand() % 3 + 1); 
+                deltaY = rand() % 3 + 1;
+                break;
+            case 3:     //bottom left
+                x_pos = 1;
+                y_pos = 125;
+                deltaX = rand() % 3 + 1; 
+                deltaY = -1*(rand() % 3 + 1);
+                break;
+            case 4:     //bottom right
+                x_pos = 125;
+                y_pos = 125;
+                deltaX = -1*(rand() % 3 + 1); 
+                deltaY = -1*(rand() % 3 + 1);
+                break;
+        }
+    }
+    
+    bool boundaryCheck()
+    {
+        if(((x_pos == 0) || (x_pos == 126)) || ((y_pos == 0) || (y_pos == 126)))
+                return true;
+    }
+    
+protected:    
+    int deltaX;
+    int deltaY; 
+};
+
+
+
+//-----Concrete Asteroids-----//
+
+//-----Asteroid1-----//
+class Asteroid1: public AbstractAsteroid
+{
+public: 
+    Asteroid1(int corner)
+    {
+       pickCorner(corner);
+       startTime = time(0); 
+    }
+    
+    Asteroid1()
+    {
+       pickCorner();
+       startTime = time(0); 
+    }
+    
+    ~Asteroid1(void)
+    {
+    }
+    
+    void draw()
+    {
+        uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_sprite_1);
+    }   
+    
+    void update()
+    {
+        uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_blank);
+        wait(0.02);
+        time_t timeElapsed = time(0)-startTime;
+        x_pos = x_pos + (deltaX * timeElapsed);
+        y_pos = y_pos + (deltaY * timeElapsed);
+        
+        if(boundaryCheck() )
+        {
+            delete this;
+            Asteroid1();
+        }
+    }
+    
+protected:
+     time_t startTime;
+};
+
+
+//-----Asteroid2-----//
+class Asteroid2: public AbstractAsteroid
+{
+public: 
+    Asteroid2(int corner)
+    {
+       pickCorner(corner);
+       startTime = time(0); 
+    }
+    
+    Asteroid2()
+    {
+       pickCorner();
+       startTime = time(0); 
+    }
+    
+    void draw()
+    {
+        uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_sprite_2);
+    }   
+    
+    void update()
+    {
+        uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_blank);
+        wait(0.02);
+        time_t timeElapsed = time(0)-startTime;
+        x_pos = x_pos + (deltaX * timeElapsed);
+        y_pos = y_pos + (deltaY * timeElapsed);
+        
+        if(boundaryCheck() )
+        {
+            Asteroid2();
+        }
+    }
+    
+protected:
+     time_t startTime;
+};
+
+
+
+
+//-----Asteroid3-----//
+class Asteroid3: public AbstractAsteroid
+{
+public: 
+    Asteroid3(int corner)
+    {
+       pickCorner(corner);
+       startTime = time(0); 
+    }
+    
+    Asteroid3()
+    {
+       pickCorner();
+       startTime = time(0); 
+    }
+    
+    void draw()
+    {
+        uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_sprite_3);
+    }   
+    
+    void update()
+    {
+        uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_blank);
+        wait(0.02);
+        time_t timeElapsed = time(0)-startTime;
+        x_pos = x_pos + (deltaX * timeElapsed);
+        y_pos = y_pos + (deltaY * timeElapsed);
+        
+        if(boundaryCheck() )
+        {
+            Asteroid3();
+        }
+    }
+    
+protected:
+     time_t startTime;
+};
+
+
+
+//-----Asteroid4-----//
+class Asteroid4: public AbstractAsteroid
+{
+public: 
+    Asteroid4(int corner)
+    {
+       pickCorner(corner);
+       startTime = time(0); 
+    }
+    
+    Asteroid4()
+    {
+       pickCorner();
+       startTime = time(0); 
+    }
+    
+    void draw()
+    {
+        uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_sprite_4);
+    }   
+    
+    void update()
+    {
+        uLCD.BLIT(x_pos, y_pos, ASTEROID_WIDTH, ASTEROID_HEIGHT,asteroid_blank);
+        wait(0.02);
+        time_t timeElapsed = time(0)-startTime;
+        x_pos = x_pos + (deltaX * timeElapsed);
+        y_pos = y_pos + (deltaY * timeElapsed);
+        
+        if(boundaryCheck() )
+        {
+            Asteroid4();
+        }
+    }
+    
+protected:
+     time_t startTime;
+};
+
+
+
+
 
 //Program Start
 
@@ -153,9 +488,14 @@
     uLCD.baudrate(300000);
     wait(0.2);
     srand(time(0)); // do this srand call here ONLY... no where else in the code!
-//ScreenObject * ActiveAsteroids[NUM_ASTEROIDS];
+    //ScreenObject * ActiveAsteroids[NUM_ASTEROIDS];
     SpaceShipEarth ship; //instantiate a SpaceShipEarth object
-
+   
+   
+   Asteroid1 rock1(1);
+   //Asteroid2 rock2(2);
+   //Asteroid3 rock3(3);
+   //Asteroid4 rock4(4);
 
 //set parameters -- use these and don't change
     acc.setBitDepth(MMA8452::BIT_DEPTH_12);
@@ -166,7 +506,19 @@
     while(1) {
         ship.update();
 
-        //ship.draw();
+        ship.draw();
+        
+        rock1.update();
+        rock1.draw();
+        
+        //rock2.update();
+        //rock2.draw();
+        
+        //rock3.update();
+        //rock3.draw();
+        
+        //rock4.update();
+        //rock4.draw();
     } //end infinite while loop
 } //end main