acidportal- 😈 Worlds smallest Evil Portal on a LilyGo T-QT |
git clone git://git.acid.vegas/acidportal.git |
Log | Files | Refs | Archive | README | LICENSE |
Pong_v3.ino (4912B)
1 /* 2 * Pong 3 * Original Code from https://github.com/rparrett/pongclock 4 * 5 */ 6 7 #define BLACK 0x0000 8 #define WHITE 0xFFFF 9 #define GREY 0x5AEB 10 11 #include <TFT_eSPI.h> // Graphics and font library for ST7735 driver chip 12 #include <SPI.h> 13 14 TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h 15 16 int16_t h = 128; 17 int16_t w = 160; 18 19 int dly = 10; 20 21 int16_t paddle_h = 25; 22 int16_t paddle_w = 2; 23 24 int16_t lpaddle_x = 0; 25 int16_t rpaddle_x = w - paddle_w; 26 27 int16_t lpaddle_y = 0; 28 int16_t rpaddle_y = h - paddle_h; 29 30 int16_t lpaddle_d = 1; 31 int16_t rpaddle_d = -1; 32 33 int16_t lpaddle_ball_t = w - w / 4; 34 int16_t rpaddle_ball_t = w / 4; 35 36 int16_t target_y = 0; 37 38 int16_t ball_x = 2; 39 int16_t ball_y = 2; 40 int16_t oldball_x = 2; 41 int16_t oldball_y = 2; 42 43 int16_t ball_dx = 1; 44 int16_t ball_dy = 1; 45 46 int16_t ball_w = 4; 47 int16_t ball_h = 4; 48 49 int16_t dashline_h = 4; 50 int16_t dashline_w = 2; 51 int16_t dashline_n = h / dashline_h; 52 int16_t dashline_x = w / 2 - 1; 53 int16_t dashline_y = dashline_h / 2; 54 55 int16_t lscore = 12; 56 int16_t rscore = 4; 57 58 void setup(void) { 59 60 randomSeed(analogRead(0)*analogRead(1)); 61 62 tft.init(); 63 64 tft.setRotation(1); 65 66 tft.fillScreen(BLACK); 67 68 initgame(); 69 70 tft.setTextColor(WHITE, BLACK); 71 72 delay(2000); 73 74 } 75 76 void loop() { 77 delay(dly); 78 79 lpaddle(); 80 rpaddle(); 81 82 midline(); 83 84 ball(); 85 } 86 87 void initgame() { 88 lpaddle_y = random(0, h - paddle_h); 89 rpaddle_y = random(0, h - paddle_h); 90 91 // ball is placed on the center of the left paddle 92 ball_y = lpaddle_y + (paddle_h / 2); 93 94 calc_target_y(); 95 96 midline(); 97 98 tft.fillRect(0,h-26,w,h-1,BLACK); 99 100 tft.setTextDatum(TC_DATUM); 101 tft.setTextColor(WHITE); 102 tft.drawString("TFT_eSPI example", w/2, h-26 , 2); 103 } 104 105 void midline() { 106 107 // If the ball is not on the line then don't redraw the line 108 if ((ball_x<dashline_x-ball_w) && (ball_x > dashline_x+dashline_w)) return; 109 110 tft.startWrite(); 111 112 // Quick way to draw a dashed line 113 tft.setAddrWindow(dashline_x, 0, dashline_w, h); 114 115 for(int16_t i = 0; i < dashline_n; i+=2) { 116 tft.pushColor(WHITE, dashline_w*dashline_h); // push dash pixels 117 tft.pushColor(BLACK, dashline_w*dashline_h); // push gap pixels 118 } 119 120 tft.endWrite(); 121 } 122 123 void lpaddle() { 124 125 if (lpaddle_d == 1) { 126 tft.fillRect(lpaddle_x, lpaddle_y, paddle_w, 1, BLACK); 127 } 128 else if (lpaddle_d == -1) { 129 tft.fillRect(lpaddle_x, lpaddle_y + paddle_h - 1, paddle_w, 1, BLACK); 130 } 131 132 lpaddle_y = lpaddle_y + lpaddle_d; 133 134 if (ball_dx == 1) lpaddle_d = 0; 135 else { 136 if (lpaddle_y + paddle_h / 2 == target_y) lpaddle_d = 0; 137 else if (lpaddle_y + paddle_h / 2 > target_y) lpaddle_d = -1; 138 else lpaddle_d = 1; 139 } 140 141 if (lpaddle_y + paddle_h >= h && lpaddle_d == 1) lpaddle_d = 0; 142 else if (lpaddle_y <= 0 && lpaddle_d == -1) lpaddle_d = 0; 143 144 tft.fillRect(lpaddle_x, lpaddle_y, paddle_w, paddle_h, WHITE); 145 } 146 147 void rpaddle() { 148 149 if (rpaddle_d == 1) { 150 tft.fillRect(rpaddle_x, rpaddle_y, paddle_w, 1, BLACK); 151 } 152 else if (rpaddle_d == -1) { 153 tft.fillRect(rpaddle_x, rpaddle_y + paddle_h - 1, paddle_w, 1, BLACK); 154 } 155 156 rpaddle_y = rpaddle_y + rpaddle_d; 157 158 if (ball_dx == -1) rpaddle_d = 0; 159 else { 160 if (rpaddle_y + paddle_h / 2 == target_y) rpaddle_d = 0; 161 else if (rpaddle_y + paddle_h / 2 > target_y) rpaddle_d = -1; 162 else rpaddle_d = 1; 163 } 164 165 if (rpaddle_y + paddle_h >= h && rpaddle_d == 1) rpaddle_d = 0; 166 else if (rpaddle_y <= 0 && rpaddle_d == -1) rpaddle_d = 0; 167 168 tft.fillRect(rpaddle_x, rpaddle_y, paddle_w, paddle_h, WHITE); 169 } 170 171 void calc_target_y() { 172 int16_t target_x; 173 int16_t reflections; 174 int16_t y; 175 176 if (ball_dx == 1) { 177 target_x = w - ball_w; 178 } 179 else { 180 target_x = -1 * (w - ball_w); 181 } 182 183 y = abs(target_x * (ball_dy / ball_dx) + ball_y); 184 185 reflections = floor(y / h); 186 187 if (reflections % 2 == 0) { 188 target_y = y % h; 189 } 190 else { 191 target_y = h - (y % h); 192 } 193 } 194 195 void ball() { 196 ball_x = ball_x + ball_dx; 197 ball_y = ball_y + ball_dy; 198 199 if (ball_dx == -1 && ball_x == paddle_w && ball_y + ball_h >= lpaddle_y && ball_y <= lpaddle_y + paddle_h) { 200 ball_dx = ball_dx * -1; 201 dly = random(5); // change speed of ball after paddle contact 202 calc_target_y(); 203 } else if (ball_dx == 1 && ball_x + ball_w == w - paddle_w && ball_y + ball_h >= rpaddle_y && ball_y <= rpaddle_y + paddle_h) { 204 ball_dx = ball_dx * -1; 205 dly = random(5); // change speed of ball after paddle contact 206 calc_target_y(); 207 } else if ((ball_dx == 1 && ball_x >= w) || (ball_dx == -1 && ball_x + ball_w < 0)) { 208 dly = 5; 209 } 210 211 if (ball_y > h - ball_w || ball_y < 0) { 212 ball_dy = ball_dy * -1; 213 ball_y += ball_dy; // Keep in bounds 214 } 215 216 //tft.fillRect(oldball_x, oldball_y, ball_w, ball_h, BLACK); 217 tft.drawRect(oldball_x, oldball_y, ball_w, ball_h, BLACK); // Less TFT refresh aliasing than line above for large balls 218 tft.fillRect( ball_x, ball_y, ball_w, ball_h, WHITE); 219 oldball_x = ball_x; 220 oldball_y = ball_y; 221 } 222