summaryrefslogtreecommitdiffhomepage
path: root/Spiral.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Spiral.cpp')
-rw-r--r--Spiral.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/Spiral.cpp b/Spiral.cpp
new file mode 100644
index 0000000..636a6b2
--- /dev/null
+++ b/Spiral.cpp
@@ -0,0 +1,50 @@
+#include "Spiral.h"
+
+#include <raylib.h>
+#include <cmath>
+
+
+SpiralSystem::SpiralSystem()
+{
+ m_bullets.reserve(RESERVED);
+}
+
+
+void
+SpiralSystem::update(const float dt)
+{
+ const int min_height = 0 - 3 * MARGIN;
+ const int max_height = GetScreenHeight() + MARGIN;
+ const int min_width = 0 - MARGIN;
+ const int max_width = GetScreenWidth() + MARGIN;
+ auto it = m_bullets.begin();
+ while (it != m_bullets.end()) {
+ auto& bullet = *it;
+ bullet.timer += dt;
+ if (bullet.timer > bullet.redirect_time) {
+ bullet.timer -= bullet.redirect_time;
+ bullet.angle = bullet.angle + bullet.redirect;
+ if (bullet.angle > 2.0)
+ bullet.angle -= 2.0;
+ bullet.redirect *= bullet.redirect_decrease;
+ }
+ float velovity_x = std::cos(angle * M_PI);
+ float velovity_y = std::sin(angle * M_PI);
+ bullet.position.x += velocity_x * dt;
+ bullet.position.y += velocity_y * dt;
+ const bool y_exceeded = bullet.position.y < min_height || bullet.position.y > max_height;
+ const bool x_exceeded = bullet.position.x < min_width || bullet.position.x > max_width;
+ if (y_exceeded || x_exceeded)
+ it = m_bullets.erase(it);
+ else
+ ++it;
+ }
+}
+
+
+void
+SpiralSystem::draw()
+{
+ for (const auto& bullet : m_bullets)
+ DrawCircle(bullet.position.x, bullet.position.y, bullet.radius, bullet.color);
+}