aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2025-01-08 11:13:40 +0100
committerLoek Le Blansch <loek@pipeframe.xyz>2025-01-08 11:13:40 +0100
commit06d41eb2d58de21a8340ca59952b96cabc8caee6 (patch)
tree4daa9f74cb8a088ba17e54d52be307c5b917878f
parentb8acb539a3580bf0665fe435c55f33ba16cb507e (diff)
pooling working
-rw-r--r--game/prefab/ZapperObject.cpp10
-rw-r--r--game/prefab/ZapperPoolScript.cpp37
-rw-r--r--game/prefab/ZapperPoolScript.h11
-rw-r--r--game/prefab/ZapperPoolSubScene.cpp14
-rw-r--r--game/prefab/ZapperPoolSubScene.h8
5 files changed, 43 insertions, 37 deletions
diff --git a/game/prefab/ZapperObject.cpp b/game/prefab/ZapperObject.cpp
index 61681ae..712eca9 100644
--- a/game/prefab/ZapperObject.cpp
+++ b/game/prefab/ZapperObject.cpp
@@ -13,7 +13,7 @@ ZapperObject::ZapperObject(crepe::GameObject && base)
Sprite::Data {
.sorting_in_layer = SORT_IN_LAY_OBSTACLES,
.order_in_layer = 1,
- .size = vec2(0, 42) * SCALE,
+ .size = vec2(0, 50) * SCALE,
}
),
.orb_end = add_component<Sprite>(
@@ -22,7 +22,7 @@ ZapperObject::ZapperObject(crepe::GameObject && base)
.flip = {true, true},
.sorting_in_layer = SORT_IN_LAY_OBSTACLES,
.order_in_layer = 1,
- .size = vec2(0, 42) * SCALE,
+ .size = vec2(0, 50) * SCALE,
}
),
.glow_start = add_component<Sprite>(
@@ -81,10 +81,12 @@ ZapperObject::ZapperObject(crepe::GameObject && base)
})},
collider {add_component<BoxCollider>(vec2(0, 0))} {
this->set_active(false);
- Log::logf(Log::DEBUG, "creating zapper");
+ Log::logf(Log::DEBUG, "Creating zapper");
}
void ZapperObject::place(const crepe::vec2 & position, float rotation, float length) {
+ Log::logf(Log::DEBUG, "Placing zapper [position = {}, rotation = {}, length = {}]", position, rotation, length);
+
this->transform.position = position;
this->transform.rotation = rotation;
@@ -98,6 +100,8 @@ void ZapperObject::place(const crepe::vec2 & position, float rotation, float len
this->sprite.beam.data.size.x = length;
this->collider.dimensions = offset.rotate(rotation) * 2 + vec2(30, 30) * SCALE;
+
+ this->set_active(true);
}
void ZapperObject::set_active(bool active) {
diff --git a/game/prefab/ZapperPoolScript.cpp b/game/prefab/ZapperPoolScript.cpp
index c6ce1e7..812024b 100644
--- a/game/prefab/ZapperPoolScript.cpp
+++ b/game/prefab/ZapperPoolScript.cpp
@@ -10,37 +10,48 @@
using namespace crepe;
using namespace std;
-ZapperPoolScript::ZapperPoolScript(ZapperPoolSubScene & pool) : pool(pool) {}
+ZapperPoolScript::ZapperPoolScript(std::vector<ZapperObject> && pool) : pool(pool) {}
void ZapperPoolScript::init() {
subscribe<CreateZapperEvent>([this](const CreateZapperEvent &) {
this->spawn_random();
return true;
});
+
+ camera_transform = get_components_by_name<Transform>(CAMERA_NAME).back();
+ camera_camera = get_components_by_name<Camera>(CAMERA_NAME).back();
}
void ZapperPoolScript::fixed_update(crepe::duration_t) {
- if (i++ < 80) return;
- i = 0;
+ for (ZapperObject & zapper : this->pool) {
+ if (!zapper.active) continue;
+
+ if (zapper.transform.position.x < camera_transform->position.x)
+ zapper.set_active(false);
+ }
+
+ if (i-- > 0) return;
+ i = 200;
queue_event<CreateZapperEvent>();
}
void ZapperPoolScript::spawn_random() {
- OptionalRef<ZapperObject> zapper = pool.get_next_zapper();
+ OptionalRef<ZapperObject> zapper = this->get_next_zapper();
if (!zapper) return; // pool exhausted
- vec2 pos = this->get_camera_pos();
- pos.y = Random::f(0.5, -0.5) * HALLWAY_HEIGHT;
+ vec2 pos = {
+ .x = camera_transform->position.x + camera_camera->viewport_size.x / 2,
+ .y = Random::f(0.5, -0.5) * HALLWAY_HEIGHT,
+ };
zapper->place(pos, 0, Random::f(400, 200));
- logf(Log::DEBUG, "Spawning random zapper at {}", pos);
}
-vec2 ZapperPoolScript::get_camera_pos() {
- Transform & transform = get_components_by_name<Transform>(CAMERA_NAME).back();
- Camera & camera = get_components_by_name<Camera>(CAMERA_NAME).back();
-
- // right middle edge position
- return transform.position + vec2(camera.viewport_size.x / 2, 0);
+OptionalRef<ZapperObject> ZapperPoolScript::get_next_zapper() {
+ for (ZapperObject & zapper : this->pool) {
+ if (zapper.active) continue;
+ return zapper;
+ }
+ return {};
}
diff --git a/game/prefab/ZapperPoolScript.h b/game/prefab/ZapperPoolScript.h
index 7c4701c..5daba79 100644
--- a/game/prefab/ZapperPoolScript.h
+++ b/game/prefab/ZapperPoolScript.h
@@ -2,11 +2,14 @@
#include <crepe/api/Script.h>
+#include "ZapperObject.h"
+#include "util/OptionalRef.h"
+
class ZapperPoolSubScene;
class ZapperPoolScript : public crepe::Script {
public:
- ZapperPoolScript(ZapperPoolSubScene & pool);
+ ZapperPoolScript(std::vector<ZapperObject> && pool);
void init();
void fixed_update(crepe::duration_t);
@@ -14,10 +17,12 @@ public:
unsigned i = 0;
private:
- ZapperPoolSubScene & pool;
+ std::vector<ZapperObject> pool;
private:
- crepe::vec2 get_camera_pos();
+ crepe::OptionalRef<crepe::Transform> camera_transform;
+ crepe::OptionalRef<crepe::Camera> camera_camera;
+ crepe::OptionalRef<ZapperObject> get_next_zapper();
private:
void spawn_random();
diff --git a/game/prefab/ZapperPoolSubScene.cpp b/game/prefab/ZapperPoolSubScene.cpp
index d7d30ea..923ed57 100644
--- a/game/prefab/ZapperPoolSubScene.cpp
+++ b/game/prefab/ZapperPoolSubScene.cpp
@@ -8,18 +8,12 @@ using namespace std;
ZapperPoolSubScene::ZapperPoolSubScene(Scene & scene)
: controller { scene.new_object("controller") } {
- this->controller.add_component<BehaviorScript>().set_script<ZapperPoolScript>(*this);
Log::logf(Log::DEBUG, "Building zapper pool...");
+ vector<ZapperObject> pool;
for (size_t i = 0; i < this->POOL_SIZE; i++)
- zappers.emplace_back(scene.new_object("zapper"));
-}
-
-OptionalRef<ZapperObject> ZapperPoolSubScene::get_next_zapper() {
- for (ZapperObject & zapper : this->zappers) {
- if (!zapper.active) continue;
- return zapper;
- }
- return {};
+ pool.emplace_back(scene.new_object("zapper"));
+ BehaviorScript & behavior = this->controller.add_component<BehaviorScript>();
+ behavior.set_script<ZapperPoolScript>(std::move(pool));
}
diff --git a/game/prefab/ZapperPoolSubScene.h b/game/prefab/ZapperPoolSubScene.h
index 25328ee..f930e22 100644
--- a/game/prefab/ZapperPoolSubScene.h
+++ b/game/prefab/ZapperPoolSubScene.h
@@ -1,14 +1,10 @@
#pragma once
-#include <vector>
-
#include <crepe/api/Scene.h>
#include <crepe/api/GameObject.h>
#include <crepe/api/Event.h>
#include <crepe/util/OptionalRef.h>
-#include "ZapperObject.h"
-
class CreateZapperEvent : public crepe::Event {};
class ZapperPoolSubScene {
@@ -17,11 +13,7 @@ public:
private:
crepe::GameObject controller;
- std::vector<ZapperObject> zappers;
private:
static constexpr size_t POOL_SIZE = 4;
-
-public:
- crepe::OptionalRef<ZapperObject> get_next_zapper();
};