Pong Video Game Demo - MBED + SmartGPU2 board

Dependencies:   SMARTGPU2 mbed

main.cpp

Committer:
emmanuelchio
Date:
2014-04-17
Revision:
1:3dc267ad8b64
Parent:
0:9ef82d07ae18

File content as of revision 1:3dc267ad8b64:

/**************************************************************************************/
/**************************************************************************************/
/*SMARTGPU2 intelligent embedded graphics processor unit
 those examples are for using the SMARTGPU2 with the mbed microcontoller, just connect tx,rx,and reset
 Board:
 http://www.vizictechnologies.com/
 
 www.vizictechnologies.com 
 Vizic Technologies copyright 2014 */
/**************************************************************************************/
/**************************************************************************************/

#include "mbed.h"
#include "SMARTGPU2.h"

SMARTGPU2 lcd(TXPIN,RXPIN,RESETPIN);  //create our object called "lcd"

// defines for balls
#define radiusBall1 15     //ball1 size
#define colourBall1 GREEN  //ball1 colour
#define radiusBall2 8      //ball2 size
#define colourBall2 YELLOW //ball2 colour

POINT point;
NUMBEROFBYTES charsPrinted;

//variables used by move ball methods
int speedBall1=2; //ball1 moving speed - amount of pixels that ball move each time
int speedBall2=3; //ball2 moving speed - amount of pixels that ball move each time 
int dirx1=1;      //xball1 initial positive direction
int diry1=1;      //yball1 initial positive direction
int xBall1=300;   //x initial position of ball1
int yBall1;       //y position of ball1
int dirx2=-1;     //xball2 initial negative direction
int diry2=1;      //yball2 initial positive direction
int xBall2=30;    //x initial position of ball2
int yBall2;       //y position of ball2

//variables used by Pong method
char score[7]={0,0,' ','P','T','S',0x00}; //array to save score
char points;            
char gameOver;          //game over flag
char speedCounter;      //Counter that saves the speed 
char ball1Active;       //acrive ball flag
char ball2Active;       //active ball flag 
int barSize = 60;       //size of bar in pixels 
int bar=50;             //initial x position of the bar   
int barCenter = (barSize/2)+bar; //we need to know the center of the bar

/***************************************************/
//function that move or update the actual position of the ball1
void moveBall1(){
   lcd.drawCircle(xBall1,yBall1,radiusBall1,BLACK,UNFILL);       // Erase previous ball position
   xBall1+=(dirx1*speedBall1);                                   // Calculate new x coordinate for ball1 
   yBall1+=(diry1*speedBall1);                                   // Calculate new y coordinate for ball1  
   lcd.drawCircle(xBall1,yBall1,radiusBall1,colourBall1,UNFILL); // Draw new ball position
   if((xBall1+speedBall1+radiusBall1)>318 | (xBall1-speedBall1-radiusBall1)<=1){       // if ball reaches the left or right corner, we invert moving direction 
    dirx1= dirx1*(-1);
   }
   if((yBall1+speedBall1+radiusBall1)>233 | (yBall1-speedBall1-radiusBall1)<=21){      // if ball reaches the top or bottom corner, we invert moving direction 
    if((yBall1-speedBall1-radiusBall1)<=21){                    // Bounce on top, only invert moving direction
      diry1= diry1*(-1);                                        // We invert the moving direction by multiplying by -1
    }else{                                                      // Bounce on bottom, check if inside the bar       
      if((xBall1+speedBall1+radiusBall1)>bar & (xBall1-speedBall1-radiusBall1)<(bar+barSize)){  //if bounce inside the bar
        diry1= diry1*(-1);                                      // We invert the moving direction by multiplying by -1
        points++;                                               // Increase player current points
        speedCounter++;                                         // Increase the speed counter
        if(speedCounter>9){                                     // If we reach 10 counts we increase the ball1 bouncing speed
          speedBall1++;          
          speedCounter=0;                                       // Reset the counter
        }                           
      }else{                                                   // Bounce outside the bar
        ball1Active=0;                                         // Clear ball1 active flag
        lcd.drawCircle(xBall1,yBall1,radiusBall1,BLACK,UNFILL);// Delete this ball because bounce outside of the bar        
        if(ball1Active==0 & ball2Active==0){                   // if we have lost both balls     
          gameOver=1;                                          // Set game over flag
        }         
      }
    }
   } 
}

/***************************************************/
//function that move or update the actual position of the ball2
void moveBall2(){
   lcd.drawCircle(xBall2,yBall2,radiusBall2,BLACK,FILL);       // Erase previous ball position
   xBall2+=(dirx2*speedBall2);                                 // Calculate new x coordinate for ball2 
   yBall2+=(diry2*speedBall2);                                 // Calculate new y coordinate for ball2
   lcd.drawCircle(xBall2,yBall2,radiusBall2,colourBall2,FILL); // Draw new ball position
   if((xBall2+speedBall2+radiusBall2)>318 | (xBall2-speedBall2-radiusBall2)<=1){       // if ball reaches the left or right corner, we invert moving direction 
    dirx2= dirx2*(-1);
   }
   if((yBall2+speedBall2+radiusBall2)>233 | (yBall2-speedBall2-radiusBall2)<=21){      // if ball reaches the top or bottom corner, we invert moving direction 
    if((yBall2-speedBall2-radiusBall2)<=21){                    // Bounce on top, only invert moving direction
      diry2= diry2*(-1);        
    }else{                                                      // Bounce on bottom, check if inside the bar       
      if((xBall2+speedBall2+radiusBall2)>bar & (xBall2-speedBall2-radiusBall2)<(bar+barSize)){  //if bounce inside the bar
        diry2= diry2*(-1);                                      // We invert the moving direction by multiplying by -1
        points++;                                               // Increase player current points
        speedCounter++;                                         // Increase the speed counter
        if(speedCounter>9){                                     // If we reach 10 counts we increase the ball1 bouncing speed
          speedBall2++;          
          speedCounter=0;                                       // Reset the counter
        }                           
      }else{                                                   // Bounce outside the bar
        ball2Active=0;                                         // Clear ball1 active flag
        lcd.drawCircle(xBall2,yBall2,radiusBall2,BLACK,FILL);  // Delete this ball because bounce outside of the bar        
        if(ball1Active==0 & ball2Active==0){                   // if we have lost both balls     
          gameOver=1;                                          // Set game over flag
        }         
      }
    }
   } 
}

/***************************************************/
/***************************************************/
//The game methodology
void pong(){
  unsigned char i;
  char score[7]={0,0,' ','P','T','S',0x00};
  char buffer[4]="00 ";
  
  //reset all parameters
  gameOver=0;            //reset flag
  points=0;              //reset points
  speedCounter=0;        //reset speed
  ball1Active=1;         //acrive ball flag
  ball2Active=1;         //active ball flag 
  yBall1=25+radiusBall1; //y initial position of ball1 
  yBall2=25+radiusBall2; //y initial position of ball2
  
  lcd.drawRectangle(0,20,319,239,MAGENTA,UNFILL);                        //draw corners
  lcd.drawLine(bar,234,bar+barSize,234,WHITE);                           //draw Bar 
  
  while(gameOver==0){                                                    //while game over flag is zero                          
    buffer[0]=(points/10)+0x30, buffer[1]=(points%10)+0x30;              //fill buffer that counts
    lcd.setTextColour(RED);
    lcd.setTextSize(FONT1);
    lcd.setTextBackFill(FILLED);      
    lcd.string(2,2,30,35,buffer,&charsPrinted);                          //display current points
      for(i=0;i<10;i++){                                                 //check 30 times if the player touches the screen
        if(lcd.touchScreen(&point)){                                     //if we receive a touch then we move the bar to touched side
          lcd.drawLine(bar,234,bar+barSize,234,BLACK);                   //erase previous Bar    
          if(point.x>barCenter){                                         //if we need to move the bar to the right           
            bar+=8;                                                      //move the bar to the right  8 pixels
            if((bar+barSize)>318){                                       //if the bar reach the right corner
              bar=318-barSize;      
            }              
            barCenter=bar+(barSize/2);                                   //set new center position of the bar
          }else{                                                         //move the bar to the left                                   
            bar-=8;                                                      //move the bar to the left 8 pixels 
            if(bar<1){                                                   //if the bar reach the left corner
              bar=1;  
            }              
            barCenter=bar+(barSize/2);                                   //set new center position of the bar
          }
          lcd.drawLine(bar,234,bar+barSize,234,WHITE);                   //draw the new bar at the new position
        }
        wait_ms(1);         
      }
      //we update the balls
      if(ball1Active){                                                   //if we haven't lost the ball1
        moveBall1(); 
      }
      if(ball2Active){                                                   //if we haven't lost the ball2
        moveBall2();      
      }
  }
  //game over - proceed to show final score
  lcd.setTextColour(RED);
  lcd.setTextSize(FONT4);
  lcd.setTextBackFill(TRANS);    
  lcd.string(70,60,319,239,"Game Over",&charsPrinted);
  score[0]=(points/10)+0x30;                                            //convert points to ascii format and store them on the score buffer
  score[1]=(points%10)+0x30;                                            //convert points to ascii format and store them on the score buffer
  lcd.setTextColour(YELLOW);
  lcd.setTextSize(FONT4);
  lcd.string(100,110,319,239,score,&charsPrinted);
  lcd.setTextColour(GREEN);
  lcd.setTextSize(FONT2);  
  lcd.string(90,160,319,239,"Touch to Exit",&charsPrinted);
  wait_ms(1000);
  while(lcd.touchScreen(&point)==0);                                    //wait for a touch to exit
  lcd.erase();                                                          //erase the screen and exit function
}

/***************************************************/
/***************************************************/
void initializeSmartGPU2(void){      //Initialize SMARTGPU2 Board
  lcd.reset();                       //physically reset SMARTGPU2
  lcd.start();                       //initialize the SMARTGPU2 processor
}

/***************************************************/
/***************************************************/
/***************************************************/
/***************************************************/
int main() {
  initializeSmartGPU2();             //Init communication with SmartGPU2 board
  
  lcd.baudChange(BAUD7);             //set a fast baud! for fast drawing
  
  while(1){                // Loop forever
    //Draw a cover
    lcd.drawTriangle(20,20,70,40,40,80,YELLOW,FILL);
    lcd.drawRectangle(250,30,300,80,MAGENTA,FILL);
    lcd.drawCircle(50,190,28,CYAN,FILL);
    lcd.drawTriangle(270,230,240,190,300,170,RED,FILL);
    lcd.setTextColour(WHITE);
    lcd.setTextSize(FONT5);    
    lcd.setTextBackFill(TRANS); 
    lcd.string(100,70,319,239,"PONG",&charsPrinted);
    lcd.setTextColour(GREEN);
    lcd.setTextSize(FONT2);        
    lcd.string(40,130,310,220,"Touch screen to begin",&charsPrinted);
    wait_ms(1000);
    while(lcd.touchScreen(&point)==INVALID); //wait for a touch to begin
    lcd.erase();
    //start the game
    pong();               // Play until game over
  }
}