Istvan Papp / Mbed 2 deprecated Brickbreaker

Dependencies:   NokiaLCD PS2 mbed

Fork of Pong by William Johnston

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "NokiaLCD.h"
00003 #include "PS2Keyboard.h"
00004 #include "ball.h"
00005 #include "paddle.h"
00006 #include "block.h"
00007 
00008 // State enumerator
00009 typedef enum {
00010     RESET1, RESET2, RUN, PAUSE, WIN
00011 } STATES;
00012 
00013 NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6610); // mosi, sclk, cs, rst, type
00014 
00015 PS2Keyboard ps2kb(p12, p11); // CLK, DAT
00016 
00017 DigitalIn sw2(p24);
00018 DigitalIn sw1(p25);
00019 
00020 PwmOut g(p21);
00021 PwmOut b(p22);
00022 PwmOut r(p23);
00023 
00024 // Button enumerator for PS/2 keyboard
00025 enum BUTTONS {
00026     UP = 0xe75,
00027     DOWN = 0xe72,
00028 };
00029 
00030 /*
00031  * Subroutine drawScreen:
00032  * Description: Draws paddle, blocks
00033  *  and the ball.
00034  */
00035 void drawScreen(Paddle paddle1, Ball theBall, Block block1, Block block2, Block block3, Block block4,
00036                 Block block5, Block block6, Block block7, Block block8, Block block9,
00037                 Block block11, Block block12, Block block13, Block block14,
00038                 Block block15, Block block16, Block block17, Block block18, Block block19, bool isBlack)
00039 {
00040     paddle1.draw(lcd, isBlack);
00041     theBall.draw(lcd ,isBlack);
00042     block1.draw(lcd ,isBlack);
00043     block2.draw(lcd ,isBlack);
00044     block3.draw(lcd ,isBlack);
00045     block4.draw(lcd ,isBlack);
00046     block5.draw(lcd ,isBlack);
00047     block6.draw(lcd ,isBlack);
00048     block7.draw(lcd ,isBlack);
00049     block8.draw(lcd ,isBlack);
00050     block9.draw(lcd ,isBlack);
00051     block11.draw(lcd ,isBlack);
00052     block12.draw(lcd ,isBlack);
00053     block13.draw(lcd ,isBlack);
00054     block14.draw(lcd ,isBlack);
00055     block15.draw(lcd ,isBlack);
00056     block16.draw(lcd ,isBlack);
00057     block17.draw(lcd ,isBlack);
00058     block18.draw(lcd ,isBlack);
00059     block19.draw(lcd ,isBlack);
00060 }
00061 
00062 /*
00063  * Subroutine drawScores:
00064  * Description: Draws the scoreboard
00065  */
00066 void drawScores(Paddle paddle1)
00067 {
00068     lcd.locate(6.5,0);
00069     lcd.printf("%d",paddle1.getScore());
00070     lcd.locate(7.5,15);
00071     lcd.putc('0' + paddle1.getLives());
00072 }
00073 
00074 int main()
00075 {
00076     PS2Keyboard::keyboard_event_t evt_kb; // Setup keyboard interrupt
00077     lcd.background(0x000000);
00078     lcd.cls();
00079     Paddle paddle1;
00080     Ball theBall;
00081     Block block1, block2, block3, block4, block5, block6, block7, block8, block9;
00082     Block block11, block12, block13, block14, block15, block16, block17, block18, block19;
00083     int temp, count=0;
00084     drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
00085                block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
00086     drawScores(paddle1);
00087     STATES state = RESET1; // Initial state is RESET
00088     while(1) {
00089         switch(state) {
00090             case WIN: // When palyer gets max score
00091                 lcd.locate(4,3);
00092                 lcd.printf("YOU WON!");
00093                 if(!sw2) { // Reset if SW2 is pressed
00094                     while(!sw2);
00095                     paddle1.setLives(3);
00096                     paddle1.setScore(0);
00097                     state = RESET1;
00098                     break;
00099                 }
00100                 break;
00101             case RESET1: // Reset objects, draw the screen, state = PAUSE
00102                 lcd.cls();
00103                 paddle1 = Paddle(1,45,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore());
00104                 theBall = Ball(6,57,5,5,0xFFFF00,1,1);
00105                 block1 = Block(125,10,5,20,0x00FF00);
00106                 block2 = Block(125,40,5,20,0xFF0000);
00107                 block3 = Block(125,70,5,20,0xFFEE00);
00108                 block4 = Block(125,100,5,20,0x00FFFF);                
00109                 block5 = Block(113,5,5,20,0x00FF00);
00110                 block6 = Block(113,30,5,20,0xFF0000);
00111                 block7 = Block(113,55,5,20,0xFFFFFF);
00112                 block8 = Block(113,80,5,20,0xFFEE00);
00113                 block9 = Block(113,105,5,20,0x00FFFF);                
00114                 block11 = Block(101,10,5,20,0xFF0000);
00115                 block12 = Block(101,40,5,20,0x00FF00);
00116                 block13 = Block(101,70,5,20,0x00FFFF);
00117                 block14 = Block(101,100,5,20,0xFFEE00);           
00118                 block15 = Block(89,5,5,20,0xFF0000);
00119                 block16 = Block(89,30,5,20,0x00FF00);
00120                 block17 = Block(89,55,5,20,0xFFFFFF);
00121                 block18 = Block(89,80,5,20,0x00FFFF);
00122                 block19 = Block(89,105,5,20,0xFFEE00);
00123                 drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
00124                            block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
00125                 drawScores(paddle1);
00126                 state = PAUSE;
00127                 break;
00128             case RESET2: // Reset objects, draw the screen, state = PAUSE
00129                 lcd.cls();
00130                 paddle1 = Paddle(1,45,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore());
00131                 theBall = Ball(6,57,5,5,0xFFFF00,1,1);
00132                 drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
00133                            block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
00134                 drawScores(paddle1);
00135                 state = PAUSE;
00136                 break;
00137             case PAUSE: // Set RGB LED to Red, wait for switch input
00138                 r = 0;
00139                 b = g = 1;
00140                 if(!sw2) {
00141                     while(!sw2);
00142                     paddle1.setLives(3);
00143                     paddle1.setScore(0);
00144                     state = RESET1;
00145                     break;
00146                 }
00147                 if(!sw1) {
00148                     while(!sw1);
00149                     state = RUN;
00150                 }
00151                 break;
00152             case RUN: // Set RGB LED to Blue and run program
00153                 r = g = 1;
00154                 b = 0;
00155                 if(!sw2) { // Reset if SW2 is pressed
00156                     while(!sw2);
00157                     paddle1.setLives(3);
00158                     paddle1.setScore(0);
00159                     state = RESET1;
00160                     break;
00161                 }
00162                 if(!sw1) { // Pause if SW1 is pressed
00163                     while(!sw1);
00164                     state = PAUSE;
00165                     break;
00166                 }
00167                 if (ps2kb.processing(&evt_kb)) { // Executes if a key is pressed
00168                     temp = evt_kb.scancode[0];
00169                     for (int i = 1; i < evt_kb.length; i++) { // Parse keyboard input into a key
00170                         temp <<= 4;
00171                         temp |= evt_kb.scancode[i];
00172                     }
00173                     switch(temp) { // Use key enumerator to move paddle1
00174                         case UP:
00175                             if(paddle1.getY()>2)
00176                                 paddle1.move(lcd, -2);
00177                             break;
00178                         case DOWN:
00179                             if(paddle1.getY()+paddle1.getHeight()<128)
00180                                 paddle1.move(lcd, 2);
00181                             break;
00182                     }
00183 
00184 
00185                 }
00186 
00187                 if(++count==3) { // Only move the ball once every 4 times through the loop
00188                     count = 0;
00189                     if(theBall.hitP1((paddle1.getX()+paddle1.getWidth()), paddle1.getY(), paddle1.getHeight()))
00190                         theBall.reverseX();
00191                     if(theBall.hitB1((block1.getX()+block1.getWidth()), block1.getY(), block1.getHeight())) {
00192                         theBall.reverseX();
00193                         paddle1.addPoints(25);
00194                         block1.move(lcd, -100);
00195                     }
00196                     if(theBall.hitB1((block2.getX()+block2.getWidth()), block2.getY(), block2.getHeight())) {
00197                         theBall.reverseX();
00198                         paddle1.addPoints(25);
00199                         block2.move(lcd, -100);
00200                     }
00201                     if(theBall.hitB1((block3.getX()+block3.getWidth()), block3.getY(), block3.getHeight())) {
00202                         theBall.reverseX();
00203                         paddle1.addPoints(25);
00204                         block3.move(lcd, -100);
00205                     }
00206                     if(theBall.hitB1((block4.getX()+block4.getWidth()), block4.getY(), block4.getHeight())) {
00207                         theBall.reverseX();
00208                         paddle1.addPoints(25);
00209                         block4.move(lcd, -200);
00210                     }
00211                     if(theBall.hitB1((block5.getX()+block5.getWidth()), block5.getY(), block5.getHeight())) {
00212                         theBall.reverseX();
00213                         paddle1.addPoints(20);
00214                         block5.move(lcd, -100);
00215                     }
00216                     if(theBall.hitB1((block6.getX()+block6.getWidth()), block6.getY(), block6.getHeight())) {
00217                         theBall.reverseX();
00218                         paddle1.addPoints(20);
00219                         block6.move(lcd, -100);
00220                     }
00221                     if(theBall.hitB1((block7.getX()+block7.getWidth()), block7.getY(), block7.getHeight())) {
00222                         theBall.reverseX();
00223                         paddle1.addPoints(20);
00224                         block7.move(lcd, -100);
00225                     }
00226                     if(theBall.hitB1((block8.getX()+block8.getWidth()), block8.getY(), block8.getHeight())) {
00227                         theBall.reverseX();
00228                         paddle1.addPoints(20);
00229                         block8.move(lcd, -200);
00230                     }
00231                     if(theBall.hitB1((block9.getX()+block9.getWidth()), block9.getY(), block9.getHeight())) {
00232                         theBall.reverseX();
00233                         paddle1.addPoints(20);
00234                         block9.move(lcd, -200);
00235                     }
00236                     if(theBall.hitB1((block11.getX()+block11.getWidth()), block11.getY(), block11.getHeight())) {
00237                         theBall.reverseX();
00238                         paddle1.addPoints(15);
00239                         block11.move(lcd, -100);
00240                     }
00241                     if(theBall.hitB1((block12.getX()+block12.getWidth()), block12.getY(), block12.getHeight())) {
00242                         theBall.reverseX();
00243                         paddle1.addPoints(15);
00244                         block12.move(lcd, -100);
00245                     }
00246                     if(theBall.hitB1((block13.getX()+block13.getWidth()), block13.getY(), block13.getHeight())) {
00247                         theBall.reverseX();
00248                         paddle1.addPoints(15);
00249                         block13.move(lcd, -100);
00250                     }
00251                     if(theBall.hitB1((block14.getX()+block14.getWidth()), block14.getY(), block14.getHeight())) {
00252                         theBall.reverseX();
00253                         paddle1.addPoints(15);
00254                         block14.move(lcd, -200);
00255                     }
00256                     if(theBall.hitB1((block15.getX()+block15.getWidth()), block15.getY(), block15.getHeight())) {
00257                         theBall.reverseX();
00258                         paddle1.addPoints(10);
00259                         block15.move(lcd, -100);
00260                     }
00261                     if(theBall.hitB1((block16.getX()+block16.getWidth()), block16.getY(), block16.getHeight())) {
00262                         theBall.reverseX();
00263                         paddle1.addPoints(10);
00264                         block16.move(lcd, -100);
00265                     }
00266                     if(theBall.hitB1((block17.getX()+block17.getWidth()), block17.getY(), block17.getHeight())) {
00267                         theBall.reverseX();
00268                         paddle1.addPoints(10);
00269                         block17.move(lcd, -100);
00270                     }
00271                     if(theBall.hitB1((block18.getX()+block18.getWidth()), block18.getY(), block18.getHeight())) {
00272                         theBall.reverseX();
00273                         paddle1.addPoints(10);
00274                         block18.move(lcd, -200);
00275                     }
00276                     if(theBall.hitB1((block19.getX()+block19.getWidth()), block19.getY(), block19.getHeight())) {
00277                         theBall.reverseX();
00278                         paddle1.addPoints(10);
00279                         block19.move(lcd, -200);
00280                     }
00281                     if(theBall.hitX()) { // If the ball hits one of the sides of the screen
00282                         if(theBall.getX()<7) { // If the ball hit paddle1's side
00283                             if(!paddle1.loseLife()) { // If paddle1 has no more lives
00284                                 paddle1.setLives(3);
00285                                 paddle1.setScore(0);
00286                                 state = RESET1; // Reset the objects
00287                                 break;
00288                             }
00289                             state = RESET2; // Reset the objects
00290                         }
00291                         theBall.reverseX();
00292                     }
00293                     if(theBall.hitY())
00294                         theBall.reverseY();
00295                     theBall.move(lcd);
00296                 }
00297                 if(paddle1.getScore()==310) {
00298                     state=WIN;
00299                 }
00300                 break;
00301         }
00302         drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
00303                    block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
00304         drawScores(paddle1);
00305     }
00306 }