BouncingSquares were going offscreen

Taken the square size into consideration when generating the initial x/y pos and when bouncing off the right and bottom walls.
This commit is contained in:
Mike Causer 2021-10-16 03:02:11 +11:00
parent cf66382d75
commit 5ab429152e

View file

@ -8,14 +8,14 @@ uint16_t myRED = display->color565(255, 0, 0);
uint16_t myGREEN = display->color565(0, 255, 0); uint16_t myGREEN = display->color565(0, 255, 0);
uint16_t myBLUE = display->color565(0, 0, 255); uint16_t myBLUE = display->color565(0, 0, 255);
uint16_t colours[5] = { myDARK, myWHITE, myRED, myGREEN, myBLUE}; uint16_t colours[5] = { myDARK, myWHITE, myRED, myGREEN, myBLUE };
struct Square struct Square
{ {
float xpos, ypos; float xpos, ypos;
float velocityx; float velocityx;
float velocityy; float velocityy;
boolean xdir, ydir; boolean xdir, ydir;
uint16_t square_size; uint16_t square_size;
uint16_t colour; uint16_t colour;
}; };
@ -23,10 +23,10 @@ struct Square
const int numSquares = 25; const int numSquares = 25;
Square Squares[numSquares]; Square Squares[numSquares];
void setup() void setup()
{ {
// put your setup code here, to run once: // put your setup code here, to run once:
delay(1000); delay(1000);
Serial.begin(115200); Serial.begin(115200);
delay(200); delay(200);
@ -36,42 +36,49 @@ void setup()
mxconfig.clkphase = false; mxconfig.clkphase = false;
// OK, now we can create our matrix object // OK, now we can create our matrix object
display = new MatrixPanel_I2S_DMA(mxconfig); display = new MatrixPanel_I2S_DMA(mxconfig);
display->begin(); // setup display with pins as pre-defined in the library display->begin(); // setup display with pins as pre-defined in the library
// Create some Squares // Create some Squares
for (int i = 0; i < numSquares; i++) for (int i = 0; i < numSquares; i++)
{ {
Squares[i].xpos = random(0, display->width());
Squares[i].ypos = random(0, display->height());
Squares[i].velocityx = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
Squares[i].velocityy = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
//Squares[i].xdir = (random(2) == 1) ? true:false;
//Squares[i].ydir = (random(2) == 1) ? true:false;
Squares[i].square_size = random(2,10); Squares[i].square_size = random(2,10);
Squares[i].xpos = random(0, display->width() - Squares[i].square_size);
Squares[i].ypos = random(0, display->height() - Squares[i].square_size);
Squares[i].velocityx = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
Squares[i].velocityy = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
//Squares[i].xdir = (random(2) == 1) ? true:false;
//Squares[i].ydir = (random(2) == 1) ? true:false;
int random_num = random(6); int random_num = random(6);
Squares[i].colour = colours[random_num]; Squares[i].colour = colours[random_num];
} }
} }
void loop() void loop()
{ {
display->flipDMABuffer(); // not used if double buffering isn't enabled display->flipDMABuffer(); // not used if double buffering isn't enabled
delay(25); delay(25);
display->clearScreen(); display->clearScreen();
for (int i = 0; i < numSquares; i++) for (int i = 0; i < numSquares; i++)
{ {
// Draw rect and then calculatae // Draw rect and then calculatae
display->fillRect(Squares[i].xpos, Squares[i].ypos, Squares[i].square_size, Squares[i].square_size, Squares[i].colour); display->fillRect(Squares[i].xpos, Squares[i].ypos, Squares[i].square_size, Squares[i].square_size, Squares[i].colour);
if (Squares[i].xpos >= display->width()) { Squares[i].velocityx *= -1; } else if (Squares[i].xpos <= 0) { Squares[i].velocityx = abs (Squares[i].velocityx); } if (Squares[i].square_size + Squares[i].xpos >= display->width()) {
if (Squares[i].ypos >= display->height()) { Squares[i].velocityy *= -1; } else if (Squares[i].ypos <= 0) { Squares[i].velocityy = abs (Squares[i].velocityy); } Squares[i].velocityx *= -1;
} else if (Squares[i].xpos <= 0) {
Squares[i].velocityx = abs (Squares[i].velocityx);
}
Squares[i].xpos += Squares[i].velocityx ; if (Squares[i].square_size + Squares[i].ypos >= display->height()) {
Squares[i].ypos += Squares[i].velocityy ; Squares[i].velocityy *= -1;
} else if (Squares[i].ypos <= 0) {
Squares[i].velocityy = abs (Squares[i].velocityy);
}
Squares[i].xpos += Squares[i].velocityx;
Squares[i].ypos += Squares[i].velocityy;
} }
} }