diff --git a/src/button.c b/src/button.c new file mode 100644 index 0000000..0c53482 --- /dev/null +++ b/src/button.c @@ -0,0 +1,47 @@ +#include "button.h" +#include "cube.h" +#include "raylib.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, + }, + }); + + if (pressed) + { + button->height = cube->position.y - cube->edge / 2.0f; + button->color = RED; + button->pressed = true; + } + else + { + button->height = 0.2f; + button->color = BLUE; + button->pressed = false; + } + + DrawCube(button->position, button->length, button->height, button->length, button->color); +} diff --git a/src/button.h b/src/button.h new file mode 100644 index 0000000..4842e6e --- /dev/null +++ b/src/button.h @@ -0,0 +1,17 @@ +#ifndef BUTTON_H +#define BUTTON_H + +#include "cube.h" + +typedef struct +{ + Vector3 position; + float length; + float height; + Color color; + bool pressed; +} Button; + +void DrawButton(Button *button, Cube *cube); + +#endif // BUTTON_H diff --git a/src/level00.c b/src/level00.c index 6724f4c..1091104 100644 --- a/src/level00.c +++ b/src/level00.c @@ -1,3 +1,4 @@ +#include "button.h" #include "cube.h" #include "player.h" #include "raylib.h" @@ -5,10 +6,18 @@ #include #include +Button button = { + .position = (Vector3){0.0f, 0.0f, 0.0f}, + .length = 1.0f, + .height = 0.1f, + .color = BLUE, + .pressed = false, +}; + Cube cube = { .initialized = false, .position = (Vector3){0.0f, 0.5f, 0.0f}, - .edge = 1.0f, + .edge = 0.8f, .color = RED, .wiresColor = BLACK, .grabbed = false, @@ -18,7 +27,7 @@ void DrawLevel00(Player *player) { if (!cube.initialized) { - cube.model = LoadModelFromMesh(GenMeshCube(1.0f, 1.0f, 1.0f)); + cube.model = LoadModelFromMesh(GenMeshCube(cube.edge, cube.edge, cube.edge)); cube.initialized = true; } @@ -43,5 +52,6 @@ void DrawLevel00(Player *player) UpdateGrab(player, &cube); // Check if we grabbed a cube - MyDrawCube(&cube); // Draw a cube + MyDrawCube(&cube); // Draw a cube + DrawButton(&button, &cube); // Draw a button } diff --git a/src/main.c b/src/main.c index 0735465..9a7d1fa 100644 --- a/src/main.c +++ b/src/main.c @@ -4,15 +4,6 @@ #include "screen.h" #include -extern Vector2 lookRotation; -extern Vector2 lean; -extern float headTimer; -extern float walkLerp; - -static float heights[MAX_COLUMNS] = {0}; -static Vector3 positions[MAX_COLUMNS] = {0}; -static Color colors[MAX_COLUMNS] = {0}; - int main() { InitWindow(1600, 900, "Super cool game"); @@ -42,14 +33,14 @@ int main() while (!WindowShouldClose()) { Vector2 mouseDelta = GetMouseDelta(); - lookRotation.x -= mouseDelta.x * sensitivity.x; - lookRotation.y += mouseDelta.y * sensitivity.y; + player.lookRotation.x -= mouseDelta.x * sensitivity.x; + player.lookRotation.y += mouseDelta.y * sensitivity.y; char sideway = (IsKeyDown(KEY_D) - IsKeyDown(KEY_A)); char forward = (IsKeyDown(KEY_W) - IsKeyDown(KEY_S)); bool crouching = IsKeyDown(KEY_LEFT_CONTROL); - UpdateBody(&player, lookRotation.x, sideway, forward, IsKeyPressed(KEY_SPACE), crouching); + UpdateBody(&player, player.lookRotation.x, sideway, forward, IsKeyPressed(KEY_SPACE), crouching); float delta = GetFrameTime(); headLerp = Lerp(headLerp, (crouching ? CROUCH_HEIGHT : STAND_HEIGHT), 20.0f * delta); @@ -61,18 +52,18 @@ int main() if (body->grounded && ((forward != 0) || (sideway != 0))) { - headTimer += delta * 3.0f; - walkLerp = Lerp(walkLerp, 1.0f, 10.0f * delta); + player.headTimer += delta * 3.0f; + player.walkLerp = Lerp(player.walkLerp, 1.0f, 10.0f * delta); camera->fovy = Lerp(camera->fovy, 55.0f, 5.0f * delta); } else { - walkLerp = Lerp(walkLerp, 0.0f, 10.0f * delta); + player.walkLerp = Lerp(player.walkLerp, 0.0f, 10.0f * delta); camera->fovy = Lerp(camera->fovy, 60.0f, 5.0f * delta); } - lean.x = Lerp(lean.x, sideway * 0.02f, 10.0f * delta); - lean.y = Lerp(lean.y, forward * 0.015f, 10.0f * delta); + player.lean.x = Lerp(player.lean.x, sideway * 0.02f, 10.0f * delta); + player.lean.y = Lerp(player.lean.y, forward * 0.015f, 10.0f * delta); UpdateFpsCamera(&player); diff --git a/src/player.c b/src/player.c index a107777..c4f364e 100644 --- a/src/player.c +++ b/src/player.c @@ -3,11 +3,6 @@ #include "raymath.h" #include -Vector2 lookRotation = {0}; -Vector2 lean = {0}; -float headTimer = 0.0f; -float walkLerp = 0.0f; - void UpdateFpsCamera(Player *player) { Camera *camera = &player->camera; @@ -15,32 +10,32 @@ void UpdateFpsCamera(Player *player) const Vector3 up = (Vector3){0.0f, 1.0f, 0.0f}; const Vector3 targetOffset = (Vector3){0.0f, 0.0f, -1.0f}; - Vector3 yaw = Vector3RotateByAxisAngle(targetOffset, up, lookRotation.x); + Vector3 yaw = Vector3RotateByAxisAngle(targetOffset, up, player->lookRotation.x); float maxAngleUp = Vector3Angle(up, yaw); maxAngleUp -= 0.001f; - if (-(lookRotation.y) > maxAngleUp) + if (-(player->lookRotation.y) > maxAngleUp) { - lookRotation.y = -maxAngleUp; + player->lookRotation.y = -maxAngleUp; } Vector3 right = Vector3Normalize(Vector3CrossProduct(yaw, up)); - float pitchAngle = -lookRotation.y - lean.y; + float pitchAngle = -player->lookRotation.y - player->lean.y; pitchAngle = Clamp(pitchAngle, -PI / 2 + 0.0001f, PI / 2 - 0.0001f); Vector3 pitch = Vector3RotateByAxisAngle(yaw, right, pitchAngle); - float headSin = sinf(headTimer * PI); - float headCos = cosf(headTimer * PI); + float headSin = sinf(player->headTimer * PI); + float headCos = cosf(player->headTimer * PI); const float stepRotation = 0.01f; - camera->up = Vector3RotateByAxisAngle(up, pitch, headSin * stepRotation + lean.x); + camera->up = Vector3RotateByAxisAngle(up, pitch, headSin * stepRotation + player->lean.x); const float bobSide = 0.1f; const float bobUp = 0.15f; Vector3 bobbing = Vector3Scale(right, headSin * bobSide); bobbing.y = fabsf(headCos * bobUp); - camera->position = Vector3Add(camera->position, Vector3Scale(bobbing, walkLerp)); + camera->position = Vector3Add(camera->position, Vector3Scale(bobbing, player->walkLerp)); camera->target = Vector3Add(camera->position, pitch); if (player->grab) @@ -56,7 +51,7 @@ void UpdateFpsCamera(Player *player) { player->grab->position.y = player->grab->edge / 2.0f; } - player->grab->hRotation = lookRotation.x * RAD2DEG; // Rottate cube to be perpendicular to camera + player->grab->hRotation = player->lookRotation.x * RAD2DEG; // Rottate cube to be perpendicular to camera } } diff --git a/src/player.h b/src/player.h index 470835d..eb3baaf 100644 --- a/src/player.h +++ b/src/player.h @@ -5,6 +5,7 @@ #include "raylib.h" #include +// Some constants #define GRAVITY 32.0f #define MAX_SPEED 20.0f #define CROUCH_SPEED 5.0f @@ -28,7 +29,14 @@ typedef struct typedef struct { Body body; + + // Camera stuff Camera camera; + Vector2 lookRotation; + Vector2 lean; + float headTimer; + float walkLerp; + Cube *grab; } Player;