diff options
author | Loek Le Blansch <loek@pipeframe.xyz> | 2025-01-08 11:13:40 +0100 |
---|---|---|
committer | Loek Le Blansch <loek@pipeframe.xyz> | 2025-01-08 11:13:40 +0100 |
commit | 06d41eb2d58de21a8340ca59952b96cabc8caee6 (patch) | |
tree | 4daa9f74cb8a088ba17e54d52be307c5b917878f | |
parent | b8acb539a3580bf0665fe435c55f33ba16cb507e (diff) |
pooling working
-rw-r--r-- | game/prefab/ZapperObject.cpp | 10 | ||||
-rw-r--r-- | game/prefab/ZapperPoolScript.cpp | 37 | ||||
-rw-r--r-- | game/prefab/ZapperPoolScript.h | 11 | ||||
-rw-r--r-- | game/prefab/ZapperPoolSubScene.cpp | 14 | ||||
-rw-r--r-- | game/prefab/ZapperPoolSubScene.h | 8 |
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(); }; |