cs381/as6/GameContext.hpp

80 lines
2.2 KiB
C++

#pragma once
#include <functional>
#include <memory>
#include <vector>
struct Entity;
/**
* Shared state for one gameplay scene instance.
*/
struct GameContext {
/**
* @brief Pointer to the entity list owned by the active gameplay scene.
*/
std::vector<std::shared_ptr<Entity>> *entities = nullptr;
/** @brief World entity (scroll/spawn owner). */
Entity *worldEntity = nullptr;
/** @brief Gravity well entity. */
Entity *wellEntity = nullptr;
/** @brief Player probe entity. */
Entity *probeEntity = nullptr;
/** @brief HUD entity. */
Entity *hudEntity = nullptr;
/** @brief Shared horizontal world scroll value. */
float scrollX = 0.0f;
/** @brief Optional callback invoked when the probe dies. */
std::function<void()> onPlayerDeath;
/** @brief Callbacks fired whenever a collectible is picked up. */
std::vector<std::function<void(Entity &)>> collectiblePickedListeners;
/** @brief Callbacks fired whenever meter value changes. */
std::vector<std::function<void(float, float)>> meterChangedListeners;
/**
* Registers a collectible pickup listener.
*
* @param listener Callback receiving the collected entity.
*/
void AddCollectiblePickedListener(std::function<void(Entity &)> listener) {
collectiblePickedListeners.push_back(std::move(listener));
}
/**
* Emits collectible pickup event.
*
* @param collectible The collected entity.
*/
void EmitCollectiblePicked(Entity &collectible) {
for (auto &listener : collectiblePickedListeners) {
listener(collectible);
}
}
/**
* Registers a meter changed listener.
*
* @param listener Callback receiving old value then new value.
*/
void AddMeterChangedListener(std::function<void(float, float)> listener) {
meterChangedListeners.push_back(std::move(listener));
}
/**
* Emits meter changed event.
*
* @param oldValue Meter value before mutation.
* @param newValue Meter value after mutation.
*/
void EmitMeterChanged(float oldValue, float newValue) {
for (auto &listener : meterChangedListeners) {
listener(oldValue, newValue);
}
}
};