Pong game for ELEC1620 board.

Files at this revision

API Documentation at this revision

Comitter:
eencae
Date:
Thu Mar 11 14:54:25 2021 +0000
Parent:
2:482d74ef09c8
Commit message:
Added on LEDs and 7-seg for lives, bouncing off paddle and walls.

Changed in this revision

lib/Ball.cpp Show annotated file Show diff for this revision Revisions of this file
lib/Paddle.cpp Show annotated file Show diff for this revision Revisions of this file
lib/PongEngine.cpp Show annotated file Show diff for this revision Revisions of this file
lib/PongEngine.h 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
--- a/lib/Ball.cpp	Wed Mar 10 16:37:52 2021 +0000
+++ b/lib/Ball.cpp	Thu Mar 11 14:54:25 2021 +0000
@@ -3,7 +3,7 @@
 Ball::Ball() {}
 
 void Ball::init(int size, int speed) {
-    printf("Ball: Init\n");
+    //printf("Ball: Init\n");
     _size = size;
     _x = WIDTH/2 -  _size/2;
     _y = HEIGHT/2 - _size/2;
@@ -13,12 +13,12 @@
 }
 
 void Ball::draw(N5110 &lcd) {
-    printf("Ball: Draw\n");
+    //printf("Ball: Draw\n");
     lcd.drawRect(_x,_y,_size,_size,FILL_BLACK);
 }
 
 void Ball::update(){
-    printf("Ball: Update\n");     
+    //printf("Ball: Update\n");     
     _x += _velocity.x;
     _y += _velocity.y;
 }
--- a/lib/Paddle.cpp	Wed Mar 10 16:37:52 2021 +0000
+++ b/lib/Paddle.cpp	Thu Mar 11 14:54:25 2021 +0000
@@ -20,9 +20,7 @@
 
 void Paddle::update(UserInput input) {
     printf("Paddle: Update\n");
-    _speed = int(input.mag*_height);  // speed of movement changes depending on 
-    // how far the joystick is pushed (0 to 1) and the height of the paddle
-
+    _speed = 2;
     // update y value depending on direction of movement
     // North is decrement as origin is at the top-left so decreasing moves up
     if (input.d == N) { _y-=_speed; }
--- a/lib/PongEngine.cpp	Wed Mar 10 16:37:52 2021 +0000
+++ b/lib/PongEngine.cpp	Thu Mar 11 14:54:25 2021 +0000
@@ -1,35 +1,39 @@
 #include "PongEngine.h"
 
-PongEngine::PongEngine(){}
+PongEngine::PongEngine(){ _lives = 4; }    
 
 void PongEngine::init(int paddle_position, int paddle_height, int paddle_width, int ball_size, int speed){
-    printf("Pong Engine: Init\n");
+    //printf("Pong Engine: Init\n");
     _ball.init(ball_size,speed);
     _paddle.init(paddle_position, paddle_height, paddle_width);
 }
 
-void PongEngine::update(UserInput input) {   
-    printf("Pong Engine: Update\n");
+int PongEngine::update(UserInput input) {   
+    //printf("Pong Engine: Update\n");
+    check_goal();  // checking for a goal is a priority 
     _ball.update();
     _paddle.update(input);
     // important to update paddles and ball before checking collisions so can
     // correct for it before updating the display
     check_wall_collision();
     check_paddle_collision();
+    
+    return _lives;
 }
 
 void PongEngine::draw(N5110 &lcd) {
-    printf("Pong Engine: Draw\n");
+    //printf("Pong Engine: Draw\n");
     // draw the elements in the LCD buffer
     // pitch
-    lcd.drawRect(0,0,WIDTH,HEIGHT,FILL_TRANSPARENT);
-    lcd.drawLine(WIDTH/2,0,WIDTH/2,HEIGHT-1,2);
+    lcd.drawLine(0,0,WIDTH-1,0,1);  // top
+    lcd.drawLine(WIDTH-1,0,WIDTH-1,HEIGHT-1,1);  // back wall
+    lcd.drawLine(0,HEIGHT-1,WIDTH-1,HEIGHT-1,1); // bottom
     _ball.draw(lcd);
     _paddle.draw(lcd);
 }
 
 void PongEngine::check_wall_collision() {
-    printf("Pong Engine: Check Wall Collision\n");
+    //printf("Pong Engine: Check Wall Collision\n");
     // read current ball attributes
     Position2D ball_pos = _ball.get_pos();
     Position2D ball_velocity = _ball.get_velocity();
@@ -55,7 +59,7 @@
 }
 
 void PongEngine::check_paddle_collision() {
-    printf("Pong Engine: Check Paddle Collision\n");
+    //printf("Pong Engine: Check Paddle Collision\n");
     // read current ball and paddle attributes
     Position2D ball_pos = _ball.get_pos();
     Position2D ball_velocity = _ball.get_velocity();
@@ -76,4 +80,17 @@
     // write new attributes
     _ball.set_velocity(ball_velocity);
     _ball.set_pos(ball_pos);
+}
+
+void PongEngine::check_goal() {
+    //printf("Pong Engine: Check Goal\n");
+    Position2D ball_pos = _ball.get_pos();
+    int size = _ball.get_size();
+    int speed = abs(_ball.get_velocity().x);  // speed is magnitude of velocity
+    // check if ball position has gone off the left
+    if (ball_pos.x + size < 0) {
+        // reset the ball
+        _ball.init(size,speed);
+        _lives--;  // lose a life
+    }   
 }
\ No newline at end of file
--- a/lib/PongEngine.h	Wed Mar 10 16:37:52 2021 +0000
+++ b/lib/PongEngine.h	Thu Mar 11 14:54:25 2021 +0000
@@ -11,13 +11,15 @@
     public:
         PongEngine();  // pass in the lcd object from the main file
         void init(int paddle_position,int paddle_height,int paddle_width,int ball_size,int speed);
-        void update(UserInput input);
+        int update(UserInput input);
         void draw(N5110 &lcd);
     private:
         void check_wall_collision();
         void check_paddle_collision();
+        void check_goal();
         Ball _ball;
         Paddle _paddle;
+        int _lives;
 };
 
 #endif
\ No newline at end of file
--- a/main.cpp	Wed Mar 10 16:37:52 2021 +0000
+++ b/main.cpp	Thu Mar 11 14:54:25 2021 +0000
@@ -19,26 +19,34 @@
 BusOut leds(LED4,LED3,LED2,LED1);
 ShiftReg seven_seg;
 PongEngine pong;
+AnalogIn pot(p17); 
 ///////////// prototypes ///////////////
 void init();
 void render();
 void welcome();
+void display_lives(int lives);
+void game_over();
 ////////////////////////////////////////
 
 int main() {
     init();      // initialise devices and objects
     welcome();   // waiting for the user to start 
     render();    // first draw the initial frame 
-    int fps = 1000/10;  // 10 fps 
-    thread_sleep_for(fps);  // and wait for one frame period - millseconds
+    int fps = 10;
+    thread_sleep_for(1000/fps);  // and wait for one frame period - millseconds
     
-    while (1) {
+    int lives = 4;   // display lives on LEDs
+    display_lives(lives);
+    
+    while (lives > 0) {  // keep looping while lives remain
         // read the joystick input and store in a struct
         UserInput input = {joystick.get_direction(),joystick.get_mag()};
-        pong.update(input);     // update the game engine based on input
-        render();               // draw frame on screen
-        thread_sleep_for(fps);  // and wait for one frame period - ms
-    }
+        lives = pong.update(input);   // update the game engine based on input
+        display_lives(lives);         // display lives on LEDs    
+        render();                     // draw frame on screen
+        thread_sleep_for(1000/fps);         // and wait for one frame period - ms
+    }   
+    game_over();
 }
 
 void init() {
@@ -46,7 +54,7 @@
     lcd.init();
     lcd.setContrast(0.5);
     joystick.init();
-    pong.init(2,8,2,2,2);     // paddle x position, paddle_height,paddle_width,ball_size,speed
+    pong.init(0,8,2,2,2);     // paddle x position, paddle_height,paddle_width,ball_size,speed
 }
 
 void render() {  // clear screen, re-draw and refresh
@@ -61,10 +69,44 @@
     lcd.refresh();
      
     // wait flashing LEDs until button A is pressed 
-    while ( buttonA.read() == 0) {
+    while (buttonA.read() == 0) {
         leds = 0b1111;
         thread_sleep_for(100);
         leds = 0b0000;
         thread_sleep_for(100);   
     }
-}
\ No newline at end of file
+}
+
+void display_lives(int lives) {
+    if (lives == 4) {
+        leds = 0b1111;
+        seven_seg.write(0x66);
+    } else if (lives == 3) {
+        leds = 0b1110;
+        seven_seg.write(0x4F);
+    } else if (lives == 2) {
+        leds = 0b1100;
+        seven_seg.write(0x5B);
+    } else if (lives == 1) {
+        leds = 0b1000;
+        seven_seg.write(0x06);
+    } else {
+        leds = 0b0000;
+        seven_seg.write(0x3F);
+    }
+}
+
+void game_over() { // splash screen 
+    while (1) {
+        lcd.clear();
+        lcd.printString("  Game Over ",0,2);  
+        lcd.printString("    Loser!  ",0,4);
+        lcd.refresh();
+        leds = 0b1111;
+        thread_sleep_for(250);
+        lcd.clear();
+        lcd.refresh();
+        leds = 0b0000;
+        thread_sleep_for(250);   
+    }
+}