Brickbreaker

Dependencies:   NokiaLCD PS2 mbed

Fork of Pong by William Johnston

main.cpp

Committer:
ipapp3
Date:
2013-04-29
Revision:
4:f3ac45fa2196
Parent:
3:e1328f84b107

File content as of revision 4:f3ac45fa2196:

#include "mbed.h"
#include "NokiaLCD.h"
#include "PS2Keyboard.h"
#include "ball.h"
#include "paddle.h"
#include "block.h"

// State enumerator
typedef enum {
    RESET1, RESET2, RUN, PAUSE, WIN
} STATES;

NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6610); // mosi, sclk, cs, rst, type

PS2Keyboard ps2kb(p12, p11); // CLK, DAT

DigitalIn sw2(p24);
DigitalIn sw1(p25);

PwmOut g(p21);
PwmOut b(p22);
PwmOut r(p23);

// Button enumerator for PS/2 keyboard
enum BUTTONS {
    UP = 0xe75,
    DOWN = 0xe72,
};

/*
 * Subroutine drawScreen:
 * Description: Draws paddle, blocks
 *  and the ball.
 */
void drawScreen(Paddle paddle1, Ball theBall, Block block1, Block block2, Block block3, Block block4,
                Block block5, Block block6, Block block7, Block block8, Block block9,
                Block block11, Block block12, Block block13, Block block14,
                Block block15, Block block16, Block block17, Block block18, Block block19, bool isBlack)
{
    paddle1.draw(lcd, isBlack);
    theBall.draw(lcd ,isBlack);
    block1.draw(lcd ,isBlack);
    block2.draw(lcd ,isBlack);
    block3.draw(lcd ,isBlack);
    block4.draw(lcd ,isBlack);
    block5.draw(lcd ,isBlack);
    block6.draw(lcd ,isBlack);
    block7.draw(lcd ,isBlack);
    block8.draw(lcd ,isBlack);
    block9.draw(lcd ,isBlack);
    block11.draw(lcd ,isBlack);
    block12.draw(lcd ,isBlack);
    block13.draw(lcd ,isBlack);
    block14.draw(lcd ,isBlack);
    block15.draw(lcd ,isBlack);
    block16.draw(lcd ,isBlack);
    block17.draw(lcd ,isBlack);
    block18.draw(lcd ,isBlack);
    block19.draw(lcd ,isBlack);
}

/*
 * Subroutine drawScores:
 * Description: Draws the scoreboard
 */
void drawScores(Paddle paddle1)
{
    lcd.locate(6.5,0);
    lcd.printf("%d",paddle1.getScore());
    lcd.locate(7.5,15);
    lcd.putc('0' + paddle1.getLives());
}

int main()
{
    PS2Keyboard::keyboard_event_t evt_kb; // Setup keyboard interrupt
    lcd.background(0x000000);
    lcd.cls();
    Paddle paddle1;
    Ball theBall;
    Block block1, block2, block3, block4, block5, block6, block7, block8, block9;
    Block block11, block12, block13, block14, block15, block16, block17, block18, block19;
    int temp, count=0;
    drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
               block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
    drawScores(paddle1);
    STATES state = RESET1; // Initial state is RESET
    while(1) {
        switch(state) {
            case WIN: // When palyer gets max score
                lcd.locate(4,3);
                lcd.printf("YOU WON!");
                if(!sw2) { // Reset if SW2 is pressed
                    while(!sw2);
                    paddle1.setLives(3);
                    paddle1.setScore(0);
                    state = RESET1;
                    break;
                }
                break;
            case RESET1: // Reset objects, draw the screen, state = PAUSE
                lcd.cls();
                paddle1 = Paddle(1,45,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore());
                theBall = Ball(6,57,5,5,0xFFFF00,1,1);
                block1 = Block(125,10,5,20,0x00FF00);
                block2 = Block(125,40,5,20,0xFF0000);
                block3 = Block(125,70,5,20,0xFFEE00);
                block4 = Block(125,100,5,20,0x00FFFF);                
                block5 = Block(113,5,5,20,0x00FF00);
                block6 = Block(113,30,5,20,0xFF0000);
                block7 = Block(113,55,5,20,0xFFFFFF);
                block8 = Block(113,80,5,20,0xFFEE00);
                block9 = Block(113,105,5,20,0x00FFFF);                
                block11 = Block(101,10,5,20,0xFF0000);
                block12 = Block(101,40,5,20,0x00FF00);
                block13 = Block(101,70,5,20,0x00FFFF);
                block14 = Block(101,100,5,20,0xFFEE00);           
                block15 = Block(89,5,5,20,0xFF0000);
                block16 = Block(89,30,5,20,0x00FF00);
                block17 = Block(89,55,5,20,0xFFFFFF);
                block18 = Block(89,80,5,20,0x00FFFF);
                block19 = Block(89,105,5,20,0xFFEE00);
                drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
                           block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
                drawScores(paddle1);
                state = PAUSE;
                break;
            case RESET2: // Reset objects, draw the screen, state = PAUSE
                lcd.cls();
                paddle1 = Paddle(1,45,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore());
                theBall = Ball(6,57,5,5,0xFFFF00,1,1);
                drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
                           block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
                drawScores(paddle1);
                state = PAUSE;
                break;
            case PAUSE: // Set RGB LED to Red, wait for switch input
                r = 0;
                b = g = 1;
                if(!sw2) {
                    while(!sw2);
                    paddle1.setLives(3);
                    paddle1.setScore(0);
                    state = RESET1;
                    break;
                }
                if(!sw1) {
                    while(!sw1);
                    state = RUN;
                }
                break;
            case RUN: // Set RGB LED to Blue and run program
                r = g = 1;
                b = 0;
                if(!sw2) { // Reset if SW2 is pressed
                    while(!sw2);
                    paddle1.setLives(3);
                    paddle1.setScore(0);
                    state = RESET1;
                    break;
                }
                if(!sw1) { // Pause if SW1 is pressed
                    while(!sw1);
                    state = PAUSE;
                    break;
                }
                if (ps2kb.processing(&evt_kb)) { // Executes if a key is pressed
                    temp = evt_kb.scancode[0];
                    for (int i = 1; i < evt_kb.length; i++) { // Parse keyboard input into a key
                        temp <<= 4;
                        temp |= evt_kb.scancode[i];
                    }
                    switch(temp) { // Use key enumerator to move paddle1
                        case UP:
                            if(paddle1.getY()>2)
                                paddle1.move(lcd, -2);
                            break;
                        case DOWN:
                            if(paddle1.getY()+paddle1.getHeight()<128)
                                paddle1.move(lcd, 2);
                            break;
                    }


                }

                if(++count==3) { // Only move the ball once every 4 times through the loop
                    count = 0;
                    if(theBall.hitP1((paddle1.getX()+paddle1.getWidth()), paddle1.getY(), paddle1.getHeight()))
                        theBall.reverseX();
                    if(theBall.hitB1((block1.getX()+block1.getWidth()), block1.getY(), block1.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(25);
                        block1.move(lcd, -100);
                    }
                    if(theBall.hitB1((block2.getX()+block2.getWidth()), block2.getY(), block2.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(25);
                        block2.move(lcd, -100);
                    }
                    if(theBall.hitB1((block3.getX()+block3.getWidth()), block3.getY(), block3.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(25);
                        block3.move(lcd, -100);
                    }
                    if(theBall.hitB1((block4.getX()+block4.getWidth()), block4.getY(), block4.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(25);
                        block4.move(lcd, -200);
                    }
                    if(theBall.hitB1((block5.getX()+block5.getWidth()), block5.getY(), block5.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(20);
                        block5.move(lcd, -100);
                    }
                    if(theBall.hitB1((block6.getX()+block6.getWidth()), block6.getY(), block6.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(20);
                        block6.move(lcd, -100);
                    }
                    if(theBall.hitB1((block7.getX()+block7.getWidth()), block7.getY(), block7.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(20);
                        block7.move(lcd, -100);
                    }
                    if(theBall.hitB1((block8.getX()+block8.getWidth()), block8.getY(), block8.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(20);
                        block8.move(lcd, -200);
                    }
                    if(theBall.hitB1((block9.getX()+block9.getWidth()), block9.getY(), block9.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(20);
                        block9.move(lcd, -200);
                    }
                    if(theBall.hitB1((block11.getX()+block11.getWidth()), block11.getY(), block11.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(15);
                        block11.move(lcd, -100);
                    }
                    if(theBall.hitB1((block12.getX()+block12.getWidth()), block12.getY(), block12.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(15);
                        block12.move(lcd, -100);
                    }
                    if(theBall.hitB1((block13.getX()+block13.getWidth()), block13.getY(), block13.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(15);
                        block13.move(lcd, -100);
                    }
                    if(theBall.hitB1((block14.getX()+block14.getWidth()), block14.getY(), block14.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(15);
                        block14.move(lcd, -200);
                    }
                    if(theBall.hitB1((block15.getX()+block15.getWidth()), block15.getY(), block15.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(10);
                        block15.move(lcd, -100);
                    }
                    if(theBall.hitB1((block16.getX()+block16.getWidth()), block16.getY(), block16.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(10);
                        block16.move(lcd, -100);
                    }
                    if(theBall.hitB1((block17.getX()+block17.getWidth()), block17.getY(), block17.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(10);
                        block17.move(lcd, -100);
                    }
                    if(theBall.hitB1((block18.getX()+block18.getWidth()), block18.getY(), block18.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(10);
                        block18.move(lcd, -200);
                    }
                    if(theBall.hitB1((block19.getX()+block19.getWidth()), block19.getY(), block19.getHeight())) {
                        theBall.reverseX();
                        paddle1.addPoints(10);
                        block19.move(lcd, -200);
                    }
                    if(theBall.hitX()) { // If the ball hits one of the sides of the screen
                        if(theBall.getX()<7) { // If the ball hit paddle1's side
                            if(!paddle1.loseLife()) { // If paddle1 has no more lives
                                paddle1.setLives(3);
                                paddle1.setScore(0);
                                state = RESET1; // Reset the objects
                                break;
                            }
                            state = RESET2; // Reset the objects
                        }
                        theBall.reverseX();
                    }
                    if(theBall.hitY())
                        theBall.reverseY();
                    theBall.move(lcd);
                }
                if(paddle1.getScore()==310) {
                    state=WIN;
                }
                break;
        }
        drawScreen(paddle1, theBall, block1, block2, block3, block4, block5, block6, block7, block8, block9,
                   block11, block12, block13, block14, block15, block16, block17, block18, block19, false);
        drawScores(paddle1);
    }
}