WITB2

Dependencies:   mbed 4DGL-uLCD-SE PinDetect

main.cpp

Committer:
Nydrel
Date:
2017-11-13
Revision:
3:462904d1c1a9
Parent:
2:9ece21082838
Child:
4:d128df681d05

File content as of revision 3:462904d1c1a9:

#include "mbed.h"
#include "MMA8452.h"
#include "uLCD_4DGL.h"
//#include "PinDetect.h"
#include "Speaker.h"
#include <ctime>

/*-----Define Statements-----*/

#define ASTEROID_HEIGHT 12
#define ASTEROID_WIDTH 15
#define SPRITE_MAX 15
#define EARTH_WIDTH 10
#define EARTH_HEIGHT 10
#define EXPLOSION1_WIDTH 20
#define SCREEN_MAX 125
#define SCREEN_MIN 1
#define NUM_ASTEROIDS 4
#define Q 0x808000 //OLIVE
#define I 0x008000 //GREEN
#define S 0xC0C0C0 //SILVER
#define C 0x17202A //UFO GLASS
#define D 0x797D7F //DARK GREY
#define L 0x00FF00 //LIME
#define P 0xFF00FF //PINK
#define R 0xF1C40F //YELLOW
#define O 0xF39C12 //ORANGE
#define G 0xAAB7B8 //GREY
#define _ 0x000000 //BLACK
#define X 0xFFFFFF //WHITE
#define B 0x0000FF //BLUE
#define r 0xFF0000 //RED


/*-----Sprites------*/

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,
    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,I,S,
    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,_,_
};

int earth_blank[EARTH_WIDTH * EARTH_HEIGHT] = 
{
    _,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_
};

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] = 
{
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_
};


//Instantiate Accelerometer Object

Serial pc(USBTX,USBRX); //not used in this program
MMA8452 acc(p9, p10, 40000);  //instantiate an acc object!
double x, y, z;

//Instantiate uLCD Object

DigitalOut myled(LED1);
uLCD_4DGL uLCD(p28, p27, p29); // create a global uLCD object
//Speaker mySpeaker(p21);

int factor = 50;
int offset = 63;



/*-----ScreenObject Class------*/

class ScreenObject
{
public:
    //ScreenObject();
    //setter functions
    
    /*void setXPos(int x)
    {
        x_pos = x;
    }
    
    void setYPos(int y)
    {
        y_pos = y;
    } */

    //getter functions
//    int getXPos();
  //  int getYPos();

    //pure virtual
    virtual void draw() = 0;
    virtual void update() = 0;
    virtual bool boundaryCheck() = 0;
protected:
    int x_pos;
    int y_pos;
};


/*-----SpaceShipEarth Class------*/

class SpaceShipEarth: public ScreenObject
{
public:
    SpaceShipEarth() {
        x_pos = 63;
        y_pos = 63;
    }

    void draw() {
        uLCD.BLIT(x_pos, y_pos, EARTH_WIDTH, EARTH_HEIGHT,spaceship_earth1);
    }

    void update() {
        
        uLCD.BLIT(x_pos, y_pos, EARTH_WIDTH, EARTH_HEIGHT,earth_blank);
        
        if(!acc.isXYZReady()) {
            wait(0.02);
        }

        else {
            acc.readXYZGravity(&x,&y,&z); //notice this is passed by reference use pointers
            x_pos = -1*x*factor + offset;
            y_pos = -1*y*factor + offset;

        } //end else
    }//end if
    
    bool boundaryCheck()
    {
        if(((x_pos == 0) || (x_pos == 126)) || ((y_pos == 0) || (y_pos == 126)))
            return true;
        else
            return false;
    }

};



/*-----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;
        else
            return false;
    }
    
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);
    }
    
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);
    }
    
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);
    }
    
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);
    }
    
protected:
     time_t startTime;
};





//Program Start

int main()
{
    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];
    //SpaceShipEarth ship; //instantiate a SpaceShipEarth object
   
   
   Asteroid1 rock1(1);
   //Asteroid2 rock2(2);
   //Asteroid3 rock3(3);
   //Asteroid4 rock4(4);
   
   ActiveAsteroids[0] = &rock1;

//set parameters -- use these and don't change
    acc.setBitDepth(MMA8452::BIT_DEPTH_12);
    acc.setDynamicRange(MMA8452::DYNAMIC_RANGE_4G);
    acc.setDataRate(MMA8452::RATE_100);


    while(1) {
        //ship.update();

        //ship.draw();
        
        if(ActiveAsteroids[0]->boundaryCheck() == true)
        {
            //delete ActiveAsteroids[0];
            Asteroid1 newRock;
            ActiveAsteroids[0] = &newRock;
            ActiveAsteroids[0]->draw();
        }
        
        ActiveAsteroids[0]->update();
        
        ActiveAsteroids[0]->draw();
        
        //rock2.update();
        //rock2.draw();
        
        //rock3.update();
        //rock3.draw();
        
        //rock4.update();
        //rock4.draw();
    } //end infinite while loop
} //end main