Как ускорить код?

,

Пытаюсь сам написать понг. Вот написал код для физики шарика и появляются баги, в виде не отскакивания мяча от стенок и пролёта сквозь них. Вот хочу узнать в чем может быть проблема. Мне кажется код работает слишком медленно и просто не успевает дойти до места, когда надо поменять траекторию полёта. И если я прав, то как тогда ускорить его? А это ещё не написан интеллект противника, на движения которого тоже будет тратиться время.
Знаю, код ужасен, пишу на ардуине чуть ли не в первый раз.
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);
}


И сразу хотите Doom написать на 8-битном МК с универсальной учебной библиотекой экрана?

Запустите экзамплы к ней и оцените - работает ли она быстро, в принципе.

PS. Сразу не сообразил… Какая предполагается связь между скоростью обработки информации и ошибкой вычисления координат, если МК однопоточный?

1 лайк

Наигрался я в этот экранчик!, тут где то была тема. Суть к примеру: мячик отрисовываем РАЗ в 20-50 миллисекунд и в этот же раз считаем его новое положение. Т.е. старое в границах мячика затёрли, новое нарисовали.

аххаха даже смешно, что всё настолько просто оказалось, код как раз выполняется достаточно быстро и с библиотекой всё ок, просто за то время, что шар находится на координатах края экрана код выполняется 2, а то и 3 раза и флажок, отвечающий за направление, поднимается и сразу опускается. Я потратил на решение этой проблемы несколько часов, уже подумал, что надо писать свою библиотеку иначе никак, а проблема заключалась в отсутствии одной задержки.

То есть тему надо поменять на Как замедлить код ???

1 лайк

именно так

простите, но ведь бред же!

Если у вас один и тот же код считает и движения шарика и реакцию на него - ситуация что одна часть не успевает за другой в принципе невозможна.
Вывод -у вас просто очень кривой код

1 лайк