Craig Evans
/
ELEC2645_Pong2021
Pong game for ELEC1620 board.
main.cpp@3:5746c6833d73, 2021-03-11 (annotated)
- Committer:
- eencae
- Date:
- Thu Mar 11 14:54:25 2021 +0000
- Revision:
- 3:5746c6833d73
- Parent:
- 2:482d74ef09c8
Added on LEDs and 7-seg for lives, bouncing off paddle and walls.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eencae | 0:be41a15e7a86 | 1 | |
eencae | 1:d63a63f0d397 | 2 | ///////////// includes ///////////////////// |
eencae | 0:be41a15e7a86 | 3 | #include "mbed.h" |
eencae | 0:be41a15e7a86 | 4 | #include "platform/mbed_thread.h" |
eencae | 0:be41a15e7a86 | 5 | #include "Joystick.h" |
eencae | 0:be41a15e7a86 | 6 | #include "N5110.h" |
eencae | 1:d63a63f0d397 | 7 | #include "ShiftReg.h" |
eencae | 1:d63a63f0d397 | 8 | #include "PongEngine.h" |
eencae | 1:d63a63f0d397 | 9 | #include "Utils.h" |
eencae | 1:d63a63f0d397 | 10 | ///////////// defines ///////////////////// |
eencae | 1:d63a63f0d397 | 11 | #define PADDLE_WIDTH 2 |
eencae | 1:d63a63f0d397 | 12 | #define PADDLE_HEIGHT 8 |
eencae | 1:d63a63f0d397 | 13 | #define BALL_SIZE 2 |
eencae | 1:d63a63f0d397 | 14 | #define BALL_SPEED 3 |
eencae | 1:d63a63f0d397 | 15 | ///////////// objects /////////////////// |
eencae | 0:be41a15e7a86 | 16 | N5110 lcd(p14,p8,p9,p10,p11,p13,p21); |
eencae | 1:d63a63f0d397 | 17 | Joystick joystick(p20,p19); |
eencae | 1:d63a63f0d397 | 18 | DigitalIn buttonA(p29); |
eencae | 1:d63a63f0d397 | 19 | BusOut leds(LED4,LED3,LED2,LED1); |
eencae | 1:d63a63f0d397 | 20 | ShiftReg seven_seg; |
eencae | 1:d63a63f0d397 | 21 | PongEngine pong; |
eencae | 3:5746c6833d73 | 22 | AnalogIn pot(p17); |
eencae | 1:d63a63f0d397 | 23 | ///////////// prototypes /////////////// |
eencae | 1:d63a63f0d397 | 24 | void init(); |
eencae | 1:d63a63f0d397 | 25 | void render(); |
eencae | 1:d63a63f0d397 | 26 | void welcome(); |
eencae | 3:5746c6833d73 | 27 | void display_lives(int lives); |
eencae | 3:5746c6833d73 | 28 | void game_over(); |
eencae | 1:d63a63f0d397 | 29 | //////////////////////////////////////// |
eencae | 0:be41a15e7a86 | 30 | |
eencae | 1:d63a63f0d397 | 31 | int main() { |
eencae | 1:d63a63f0d397 | 32 | init(); // initialise devices and objects |
eencae | 1:d63a63f0d397 | 33 | welcome(); // waiting for the user to start |
eencae | 1:d63a63f0d397 | 34 | render(); // first draw the initial frame |
eencae | 3:5746c6833d73 | 35 | int fps = 10; |
eencae | 3:5746c6833d73 | 36 | thread_sleep_for(1000/fps); // and wait for one frame period - millseconds |
eencae | 1:d63a63f0d397 | 37 | |
eencae | 3:5746c6833d73 | 38 | int lives = 4; // display lives on LEDs |
eencae | 3:5746c6833d73 | 39 | display_lives(lives); |
eencae | 3:5746c6833d73 | 40 | |
eencae | 3:5746c6833d73 | 41 | while (lives > 0) { // keep looping while lives remain |
eencae | 1:d63a63f0d397 | 42 | // read the joystick input and store in a struct |
eencae | 1:d63a63f0d397 | 43 | UserInput input = {joystick.get_direction(),joystick.get_mag()}; |
eencae | 3:5746c6833d73 | 44 | lives = pong.update(input); // update the game engine based on input |
eencae | 3:5746c6833d73 | 45 | display_lives(lives); // display lives on LEDs |
eencae | 3:5746c6833d73 | 46 | render(); // draw frame on screen |
eencae | 3:5746c6833d73 | 47 | thread_sleep_for(1000/fps); // and wait for one frame period - ms |
eencae | 3:5746c6833d73 | 48 | } |
eencae | 3:5746c6833d73 | 49 | game_over(); |
eencae | 1:d63a63f0d397 | 50 | } |
eencae | 0:be41a15e7a86 | 51 | |
eencae | 1:d63a63f0d397 | 52 | void init() { |
eencae | 1:d63a63f0d397 | 53 | seven_seg.write(0x00); // turn of 7-seg display |
eencae | 0:be41a15e7a86 | 54 | lcd.init(); |
eencae | 0:be41a15e7a86 | 55 | lcd.setContrast(0.5); |
eencae | 0:be41a15e7a86 | 56 | joystick.init(); |
eencae | 3:5746c6833d73 | 57 | pong.init(0,8,2,2,2); // paddle x position, paddle_height,paddle_width,ball_size,speed |
eencae | 1:d63a63f0d397 | 58 | } |
eencae | 1:d63a63f0d397 | 59 | |
eencae | 1:d63a63f0d397 | 60 | void render() { // clear screen, re-draw and refresh |
eencae | 1:d63a63f0d397 | 61 | lcd.clear(); |
eencae | 1:d63a63f0d397 | 62 | pong.draw(lcd); |
eencae | 1:d63a63f0d397 | 63 | lcd.refresh(); |
eencae | 1:d63a63f0d397 | 64 | } |
eencae | 1:d63a63f0d397 | 65 | |
eencae | 1:d63a63f0d397 | 66 | void welcome() { // splash screen |
eencae | 1:d63a63f0d397 | 67 | lcd.printString(" Pong! ",0,1); |
eencae | 1:d63a63f0d397 | 68 | lcd.printString(" Press A ",0,4); |
eencae | 1:d63a63f0d397 | 69 | lcd.refresh(); |
eencae | 1:d63a63f0d397 | 70 | |
eencae | 1:d63a63f0d397 | 71 | // wait flashing LEDs until button A is pressed |
eencae | 3:5746c6833d73 | 72 | while (buttonA.read() == 0) { |
eencae | 1:d63a63f0d397 | 73 | leds = 0b1111; |
eencae | 1:d63a63f0d397 | 74 | thread_sleep_for(100); |
eencae | 1:d63a63f0d397 | 75 | leds = 0b0000; |
eencae | 1:d63a63f0d397 | 76 | thread_sleep_for(100); |
eencae | 0:be41a15e7a86 | 77 | } |
eencae | 3:5746c6833d73 | 78 | } |
eencae | 3:5746c6833d73 | 79 | |
eencae | 3:5746c6833d73 | 80 | void display_lives(int lives) { |
eencae | 3:5746c6833d73 | 81 | if (lives == 4) { |
eencae | 3:5746c6833d73 | 82 | leds = 0b1111; |
eencae | 3:5746c6833d73 | 83 | seven_seg.write(0x66); |
eencae | 3:5746c6833d73 | 84 | } else if (lives == 3) { |
eencae | 3:5746c6833d73 | 85 | leds = 0b1110; |
eencae | 3:5746c6833d73 | 86 | seven_seg.write(0x4F); |
eencae | 3:5746c6833d73 | 87 | } else if (lives == 2) { |
eencae | 3:5746c6833d73 | 88 | leds = 0b1100; |
eencae | 3:5746c6833d73 | 89 | seven_seg.write(0x5B); |
eencae | 3:5746c6833d73 | 90 | } else if (lives == 1) { |
eencae | 3:5746c6833d73 | 91 | leds = 0b1000; |
eencae | 3:5746c6833d73 | 92 | seven_seg.write(0x06); |
eencae | 3:5746c6833d73 | 93 | } else { |
eencae | 3:5746c6833d73 | 94 | leds = 0b0000; |
eencae | 3:5746c6833d73 | 95 | seven_seg.write(0x3F); |
eencae | 3:5746c6833d73 | 96 | } |
eencae | 3:5746c6833d73 | 97 | } |
eencae | 3:5746c6833d73 | 98 | |
eencae | 3:5746c6833d73 | 99 | void game_over() { // splash screen |
eencae | 3:5746c6833d73 | 100 | while (1) { |
eencae | 3:5746c6833d73 | 101 | lcd.clear(); |
eencae | 3:5746c6833d73 | 102 | lcd.printString(" Game Over ",0,2); |
eencae | 3:5746c6833d73 | 103 | lcd.printString(" Loser! ",0,4); |
eencae | 3:5746c6833d73 | 104 | lcd.refresh(); |
eencae | 3:5746c6833d73 | 105 | leds = 0b1111; |
eencae | 3:5746c6833d73 | 106 | thread_sleep_for(250); |
eencae | 3:5746c6833d73 | 107 | lcd.clear(); |
eencae | 3:5746c6833d73 | 108 | lcd.refresh(); |
eencae | 3:5746c6833d73 | 109 | leds = 0b0000; |
eencae | 3:5746c6833d73 | 110 | thread_sleep_for(250); |
eencae | 3:5746c6833d73 | 111 | } |
eencae | 3:5746c6833d73 | 112 | } |