SMARTGPU pong game application demo with touch

Dependencies:   SMARTGPU mbed

Files at this revision

API Documentation at this revision

Comitter:
emmanuelchio
Date:
Wed Sep 14 05:36:30 2011 +0000
Commit message:
Rev 1.0

Changed in this revision

SMARTGPU.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SMARTGPU.lib	Wed Sep 14 05:36:30 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/emmanuelchio/code/SMARTGPU/#8da93960a86b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Sep 14 05:36:30 2011 +0000
@@ -0,0 +1,201 @@
+/**************************************************************************************/
+/*SMARTGPU intelligent embedded graphics processor unit
+ those examples are for use the SMARTGPU with the mbed microcontoller, just connect tx,rx,and reset
+ Board:
+ http://www.vizictechnologies.com/#/desarrollo/4554296549
+ 
+ www.vizictechnologies.com 
+ Vizic Technologies copyright 2011 */
+/**************************************************************************************/
+/**************************************************************************************/
+
+#include "mbed.h"
+#include "SMARTGPU.h"
+
+// defines for balls
+#define radiusBall1 15     //ball1 size
+#define colourBall1 GREEN  //ball1 colour
+#define radiusBall2 8      //ball2 size
+#define colourBall2 YELLOW //ball2 colour
+
+SMARTGPU lcd(p13,p14,p15);        //(TX,RX,Reset);
+
+//Each time we use the touchscreen we must define a int array that stores the X and Y readed or touched coordinates.
+int touch[2];
+//Each time we use the touchicon we must define a char array that stores the name of the touched icon.
+char icon[3];
+
+//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[3];
+  
+  //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, buffer[2]=0; //fill buffer that counts
+    lcd.string(2,2,30,35,RED,FONT3,COLOUR,buffer);                       //display current points
+      for(i=0;i<5;i++){                                                  //check 5 times if the player touches the screen
+        if(lcd.touchScreen(touch)){                                      //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(touch[XCOORD]>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
+        }
+      }
+      //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.string(90,90,272,140,RED,FONT5,TRANS,"Game Over\0");
+  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.string(115,120,272,140,YELLOW,FONT5,TRANS,score);
+  lcd.string(110,150,250,180,GREEN,FONT3,TRANS,"Touch to Exit\0");          
+  wait_ms(1000);
+  while(lcd.touchScreen(touch)==0);                                     //wait for a touch to exit
+  lcd.erase();                                                          //erase the screen and exit function
+}
+
+
+/***************************************************/
+int main() { 
+  lcd.reset();                    //physically reset SMARTGPU
+  lcd.start();                    //initialize the SMARTGPU processor
+  
+  lcd.baudChange(2000000); //set a fast baud!, always that we use touch functions is recommended to use fast baud rates
+
+  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.string(125,70,319,239,WHITE,FONT7,TRANS,"PONG");
+    lcd.string(35,130,310,220,GREEN,FONT4,TRANS,"Touch screen to begin");
+    wait_ms(1000);
+    while(lcd.touchScreen(touch)==0); //wait for a touch to begin
+    lcd.erase();
+    //start the game
+    pong();               // Play until game over
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Sep 14 05:36:30 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912