Craig Evans
/
ELEC2645_Pong2021
Pong game for ELEC1620 board.
Revision 3:5746c6833d73, committed 2021-03-11
- 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
diff -r 482d74ef09c8 -r 5746c6833d73 lib/Ball.cpp --- 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; }
diff -r 482d74ef09c8 -r 5746c6833d73 lib/Paddle.cpp --- 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; }
diff -r 482d74ef09c8 -r 5746c6833d73 lib/PongEngine.cpp --- 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
diff -r 482d74ef09c8 -r 5746c6833d73 lib/PongEngine.h --- 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
diff -r 482d74ef09c8 -r 5746c6833d73 main.cpp --- 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); + } +}