A simple pong game with a NUCLEO board and ILI9163C TFT display.

Dependencies:   mbed TFT_ILI9163C Adafruit_GFX_MBED

Committer:
hudakz
Date:
Thu Jan 20 16:21:57 2022 +0000
Revision:
0:b07b507bad19
A simple pong game with a NUCLEO board and ILI9163C TFT display.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:b07b507bad19 1 #include "mbed.h"
hudakz 0:b07b507bad19 2 #include "math.h"
hudakz 0:b07b507bad19 3 #include "Adafruit_GFX.h"
hudakz 0:b07b507bad19 4 #include "TFT_ILI9163C.h"
hudakz 0:b07b507bad19 5
hudakz 0:b07b507bad19 6 #define M_PI 3.14159265358979323846
hudakz 0:b07b507bad19 7
hudakz 0:b07b507bad19 8
hudakz 0:b07b507bad19 9 // Define TFT to NUCLEO_F446RE pin connection
hudakz 0:b07b507bad19 10 #define TFT_MOSI PA_7
hudakz 0:b07b507bad19 11 #define TFT_SCLK PA_5
hudakz 0:b07b507bad19 12 #define TFT_CS PB_6
hudakz 0:b07b507bad19 13 #define TFT_DC PC_7
hudakz 0:b07b507bad19 14 #define TFT_RST PA_9
hudakz 0:b07b507bad19 15
hudakz 0:b07b507bad19 16 // SPI speed
hudakz 0:b07b507bad19 17 #define SPI_BITRATE 50000000L
hudakz 0:b07b507bad19 18
hudakz 0:b07b507bad19 19 // Color definitions
hudakz 0:b07b507bad19 20 #define BLACK 0x0000
hudakz 0:b07b507bad19 21 #define BLUE 0x001F
hudakz 0:b07b507bad19 22 #define RED 0xF800
hudakz 0:b07b507bad19 23 #define GREEN 0x07E0
hudakz 0:b07b507bad19 24 #define CYAN 0x07FF
hudakz 0:b07b507bad19 25 #define MAGENTA 0xF81F
hudakz 0:b07b507bad19 26 #define YELLOW 0xFFE0
hudakz 0:b07b507bad19 27 #define WHITE 0xFFFF
hudakz 0:b07b507bad19 28
hudakz 0:b07b507bad19 29 // Create display object
hudakz 0:b07b507bad19 30 TFT_ILI9163C display(TFT_MOSI, NC, TFT_SCLK, TFT_CS, TFT_DC, TFT_RST);
hudakz 0:b07b507bad19 31 AnalogIn a1(PA_0);
hudakz 0:b07b507bad19 32 AnalogIn a2(PA_1);
hudakz 0:b07b507bad19 33 DigitalIn startButton(PC_13);
hudakz 0:b07b507bad19 34
hudakz 0:b07b507bad19 35 int bx = 64;
hudakz 0:b07b507bad19 36 int by = 64;
hudakz 0:b07b507bad19 37 int P1x1 = 0, P1x2 = 3, P1y1, P1y2;
hudakz 0:b07b507bad19 38 int P2x1 = 124, P2x2 = 127, P2y1, P2y2;
hudakz 0:b07b507bad19 39 float angle;
hudakz 0:b07b507bad19 40 int speed;
hudakz 0:b07b507bad19 41 int P1S = 0, P2S = 0;
hudakz 0:b07b507bad19 42 int hold, h1, h2;
hudakz 0:b07b507bad19 43 char score[32];
hudakz 0:b07b507bad19 44
hudakz 0:b07b507bad19 45 /**
hudakz 0:b07b507bad19 46 * @brief
hudakz 0:b07b507bad19 47 * @note
hudakz 0:b07b507bad19 48 * @param
hudakz 0:b07b507bad19 49 * @retval
hudakz 0:b07b507bad19 50 */
hudakz 0:b07b507bad19 51 int main()
hudakz 0:b07b507bad19 52 {
hudakz 0:b07b507bad19 53 // display.text_width(1);
hudakz 0:b07b507bad19 54 // display.text_height(1);
hudakz 0:b07b507bad19 55 // display.baudrate(300000);
hudakz 0:b07b507bad19 56 // Initialize random angle between 0 and 360
hudakz 0:b07b507bad19 57 srand(time(NULL));
hudakz 0:b07b507bad19 58 do
hudakz 0:b07b507bad19 59 {
hudakz 0:b07b507bad19 60 angle = rand() % 361;
hudakz 0:b07b507bad19 61 } while
hudakz 0:b07b507bad19 62 (
hudakz 0:b07b507bad19 63 (angle < 20) ||
hudakz 0:b07b507bad19 64 (angle > 70 && angle < 110) ||
hudakz 0:b07b507bad19 65 (angle > 160 && angle < 200) ||
hudakz 0:b07b507bad19 66 (angle > 250 && angle < 290) ||
hudakz 0:b07b507bad19 67 (angle > 340)
hudakz 0:b07b507bad19 68 );
hudakz 0:b07b507bad19 69
hudakz 0:b07b507bad19 70 /////////////////////////////////////////////////////
hudakz 0:b07b507bad19 71 while (1) {
hudakz 0:b07b507bad19 72 if (startButton == 0) {
hudakz 0:b07b507bad19 73 hold = 0;
hudakz 0:b07b507bad19 74 h1 = 0;
hudakz 0:b07b507bad19 75 h2 = 0;
hudakz 0:b07b507bad19 76 }
hudakz 0:b07b507bad19 77
hudakz 0:b07b507bad19 78 if (hold == 1)
hudakz 0:b07b507bad19 79 speed = 0;
hudakz 0:b07b507bad19 80 else
hudakz 0:b07b507bad19 81 speed = 5;
hudakz 0:b07b507bad19 82
hudakz 0:b07b507bad19 83 // Set position of the paddles
hudakz 0:b07b507bad19 84 P1y1 = (a1 * 103) + 8;
hudakz 0:b07b507bad19 85 P1y2 = P1y1 + 16;
hudakz 0:b07b507bad19 86 P2y1 = (a2 * 103 + 8);
hudakz 0:b07b507bad19 87 P2y2 = P2y1 + 16;
hudakz 0:b07b507bad19 88
hudakz 0:b07b507bad19 89 // Control motion of ball
hudakz 0:b07b507bad19 90 display.fillCircle(bx, by, 2, WHITE);
hudakz 0:b07b507bad19 91
hudakz 0:b07b507bad19 92 if ((bx > 122 && (by > P2y1 && by < P2y2)) || (bx < 5 && (by > P1y1 && by < P1y2)))
hudakz 0:b07b507bad19 93 angle = 180 - angle;
hudakz 0:b07b507bad19 94 else
hudakz 0:b07b507bad19 95 if (by > 125 || by < 10) // I think this is where our problem is
hudakz 0:b07b507bad19 96 angle = -angle;
hudakz 0:b07b507bad19 97
hudakz 0:b07b507bad19 98 //P1 Scores
hudakz 0:b07b507bad19 99 else
hudakz 0:b07b507bad19 100 if (bx > 122) {
hudakz 0:b07b507bad19 101 P1S++;
hudakz 0:b07b507bad19 102 bx = 5;
hudakz 0:b07b507bad19 103 by = P1y1 + 8;
hudakz 0:b07b507bad19 104 hold = 1;
hudakz 0:b07b507bad19 105 h1 = 1;
hudakz 0:b07b507bad19 106 angle = rand() % 120 + 120 + 180;
hudakz 0:b07b507bad19 107
hudakz 0:b07b507bad19 108 //P2 Scores
hudakz 0:b07b507bad19 109 }
hudakz 0:b07b507bad19 110 else
hudakz 0:b07b507bad19 111 if (bx < 5) {
hudakz 0:b07b507bad19 112 P2S++;
hudakz 0:b07b507bad19 113 bx = 122;
hudakz 0:b07b507bad19 114 by = P2y1 + 8;
hudakz 0:b07b507bad19 115 hold = 1;
hudakz 0:b07b507bad19 116 h2 = 1;
hudakz 0:b07b507bad19 117 angle = rand() % 120 + 120;
hudakz 0:b07b507bad19 118 }
hudakz 0:b07b507bad19 119
hudakz 0:b07b507bad19 120 if (hold == 1 && h1 == 1) {
hudakz 0:b07b507bad19 121 bx = 6;
hudakz 0:b07b507bad19 122 by = P1y1 + 8;
hudakz 0:b07b507bad19 123 }
hudakz 0:b07b507bad19 124 else
hudakz 0:b07b507bad19 125 if (hold == 1 && h2 == 1) {
hudakz 0:b07b507bad19 126 bx = 121;
hudakz 0:b07b507bad19 127 by = P2y1 + 8;
hudakz 0:b07b507bad19 128 }
hudakz 0:b07b507bad19 129 else {
hudakz 0:b07b507bad19 130 bx = bx + speed * cos(angle * 2 * M_PI / 360);
hudakz 0:b07b507bad19 131 by = by - speed * sin(angle * 2 * M_PI / 360);
hudakz 0:b07b507bad19 132 }
hudakz 0:b07b507bad19 133
hudakz 0:b07b507bad19 134 // Print paddles and ball
hudakz 0:b07b507bad19 135 display.fillCircle(bx, by, 2, WHITE);
hudakz 0:b07b507bad19 136 display.fillRect(0, P1y1, 3, P1y2, WHITE);
hudakz 0:b07b507bad19 137 display.fillRect(124, P2y1, 127, P2y2, WHITE);
hudakz 0:b07b507bad19 138 display.fillRect(0, 9, 3, P1y1 - 1, 0);
hudakz 0:b07b507bad19 139 display.fillRect(0, P1y2 + 1, 3, 127, 0);
hudakz 0:b07b507bad19 140 display.fillRect(124, 9, 127, P2y1 - 1, 0);
hudakz 0:b07b507bad19 141 display.fillRect(124, P2y2 + 1, 127, 127, 0);
hudakz 0:b07b507bad19 142 display.fillRect(5, 8, 122, 8, WHITE);
hudakz 0:b07b507bad19 143
hudakz 0:b07b507bad19 144 // Print scores
hudakz 0:b07b507bad19 145 display.setCursor(2, 0);
hudakz 0:b07b507bad19 146
hudakz 0:b07b507bad19 147 //display.printf("P1: %d P2: %d", P1S, P2S);
hudakz 0:b07b507bad19 148 sprintf(score, "P1: %d P2: %d", P1S, P2S);
hudakz 0:b07b507bad19 149 display.print(score);
hudakz 0:b07b507bad19 150 wait(.005);
hudakz 0:b07b507bad19 151 }
hudakz 0:b07b507bad19 152 }