From f3c71085be5324f924b2121fe9641af8219a658f Mon Sep 17 00:00:00 2001 From: speckitor Date: Tue, 7 Jul 2026 15:53:47 +0700 Subject: [PATCH] even better button animation --- src/button.c | 70 ++++++++++++++++++++++++--------------------------- src/button.h | 1 + src/cube.c | 7 +++--- src/cube.h | 1 + src/level00.c | 4 ++- src/player.c | 4 +-- src/util.h | 7 ++++++ 7 files changed, 51 insertions(+), 43 deletions(-) create mode 100644 src/util.h diff --git a/src/button.c b/src/button.c index afe0174..e65ef8e 100644 --- a/src/button.c +++ b/src/button.c @@ -1,55 +1,51 @@ #include "button.h" #include "cube.h" #include "raylib.h" +#include "util.h" void DrawButton(Button *button, Cube *cube) { - bool pressed = !cube->grabbed && CheckCollisionBoxes( - (BoundingBox){ - (Vector3){ - button->position.x - button->length / 2.0f, - button->position.y - button->height / 2.0f, - button->position.z - button->length / 2.0f, - }, - (Vector3){ - button->position.x + button->length / 2.0f, - button->position.y + button->height / 2.0f, - button->position.z + button->length / 2.0f, - }, - }, - (BoundingBox){ - (Vector3){ - cube->position.x - cube->edge / 2.0f, - cube->position.y - cube->edge / 2.0f, - cube->position.z - cube->edge / 2.0f, - }, - (Vector3){ - cube->position.x + cube->edge / 2.0f, - cube->position.y + cube->edge / 2.0f, - cube->position.z + cube->edge / 2.0f, - }, - }); + bool pressed = CheckCollisionBoxes( + (BoundingBox){ + (Vector3){ + button->position.x - button->length / 2.0f, + button->position.y - button->height / 2.0f, + button->position.z - button->length / 2.0f, + }, + (Vector3){ + button->position.x + button->length / 2.0f, + button->position.y + button->height / 2.0f + 0.02f, + button->position.z + button->length / 2.0f, + }, + }, + (BoundingBox){ + (Vector3){ + cube->position.x - cube->edge / 2.0f, + cube->position.y - cube->edge / 2.0f - 0.02f, + cube->position.z - cube->edge / 2.0f, + }, + (Vector3){ + cube->position.x + cube->edge / 2.0f, + cube->position.y + cube->edge / 2.0f, + cube->position.z + cube->edge / 2.0f, + }, + }); if (pressed) { - button->height = cube->position.y - cube->edge / 2.0f; - if (button->height <= 0.0f) - { - button->height = 0.01f; - } - button->color = RED; + button->height = MIN(cube->position.y - cube->edge / 2.0f + 0.01f, 0.1f); + button->color = GREEN; button->pressed = true; + cube->minY = cube->edge / 2.0f + 0.02f; } else { - button->height += 0.01f; - if (button->height > 0.1f) - { - button->height = 0.1f; - } - button->color = BLUE; + button->height = MIN(0.1f, button->height + 0.01f); + button->color = PINK; button->pressed = false; + cube->minY = cube->edge / 2.0f + 0.01f; } DrawCube(button->position, button->length, button->height, button->length, button->color); + DrawCubeWires(button->position, button->length, button->height, button->length, button->wiresColor); } diff --git a/src/button.h b/src/button.h index 4842e6e..7c070d6 100644 --- a/src/button.h +++ b/src/button.h @@ -9,6 +9,7 @@ typedef struct float length; float height; Color color; + Color wiresColor; bool pressed; } Button; diff --git a/src/cube.c b/src/cube.c index 564b4ef..0e97b49 100644 --- a/src/cube.c +++ b/src/cube.c @@ -1,16 +1,17 @@ #include "cube.h" +#include "util.h" void MyDrawCube(Cube *cube) { // Gravity - if (!cube->grabbed && cube->position.y > cube->edge / 2.0f) + if (!cube->grabbed && cube->position.y > cube->edge / 2.0f + 0.02f) { float delta = GetFrameTime(); cube->yvel -= delta * 32.0f; cube->position.y += cube->yvel * delta; - if (cube->position.y <= cube->edge / 2.0f) + if (cube->position.y <= cube->minY) { - cube->position.y = cube->edge / 2.0f; + cube->position.y = cube->minY; cube->yvel = 0.0f; } } diff --git a/src/cube.h b/src/cube.h index b74e3c8..5c7e4f0 100644 --- a/src/cube.h +++ b/src/cube.h @@ -8,6 +8,7 @@ typedef struct bool initialized; Model model; Vector3 position; + float minY; float edge; Color color; Color wiresColor; diff --git a/src/level00.c b/src/level00.c index 5155f74..fed2c6a 100644 --- a/src/level00.c +++ b/src/level00.c @@ -10,13 +10,15 @@ Button button = { .position = (Vector3){0.0f, 0.0f, -5.0f}, .length = 1.0f, .height = 0.1f, - .color = BLUE, + .color = PINK, + .wiresColor = BLACK, .pressed = false, }; Cube cube = { .initialized = false, .position = (Vector3){0.0f, 0.5f, 0.0f}, + .minY = 0.4f + 0.01f, .edge = 0.8f, .color = RED, .wiresColor = BLACK, diff --git a/src/player.c b/src/player.c index c4f364e..c37b310 100644 --- a/src/player.c +++ b/src/player.c @@ -47,9 +47,9 @@ void UpdateFpsCamera(Player *player) player->grab->position = cubePosition; // Don't let putting grab under the floor - if (player->grab->position.y <= player->grab->edge / 2.0f) + if (player->grab->position.y <= player->grab->minY) { - player->grab->position.y = player->grab->edge / 2.0f; + player->grab->position.y = player->grab->minY; } player->grab->hRotation = player->lookRotation.x * RAD2DEG; // Rottate cube to be perpendicular to camera } diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..a49aecb --- /dev/null +++ b/src/util.h @@ -0,0 +1,7 @@ +#ifndef UTIL_H +#define UTIL_H + +#define MAX(a, b) (a) > (b) ? (a) : (b) +#define MIN(a, b) (a) > (b) ? (b) : (a) + +#endif // UTIL_H