From 8a549d14dc1805f51aedc4477549486a46d6f529 Mon Sep 17 00:00:00 2001 From: Gregor Klevze Date: Sat, 6 Dec 2025 18:18:27 +0100 Subject: [PATCH] Fixed menu --- src/graphics/effects/SpaceWarp.cpp | 27 +++++++++++++++++++++------ src/graphics/renderers/UIRenderer.cpp | 6 +++++- src/states/MenuState.cpp | 27 ++++++++++++++++++--------- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/graphics/effects/SpaceWarp.cpp b/src/graphics/effects/SpaceWarp.cpp index e735c1e..89d03f6 100644 --- a/src/graphics/effects/SpaceWarp.cpp +++ b/src/graphics/effects/SpaceWarp.cpp @@ -77,13 +77,28 @@ void SpaceWarp::setAutoPilotEnabled(bool enabled) { } void SpaceWarp::scheduleNewAutoTarget() { - motionTarget.forwardScale = randomRange(0.82f, 1.28f); - if (randomRange(0.0f, 1.0f) < 0.12f) { - motionTarget.forwardScale = -randomRange(0.35f, 0.85f); + // Autopilot behavior: + // - 90% of the time: gentle forward flight with small lateral/vertical drift + // - 10% of the time: short lateral "bank" burst (stronger lateral speed) for a while + float choice = randomRange(0.0f, 1.0f); + if (choice < 0.90f) { + // Normal forward flight + motionTarget.forwardScale = randomRange(0.95f, 1.12f); + motionTarget.lateralSpeed = randomRange(-0.18f, 0.18f); + motionTarget.verticalSpeed = randomRange(-0.12f, 0.12f); + // Longer interval between aggressive maneuvers + autoTimer = randomRange(autoMinInterval, autoMaxInterval); + } else { + // Occasional lateral bank burst + motionTarget.forwardScale = randomRange(0.90f, 1.10f); + // Pick left or right burst + float dir = (randomRange(0.0f, 1.0f) < 0.5f) ? -1.0f : 1.0f; + motionTarget.lateralSpeed = dir * randomRange(0.70f, 1.35f); + // Allow modest vertical bias during a bank + motionTarget.verticalSpeed = randomRange(-0.35f, 0.35f); + // Shorter duration for the burst so it feels like a brief maneuver + autoTimer = randomRange(1.0f, 3.0f); } - motionTarget.lateralSpeed = randomRange(-1.35f, 1.35f); - motionTarget.verticalSpeed = randomRange(-0.75f, 0.75f); - autoTimer = randomRange(autoMinInterval, autoMaxInterval); } void SpaceWarp::spawnComet() { diff --git a/src/graphics/renderers/UIRenderer.cpp b/src/graphics/renderers/UIRenderer.cpp index 537cbfa..e86e754 100644 --- a/src/graphics/renderers/UIRenderer.cpp +++ b/src/graphics/renderers/UIRenderer.cpp @@ -108,7 +108,11 @@ void UIRenderer::drawButton(SDL_Renderer* renderer, FontAtlas* font, float cx, f font->measure(label, textScale, textW, textH); float tx = x + (w - static_cast(textW)) * 0.5f; // Adjust vertical position for better alignment with background buttons - float ty = y + (h - static_cast(textH)) * 0.5f + 2.0f; + // Vertically center text precisely within the button + // Vertically center text precisely within the button, then nudge down slightly + // to improve optical balance relative to icons and button art. + const float textNudge = 3.0f; // tweak this value to move labels up/down + float ty = y + (h - static_cast(textH)) * 0.5f + textNudge; // Choose text color based on selection state SDL_Color textColor = {255, 255, 255, 255}; // Default white diff --git a/src/states/MenuState.cpp b/src/states/MenuState.cpp index f995bdc..ca02702 100644 --- a/src/states/MenuState.cpp +++ b/src/states/MenuState.cpp @@ -30,6 +30,10 @@ // This avoids renderer readback / surface APIs which aren't portable across SDL3 builds. static void renderBackdropBlur(SDL_Renderer* renderer, const SDL_Rect& logicalVP, float logicalScale, float panelTop, float panelH, SDL_Texture* sceneTex, int sceneW, int sceneH) { if (!renderer) return; + // Preserve previous draw blend mode so callers don't get surprised when + // the helper early-returns or changes blend state. + SDL_BlendMode prevBlendMode = SDL_BLENDMODE_NONE; + SDL_GetRenderDrawBlendMode(renderer, &prevBlendMode); // If we don't have a captured scene texture, fall back to the frosted tint. if (!sceneTex || sceneW <= 0 || sceneH <= 0) { float viewportLogicalW = (float)logicalVP.w / logicalScale; @@ -43,7 +47,8 @@ static void renderBackdropBlur(SDL_Renderer* renderer, const SDL_Rect& logicalVP SDL_SetRenderDrawColor(renderer, 16, 24, 32, 12); SDL_FRect shadow{ 0.0f, panelTop + panelH - std::max(2.0f, panelH * 0.06f), viewportLogicalW, std::max(2.0f, panelH * 0.06f) }; SDL_RenderFillRect(renderer, &shadow); - SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE); + // Restore previous blend mode + SDL_SetRenderDrawBlendMode(renderer, prevBlendMode); return; } @@ -67,7 +72,7 @@ static void renderBackdropBlur(SDL_Renderer* renderer, const SDL_Rect& logicalVP SDL_SetRenderDrawColor(renderer, 200, 210, 220, 48); SDL_FRect base{ 0.0f, panelTop, viewportLogicalW, panelH }; SDL_RenderFillRect(renderer, &base); - SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE); + SDL_SetRenderDrawBlendMode(renderer, prevBlendMode); return; } @@ -95,6 +100,8 @@ static void renderBackdropBlur(SDL_Renderer* renderer, const SDL_Rect& logicalVP // Cleanup SDL_DestroyTexture(small); + // Restore previous blend mode so caller drawing is unaffected + SDL_SetRenderDrawBlendMode(renderer, prevBlendMode); } MenuState::MenuState(StateContext& ctx) : State(ctx) {} @@ -113,7 +120,7 @@ void MenuState::renderMainButtonTop(SDL_Renderer* renderer, float logicalScale, const float LOGICAL_W = 1200.f; const float LOGICAL_H = 1000.f; float contentOffsetX = 0.0f; - float contentOffsetY = 0.0f; + float contentOffsetY = 20.0f; UIRenderer::computeContentOffsets((float)logicalVP.w, (float)logicalVP.h, LOGICAL_W, LOGICAL_H, logicalScale, contentOffsetX, contentOffsetY); float contentW = LOGICAL_W * logicalScale; @@ -124,7 +131,7 @@ void MenuState::renderMainButtonTop(SDL_Renderer* renderer, float logicalScale, // move buttons a bit lower for better visibility // small global vertical offset for the whole menu (tweak to move UI down) float menuYOffset = LOGICAL_H * 0.03f; - float btnY = LOGICAL_H * 0.865f + contentOffsetY + (LOGICAL_H * 0.02f) + menuYOffset; + float btnY = LOGICAL_H * 0.865f + contentOffsetY + (LOGICAL_H * 0.02f) + menuYOffset + 45.0f; // Compose same button definition used in render() char levelBtnText[32]; @@ -151,13 +158,15 @@ void MenuState::renderMainButtonTop(SDL_Renderer* renderer, float logicalScale, float halfSpan = 1.5f * spacing; // covers from leftmost to rightmost button centers float panelLeft = groupCenterX - halfSpan - btnW * 0.5f - 14.0f; float panelRight = groupCenterX + halfSpan + btnW * 0.5f + 14.0f; - float panelTop = btnY - btnH * 0.5f - 12.0f; + // Nudge the panel slightly lower for better visual spacing + float panelTop = btnY - btnH * 0.5f - 12.0f + 18.0f; float panelH = btnH + 24.0f; SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); // Backdrop blur pass before tint (use captured scene texture if available) renderBackdropBlur(renderer, logicalVP, logicalScale, panelTop, panelH, ctx.sceneTex, ctx.sceneW, ctx.sceneH); - // Brighter, less-opaque background to increase contrast - SDL_SetRenderDrawColor(renderer, 28, 36, 46, 180); + // Brighter, more transparent background to increase contrast but keep scene visible + // More transparent background so underlying scene shows through + SDL_SetRenderDrawColor(renderer, 28, 36, 46, 110); // Fill full-width background so edges are covered in fullscreen float viewportLogicalW = (float)logicalVP.w / logicalScale; SDL_FRect fullPanel{ 0.0f, panelTop, viewportLogicalW, panelH }; @@ -165,8 +174,8 @@ void MenuState::renderMainButtonTop(SDL_Renderer* renderer, float logicalScale, // Also draw the central strip to keep visual center emphasis SDL_FRect panelRect{ panelLeft, panelTop, panelRight - panelLeft, panelH }; SDL_RenderFillRect(renderer, &panelRect); - // brighter full-width border - SDL_SetRenderDrawColor(renderer, 120, 140, 160, 200); + // brighter full-width border (slightly more transparent) + SDL_SetRenderDrawColor(renderer, 120, 140, 160, 120); // Expand border to cover full window width (use actual viewport) SDL_FRect borderFull{ 0.0f, panelTop, viewportLogicalW, panelH }; SDL_RenderRect(renderer, &borderFull);