diff options
Diffstat (limited to 'game/prefab/ZapperPoolScript.cpp')
-rw-r--r-- | game/prefab/ZapperPoolScript.cpp | 37 |
1 files changed, 24 insertions, 13 deletions
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 {}; } |