From f314b56da42e1ead200e2373e9b214f77290d03b Mon Sep 17 00:00:00 2001 From: physick Date: Sun, 12 Jul 2026 13:08:33 +0500 Subject: fun popup animation --- src/scenes/mainMenu.c | 1 + src/scenes/puzzleScene.c | 1 + src/scenes/resultView.c | 38 ++++++++++++++++++++++++++++++-------- src/scenes/sceneManager.c | 12 +++++++++++- src/scenes/scenes.h | 2 ++ 5 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/scenes/mainMenu.c b/src/scenes/mainMenu.c index 7732f6d..8529e35 100644 --- a/src/scenes/mainMenu.c +++ b/src/scenes/mainMenu.c @@ -24,5 +24,6 @@ Scene *CreateMainMenu() { outp->Update = updateMainMenu; outp->Draw = drawMainMenu; outp->Deint = deinitMainMenu; + outp->IsTransparent = false; return outp; } diff --git a/src/scenes/puzzleScene.c b/src/scenes/puzzleScene.c index 972335f..5590bb8 100644 --- a/src/scenes/puzzleScene.c +++ b/src/scenes/puzzleScene.c @@ -109,6 +109,7 @@ Scene *CreatePuzzleScene(Puzzle *puzzle) { outp->Update = updatePuzzleScene; outp->Draw = drawPuzzleScene; outp->Deint = deinitPuzzleScene; + outp->IsTransparent = false; puzzleSceneData *data = malloc(sizeof(puzzleSceneData)); data->PuzzlePtr = puzzle; diff --git a/src/scenes/resultView.c b/src/scenes/resultView.c index 9985319..b433bd0 100644 --- a/src/scenes/resultView.c +++ b/src/scenes/resultView.c @@ -6,37 +6,56 @@ #include "../ui_elements/UI.h" #include "../resources/resources.h" -static const int PADDING = 10; +static const int PADDING = 20; static const int BORDER = 2; +static const int SCROLL_SPEED = 10; typedef struct { char *value; int scroll; + /// For the fun popping up effect + float scroll_up; + bool isClosing; } ResultViewData; -Rectangle GetResultViewBodyRect() { +Rectangle GetResultViewBodyRect(float scroll_up) { int HeaderOffset = PADDING * 2; + int height = GetScreenHeight(); Rectangle outp = { .x = PADDING, - .y = HeaderOffset, + .y = HeaderOffset + (height * scroll_up), .width = GetScreenWidth() - PADDING * 2, - .height = GetScreenHeight() - HeaderOffset - PADDING * 3, + .height = height - HeaderOffset - PADDING * 3, }; + return outp; } bool updateResultView(void *self) { - if (IsKeyDown(KEY_ESCAPE)) { - DeleteSceneFromStack(); + ResultViewData *data = ((Scene *)self)->data; + + if (data->isClosing) { + data->scroll_up += SCROLL_SPEED * GetFrameTime(); + if (data->scroll_up > 1) DeleteSceneFromStack(); return true; } + + if (data->scroll_up != 0) { + data->scroll_up -= SCROLL_SPEED * GetFrameTime(); + if (data->scroll_up < 0) data->scroll_up = 0; + } + + if (IsKeyPressed(KEY_ESCAPE)) { + data->isClosing = true; + } + return true; } bool drawResultView(void *self) { ResultViewData *data = ((Scene *)self)->data; - DrawBackground(); - Rectangle body = GetResultViewBodyRect(); + // DrawBackground(); + Rectangle body = GetResultViewBodyRect(data->scroll_up); DrawRecBordered(body, WHITE, COLORSCHEME_ORANGE, BORDER); DrawTextInRec(body, data->value, GetMainFont(), 20, COLORSCHEME_BROWN, 3, &data->scroll); @@ -54,6 +73,7 @@ Scene *CreateResultView(char *result) { outp->Draw = drawResultView; outp->Update = updateResultView; outp->Deint = deinitResultView; + outp->IsTransparent = true; ResultViewData *data = malloc(sizeof(ResultViewData)); if (data == NULL) { @@ -62,6 +82,8 @@ Scene *CreateResultView(char *result) { } data->value = result; data->scroll = 0; + data->scroll_up = 1; + data->isClosing = false; outp->data = data; return outp; diff --git a/src/scenes/sceneManager.c b/src/scenes/sceneManager.c index 8d4c4e7..e5ab397 100644 --- a/src/scenes/sceneManager.c +++ b/src/scenes/sceneManager.c @@ -1,4 +1,5 @@ #include "scenes.h" +#include #include #include @@ -6,10 +7,15 @@ Scene **sceneStack = NULL; size_t sceneStackDepth = 0; Scene *getCurrentScene() { - if (sceneStackDepth == 0) return false; + if (sceneStackDepth == 0) return NULL; return sceneStack[sceneStackDepth - 1]; } +Scene *getPreviousScene() { + if (sceneStackDepth <= 1) return NULL; + return sceneStack[sceneStackDepth - 2]; +} + bool InitSceneStack() { sceneStack = malloc(sizeof(Scene) * SCENE_STACK_SIZE); return sceneStack != NULL; @@ -35,6 +41,10 @@ void DeleteSceneFromStack() { bool DrawScene() { Scene *currentScene = getCurrentScene(); if (currentScene == NULL) return false; + if (currentScene->IsTransparent) { + Scene *prevScene = getPreviousScene(); + if (prevScene != NULL) prevScene->Draw(prevScene); + } return currentScene->Draw(currentScene); } diff --git a/src/scenes/scenes.h b/src/scenes/scenes.h index d243a6d..37da761 100644 --- a/src/scenes/scenes.h +++ b/src/scenes/scenes.h @@ -16,6 +16,8 @@ typedef struct { /// A generic pointer to whatever data the scene needs. You will have to /// cast it yourself void *data; + // Set this to true if the previous scene should be rendered + bool IsTransparent; } Scene; bool InitSceneStack(); -- cgit v1.3