#include "scene/GameplayScene.hpp" #include "EnergyBarRaygui.hpp" #include "scene/DeathScene.hpp" #include "scene/SceneManager.hpp" #include void GameplayScene::Enter() { entities.clear(); entities.reserve(20); context = {}; collectedCount = 0; meterValue = 60.0f; context.onPlayerDeath = [this]() { // Inject the collected star count into the queued DeathScene by passing it // as a constructor argument. SceneManager::QueueSceneChange supports // forwarding constructor args. manager.QueueSceneChange(collectedCount, this->isMuted); }; context.AddCollectiblePickedListener([this](Entity &collectible) { collectedCount++; auto transform = collectible.GetComponent(); if (!transform || !context.entities) { return; } context.entities->emplace_back( CreateDebris(transform->get().x - 4.0f, transform->get().y, -22.0f, -36.0f)); context.entities->emplace_back( CreateDebris(transform->get().x + 4.0f, transform->get().y, 24.0f, -28.0f)); }); context.AddMeterChangedListener([this](float, float newValue) { meterValue = newValue; }); context.worldEntity = entities.emplace_back(CreateWorld()).get(); context.wellEntity = entities.emplace_back(CreateGravityWell()).get(); context.probeEntity = entities.emplace_back(CreateProbe()).get(); entities.emplace_back(CreateStar(900.0f, 230.0f)); entities.emplace_back(CreateNullZone(1280.0f, 120.0f)); context.statsEntity = entities.emplace_back(CreateStats()).get(); if (context.statsEntity) { auto stats = context.statsEntity->GetComponent(); if (stats) { meterValue = stats->get().value; } } context.entities = &entities; for (auto &entity : entities) { if (!entity) { continue; } entity->SetContext(&context); } } void GameplayScene::Exit() { entities.clear(); } void GameplayScene::Update(float dt) { UpdateAllSystems(entities, dt); } void GameplayScene::Draw() { for (auto &entity : entities) { if (!entity || entity->queuedForFree) { continue; } auto render = entity->GetComponent(); if (render) { render->get().Draw(); } } Scene::Draw(); }