From d7464d1803b59fb2fa71888152b2051b10797e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Tue, 3 Jan 2023 13:03:37 +0100 Subject: [PATCH] SpaceInvaders: rocket survival fixed --- src/mode/SpaceInvaders/SpaceInvaders.h | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/mode/SpaceInvaders/SpaceInvaders.h b/src/mode/SpaceInvaders/SpaceInvaders.h index b4cd0f0..dea1ab1 100644 --- a/src/mode/SpaceInvaders/SpaceInvaders.h +++ b/src/mode/SpaceInvaders/SpaceInvaders.h @@ -46,9 +46,9 @@ private: public: explicit SpaceInvaders(Display *display) : - Mode(display), - invadersCountX(display->width / 3), - invadersCountY(display->height / 4) { + Mode(display), + invadersCountX(display->width / 3), + invadersCountY(display->height / 4) { swarmBegin = (Invader *) malloc(sizeof(Invader) * invadersCountX * invadersCountY); swarmEnd = swarmBegin + invadersCountX * invadersCountY; @@ -161,7 +161,7 @@ public: void shoot() { for (Rocket *rocket = rocketsBegin; rocket < rocketsEnd; rocket++) { - if (!rocket->alive) { + if (!rocket->alive && rocket->flash == 0) { rocket->alive = true; rocket->x = heroX; rocket->y = display->height - 2; @@ -171,20 +171,28 @@ public: void collide() { for (Rocket *rocket = rocketsBegin; rocket < rocketsEnd; rocket++) { + if (!rocket->alive) { + continue; + } for (Invader *invader = swarmBegin; invader < swarmEnd; invader++) { - if (invader->alive && rocket->alive && collide(rocket, invader)) { + if (!invader->alive) { + continue; + } + if (collide(rocket, invader)) { rocket->alive = false; rocket->flash = 1000; invader->alive = false; invadersAlive--; -// Serial.printf("Killed invader at (%2u/%2u): %2u/%2u alive.\n", invader->x, invader->y, invadersAlive, invadersCountX * invadersCountY); + break; } } } } bool collide(const Rocket *rocket, const Invader *invader) const { - return swarmY + invader->y * 2 == rocket->y && swarmX + invader->x * 3 <= rocket->x && rocket->x <= swarmX + invader->x * 3 + 1; + return swarmY + invader->y * 2 == rocket->y + && swarmX + invader->x * 3 <= rocket->x + && swarmX + invader->x * 3 + 1 >= rocket->x; } void draw() {