Пытаюсь сам написать понг. Вот написал код для физики шарика и появляются баги, в виде не отскакивания мяча от стенок и пролёта сквозь них. Вот хочу узнать в чем может быть проблема. Мне кажется код работает слишком медленно и просто не успевает дойти до места, когда надо поменять траекторию полёта. И если я прав, то как тогда ускорить его? А это ещё не написан интеллект противника, на движения которого тоже будет тратиться время.
Знаю, код ужасен, пишу на ардуине чуть ли не в первый раз.
Ps на А0 джойстик, использую tft экран 80 на 160.
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
#define BoardColor 0x201f //цвет ракетки
#define backgroundColor 0x0000 //цвет фона
#define BallColor 0x07e3 //цвет мяча
#define indentPlayer 6 //отступ от края
#define WidthBoard 3 //ширина ракетки
#define HeightBoard 18 //высота ракетки
#define SpeedBoard 15 //скорость ракетки
#define SpeedBall 25 //скорость мяча
#define SizeBall 3 //размер мяча
int PlayerY;
int BotY;
int BallX;
int BallY;
unsigned long TimePlayer;
unsigned long TimeBot;
unsigned long TimeBall;
bool BallUp;
bool BallRight;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
void setup() {
tft.initR(INITR_MINI160x80_PLUGIN);
tft.setRotation(3);
start();
}
void loop() {
int joystick = analogRead(A0);
tft.fillRect (indentPlayer, PlayerY, WidthBoard, HeightBoard, BoardColor);
if (joystick > 1000 && millis() - TimePlayer > SpeedBoard && PlayerY >= 0 && PlayerY < 80 - HeightBoard){
PlayerY++;
tft.fillRect (indentPlayer, PlayerY-1, WidthBoard, 1, backgroundColor);
TimePlayer = millis();
}
if (joystick < 50 && millis() - TimePlayer > SpeedBoard && PlayerY > 0 && PlayerY <= 80 - HeightBoard){
PlayerY--;
tft.fillRect (indentPlayer, PlayerY + HeightBoard, WidthBoard, 1, backgroundColor);
TimePlayer = millis();
}
Ball();
Bot();
}
void Bot (){
}
void Ball (){
tft.fillRect (BallX, BallY, SizeBall, SizeBall, BallColor);
tft.drawRect (BallX-1, BallY-1, SizeBall+2, SizeBall+2, backgroundColor);
if (millis() - TimeBall > SpeedBall){
if (BallUp == 1) {
BallY--;
} else if (BallUp == 0) {
BallY++;
}
if (BallRight == 1) {
BallX++;
} else if (BallRight == 0) {
BallX--;
}
TimeBall = millis();
}
if (BallX <= -5 || BallX >= 160){start();}
if (BallY == 0 || BallY == 80 - SizeBall) BallUp = !BallUp;
if (BallY >= PlayerY && BallY <= PlayerY + HeightBoard && BallX == indentPlayer + WidthBoard) {
BallUp = !BallUp;
BallRight = !BallRight;
}
}
void start () {
delay (500);
tft.fillScreen(backgroundColor);
PlayerY = 82 - HeightBoard;
PlayerY = PlayerY / 2;
BotY = 82 - HeightBoard;
BotY = BotY / 2;
BallX = 60;
BallY = 40;
tft.fillRect (BallX, BallY, SizeBall, SizeBall, BallColor);
}