summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorphysick <mynameisgennadiy@vk.com>2026-07-12 13:08:33 +0500
committerphysick <mynameisgennadiy@vk.com>2026-07-12 13:08:33 +0500
commitf314b56da42e1ead200e2373e9b214f77290d03b (patch)
tree52e535e99fe8c82a3a4834f67825ba2183e44283 /src
parent71e1f2dc8e9e1b3ee595a2712ec24d11ce243f1c (diff)
fun popup animation
Diffstat (limited to 'src')
-rw-r--r--src/scenes/mainMenu.c1
-rw-r--r--src/scenes/puzzleScene.c1
-rw-r--r--src/scenes/resultView.c38
-rw-r--r--src/scenes/sceneManager.c12
-rw-r--r--src/scenes/scenes.h2
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 <raylib.h>
#include <stdlib.h>
#include <sys/types.h>
@@ -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();