#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#define TFT_DC 2
#define TFT_CS 3
#define JOY_Y A0
#define JOY_SW 5
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// положение
int paddleY = 100; // позиция ракетки
int oldPaddleY = 100;
int ballX = 160, ballY = 120;
int oldBallX = 160, oldBallY = 120;
int ballDX = -3, ballDY = 2;
void setup() {
pinMode(JOY_Y, INPUT);
pinMode(JOY_SW, INPUT_PULLUP);
tft.begin();
tft.fillScreen(ILI9341_BLACK);
// первый раз рисуем ракетку и мяч
tft.fillRect(10, paddleY, 10, 40, ILI9341_WHITE);
tft.fillCircle(ballX, ballY, 5, ILI9341_RED);
}
void loop() {
// читаем джойстик
// читаем джойстик
int joyVal = analogRead(JOY_Y);
// реверс: теперь вниз на джойстике = вниз на экране
int delta = joyVal - 512; // отклонение от центра
// чувствительность (чем меньше divisor, тем резче движение)
if (abs(delta) > 100) { // "мёртвая зона" в центре
paddleY += delta / 100; // шаг движения
}
// ограничение по экрану
if (paddleY < 0) paddleY = 0;
if (paddleY > 240 - 40) paddleY = 240 - 40;
// стираем старую ракетку
if (paddleY != oldPaddleY) {
tft.fillRect(10, oldPaddleY, 10, 40, ILI9341_BLACK);
tft.fillRect(10, paddleY, 10, 40, ILI9341_WHITE);
oldPaddleY = paddleY;
}
// движение мяча
ballX += ballDX;
ballY += ballDY;
// стираем старый мяч
tft.fillCircle(oldBallX, oldBallY, 5, ILI9341_BLACK);
// отражение от верх/низ
if (ballY <= 5 || ballY >= 235) {
ballDY = -ballDY;
}
// проверка столкновения с ракеткой
if (ballX <= 20) {
if (ballY >= paddleY && ballY <= paddleY + 40) {
ballDX = -ballDX; // отскок
// перерисуем ракетку, чтобы не было "дыры"
tft.fillRect(10, paddleY, 10, 40, ILI9341_WHITE);
} else {
// проигрыш
tft.setCursor(50, 120);
tft.setTextColor(ILI9341_RED);
tft.setTextSize(3);
tft.println("GAME OVER");
delay(2000);
// сброс
ballX = 160; ballY = 120;
ballDX = -3; ballDY = 2;
}
}
// добавим заднюю стенку справа
if (ballX >= 235) {
ballDX = -ballDX;
}
// рисуем новый мяч
tft.fillCircle(ballX, ballY, 5, ILI9341_RED);
oldBallX = ballX;
oldBallY = ballY;
delay(60); // скорость игры
}