Fixed menu

This commit is contained in:
2025-12-06 18:18:27 +01:00
parent 12110bd8b4
commit 8a549d14dc
3 changed files with 44 additions and 16 deletions

View File

@ -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() {

View File

@ -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<float>(textW)) * 0.5f;
// Adjust vertical position for better alignment with background buttons
float ty = y + (h - static_cast<float>(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<float>(textH)) * 0.5f + textNudge;
// Choose text color based on selection state
SDL_Color textColor = {255, 255, 255, 255}; // Default white

View File

@ -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);