added helper menu

This commit is contained in:
2025-11-30 13:30:02 +01:00
parent 588f870b26
commit 55c40f0516
11 changed files with 272 additions and 26 deletions

View File

@ -20,6 +20,7 @@
#include "../GlobalState.h"
#include "../../graphics/renderers/RenderManager.h"
#include "../../graphics/ui/Font.h"
#include "../../graphics/ui/HelpOverlay.h"
#include "../../graphics/effects/Starfield3D.h"
#include "../../graphics/effects/Starfield.h"
#include "../../graphics/renderers/GameRenderer.h"
@ -351,9 +352,26 @@ bool ApplicationManager::initializeManagers() {
consume = true;
}
// N: Play a test sound effect
if (!consume && sc == SDL_SCANCODE_N) {
SoundEffectManager::instance().playSound("lets_go", 1.0f);
if (!consume && sc == SDL_SCANCODE_H) {
AppState currentState = m_stateManager ? m_stateManager->getState() : AppState::Loading;
if (currentState != AppState::Loading) {
m_showHelpOverlay = !m_showHelpOverlay;
if (currentState == AppState::Playing && m_game) {
if (m_showHelpOverlay) {
if (!m_game->isPaused()) {
m_game->setPaused(true);
m_helpOverlayPausedGame = true;
} else {
m_helpOverlayPausedGame = false;
}
} else if (m_helpOverlayPausedGame) {
m_game->setPaused(false);
m_helpOverlayPausedGame = false;
}
} else if (!m_showHelpOverlay) {
m_helpOverlayPausedGame = false;
}
}
consume = true;
}
}
@ -370,6 +388,7 @@ bool ApplicationManager::initializeManagers() {
m_inputManager->registerMouseButtonHandler([this](int button, bool pressed, float x, float y){
if (!m_stateManager) return;
if (m_showHelpOverlay) return;
SDL_Event ev{};
ev.type = pressed ? SDL_EVENT_MOUSE_BUTTON_DOWN : SDL_EVENT_MOUSE_BUTTON_UP;
ev.button.button = button;
@ -380,6 +399,7 @@ bool ApplicationManager::initializeManagers() {
m_inputManager->registerMouseMotionHandler([this](float x, float y, float dx, float dy){
if (!m_stateManager) return;
if (m_showHelpOverlay) return;
SDL_Event ev{};
ev.type = SDL_EVENT_MOUSE_MOTION;
ev.motion.x = int(x);
@ -594,6 +614,7 @@ bool ApplicationManager::initializeGame() {
m_stateContext.startLevelSelection = &m_startLevelSelection;
m_stateContext.hoveredButton = &m_hoveredButton;
m_stateContext.showSettingsPopup = &m_showSettingsPopup;
m_stateContext.showHelpOverlay = &m_showHelpOverlay;
m_stateContext.showExitConfirmPopup = &m_showExitConfirmPopup;
m_stateContext.exitPopupSelectedButton = &m_exitPopupSelectedButton;
m_stateContext.playerName = &m_playerName;
@ -1336,6 +1357,41 @@ void ApplicationManager::setupStateHandlers() {
m_stateManager->registerRenderHandler(AppState::Playing, debugOverlay);
m_stateManager->registerRenderHandler(AppState::GameOver, debugOverlay);
}
auto helpOverlayRender = [this](RenderManager& renderer) {
if (!m_showHelpOverlay || !m_stateContext.pixelFont) {
return;
}
SDL_Renderer* sdlRenderer = renderer.getSDLRenderer();
if (!sdlRenderer) {
return;
}
SDL_Rect logicalVP = renderer.getLogicalViewport();
float logicalScale = renderer.getLogicalScale();
SDL_SetRenderViewport(sdlRenderer, &logicalVP);
SDL_SetRenderScale(sdlRenderer, logicalScale, logicalScale);
HelpOverlay::Render(
sdlRenderer,
*m_stateContext.pixelFont,
static_cast<float>(Config::Logical::WIDTH),
static_cast<float>(Config::Logical::HEIGHT),
0.0f,
0.0f
);
SDL_SetRenderViewport(sdlRenderer, nullptr);
SDL_SetRenderScale(sdlRenderer, 1.0f, 1.0f);
};
if (m_stateManager) {
m_stateManager->registerRenderHandler(AppState::Loading, helpOverlayRender);
m_stateManager->registerRenderHandler(AppState::Menu, helpOverlayRender);
m_stateManager->registerRenderHandler(AppState::Options, helpOverlayRender);
m_stateManager->registerRenderHandler(AppState::LevelSelector, helpOverlayRender);
m_stateManager->registerRenderHandler(AppState::Playing, helpOverlayRender);
m_stateManager->registerRenderHandler(AppState::GameOver, helpOverlayRender);
}
}
void ApplicationManager::processEvents() {

View File

@ -94,6 +94,7 @@ private:
int m_startLevelSelection = 0;
int m_hoveredButton = -1;
bool m_showSettingsPopup = false;
bool m_showHelpOverlay = false;
bool m_showExitConfirmPopup = false;
int m_exitPopupSelectedButton = 1; // 0 = YES, 1 = NO
bool m_isFullscreen = false;
@ -140,6 +141,7 @@ private:
// Animation state
float m_logoAnimCounter = 0.0f;
bool m_helpOverlayPausedGame = false;
// Gameplay background (per-level) with fade, mirroring main.cpp behavior
SDL_Texture* m_levelBackgroundTex = nullptr;