From 6d69c8ef6b663bd6716b441cc7d01164c7e33dfc Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Tue, 7 Jan 2025 13:04:49 +0100 Subject: more WIP zapperpool --- game/prefab/ZapperPoolSubScene.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 game/prefab/ZapperPoolSubScene.h (limited to 'game/prefab/ZapperPoolSubScene.h') diff --git a/game/prefab/ZapperPoolSubScene.h b/game/prefab/ZapperPoolSubScene.h new file mode 100644 index 0000000..79598ce --- /dev/null +++ b/game/prefab/ZapperPoolSubScene.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include +#include + +#include "ZapperObject.h" + +class ZapperPoolSubScene { +public: + ZapperPoolSubScene(crepe::Scene & scene); + +public: + crepe::GameObject controller; + std::vector zappers; + +private: + static constexpr size_t POOL_SIZE = 4; + +}; -- cgit v1.2.3 From 06d41eb2d58de21a8340ca59952b96cabc8caee6 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Wed, 8 Jan 2025 11:13:40 +0100 Subject: pooling working --- game/prefab/ZapperObject.cpp | 10 +++++++--- game/prefab/ZapperPoolScript.cpp | 37 ++++++++++++++++++++++++------------- game/prefab/ZapperPoolScript.h | 11 ++++++++--- game/prefab/ZapperPoolSubScene.cpp | 14 ++++---------- game/prefab/ZapperPoolSubScene.h | 8 -------- 5 files changed, 43 insertions(+), 37 deletions(-) (limited to 'game/prefab/ZapperPoolSubScene.h') 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( @@ -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( @@ -81,10 +81,12 @@ ZapperObject::ZapperObject(crepe::GameObject && base) })}, collider {add_component(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 && pool) : pool(pool) {} void ZapperPoolScript::init() { subscribe([this](const CreateZapperEvent &) { this->spawn_random(); return true; }); + + camera_transform = get_components_by_name(CAMERA_NAME).back(); + camera_camera = get_components_by_name(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(); } void ZapperPoolScript::spawn_random() { - OptionalRef zapper = pool.get_next_zapper(); + OptionalRef 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(CAMERA_NAME).back(); - Camera & camera = get_components_by_name(CAMERA_NAME).back(); - - // right middle edge position - return transform.position + vec2(camera.viewport_size.x / 2, 0); +OptionalRef 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 +#include "ZapperObject.h" +#include "util/OptionalRef.h" + class ZapperPoolSubScene; class ZapperPoolScript : public crepe::Script { public: - ZapperPoolScript(ZapperPoolSubScene & pool); + ZapperPoolScript(std::vector && pool); void init(); void fixed_update(crepe::duration_t); @@ -14,10 +17,12 @@ public: unsigned i = 0; private: - ZapperPoolSubScene & pool; + std::vector pool; private: - crepe::vec2 get_camera_pos(); + crepe::OptionalRef camera_transform; + crepe::OptionalRef camera_camera; + crepe::OptionalRef 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().set_script(*this); Log::logf(Log::DEBUG, "Building zapper pool..."); + vector pool; for (size_t i = 0; i < this->POOL_SIZE; i++) - zappers.emplace_back(scene.new_object("zapper")); -} - -OptionalRef 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(); + behavior.set_script(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 - #include #include #include #include -#include "ZapperObject.h" - class CreateZapperEvent : public crepe::Event {}; class ZapperPoolSubScene { @@ -17,11 +13,7 @@ public: private: crepe::GameObject controller; - std::vector zappers; private: static constexpr size_t POOL_SIZE = 4; - -public: - crepe::OptionalRef get_next_zapper(); }; -- cgit v1.2.3