From bcb15776948d699caefb6f2964a61e5f650caf4d Mon Sep 17 00:00:00 2001 From: huaqo-games Date: Sat, 8 Feb 2025 17:47:12 +0100 Subject: [PATCH] animation is now decoupled from sprite --- scripts/animation.h | 28 ++++++++++++++++++++++++++++ scripts/camera.h | 15 +++++++++++++++ scripts/input.h | 40 ++++++++++++++++++++++++++++++++++++++++ scripts/object.h | 10 ++++++---- scripts/physics.h | 21 +++++++++++++++++++++ scripts/sprite.h | 9 +++++++++ scripts/vector.h | 2 ++ 7 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 scripts/animation.h create mode 100644 scripts/camera.h create mode 100644 scripts/input.h create mode 100644 scripts/physics.h diff --git a/scripts/animation.h b/scripts/animation.h new file mode 100644 index 0000000..6c4a7c9 --- /dev/null +++ b/scripts/animation.h @@ -0,0 +1,28 @@ +#ifndef ANIMSPRITE_H +#define ANIMSPRITE_H + +typedef struct { + int currentFrame; + int maxFrame; + int framesCounter; + int framesSpeed; + float animTimer; +} Animation; + +void UpdateAnimation(Animation *animation, float deltaTime) { + animation->animTimer += deltaTime; + float frameTime = 1.0f / animation->framesSpeed; + + if (animation->animTimer < frameTime) { + return; + } + + animation->animTimer -= frameTime; + animation->currentFrame++; + + if (animation->currentFrame >= animation->maxFrame) { + animation->currentFrame = 0; + } +} + +#endif // ANIMSPRITE_H diff --git a/scripts/camera.h b/scripts/camera.h new file mode 100644 index 0000000..d136cb1 --- /dev/null +++ b/scripts/camera.h @@ -0,0 +1,15 @@ +#ifndef CAMERA_H +#define CAMERA_H +#include +#include "input.h" + +void UpdateCamera2DTarget(Camera2D *camera, Vector2 *position, const float smoothness){ + camera->target = Vector2Lerp(camera->target, *position, smoothness * GetFrameTime()); +} + +void UpdateCamera2DZoom(Camera2D *camera, const float *scaleFactor, const float *minZoom, const float *maxZoom){ + float targetZoom = Clamp(camera->zoom * *scaleFactor, *minZoom, *maxZoom); + camera->zoom = Lerp(camera->zoom, targetZoom, 0.1f); +} + +#endif // CAMERA_H diff --git a/scripts/input.h b/scripts/input.h new file mode 100644 index 0000000..9d93948 --- /dev/null +++ b/scripts/input.h @@ -0,0 +1,40 @@ +#ifndef INPUT_H +#define INPUT_H +#include + +typedef struct { + Vector2 worldPosition; + float zoomSpeed; + float minZoom; + float maxZoom; + float scaleFactor; + float wheelMove; + bool leftButton; + bool rightButton; +} Mouse; + +void UpdateMouse(Mouse *mouse, Camera2D *camera) { + mouse->worldPosition = GetScreenToWorld2D(GetMousePosition(), *camera); + mouse->leftButton = IsMouseButtonDown(MOUSE_LEFT_BUTTON); + mouse->rightButton = IsMouseButtonDown(MOUSE_RIGHT_BUTTON); + + // Calculate zoom scale factor + mouse->wheelMove = GetMouseWheelMove(); + if (mouse->wheelMove != 0) { + float zoomFactor = 1.0f + (mouse->zoomSpeed * fabsf(mouse->wheelMove)); + mouse->scaleFactor = (mouse->wheelMove < 0) ? (1.0f / zoomFactor) : zoomFactor; + } else { + mouse->scaleFactor = 1.0f; + } +} + +void UpdateVectorOnInput(Vector2 *vector){ + *vector = (Vector2){0.0f, 0.0f}; + if (IsKeyDown(KEY_RIGHT) || IsKeyDown(KEY_D)){ vector->x += 1.0f; } + if (IsKeyDown(KEY_LEFT) || IsKeyDown(KEY_A)){ vector->x -= 1.0f; } + if (IsKeyDown(KEY_DOWN) || IsKeyDown(KEY_S)){ vector->y += 1.0f; } + if (IsKeyDown(KEY_UP) || IsKeyDown(KEY_W)){ vector->y -= 1.0f; } + if (Vector2Length(*vector) > 0.0f) { *vector = Vector2Normalize(*vector); } +} + +#endif //INPUT_H diff --git a/scripts/object.h b/scripts/object.h index 22c7b4a..41753f5 100644 --- a/scripts/object.h +++ b/scripts/object.h @@ -1,11 +1,13 @@ #ifndef OBJECT_H #define OBJECT_H -#include // Vector2, Rectangle, Color, GetRandomValue(), CheckCollisionRecs(), CheckCollisionPointRec() -#include // printf() -#include // malloc(), realloc() -#include "sprite.h" // Sprite +#include +#include +#include +#include +#include "sprite.h" #include "vector.h" + typedef struct { Sprite sprite; Vector2 position; diff --git a/scripts/physics.h b/scripts/physics.h new file mode 100644 index 0000000..bc5707e --- /dev/null +++ b/scripts/physics.h @@ -0,0 +1,21 @@ +#ifndef PHYSICS_H +#define PHYSICS_H +#include +#include + + +typedef struct { + Vector2 position; + Vector2 direction; + float speed; +} Physics; + +Vector2 GetVelocity(Vector2 *direction, float *speed){ + return Vector2Scale(*direction, *speed * GetFrameTime()); +} + +void Move(Vector2 *position, Vector2 *direction, float *speed) { + *position = Vector2Add(*position, GetVelocity(direction, speed)); +} + +#endif // PHYSICS_H diff --git a/scripts/sprite.h b/scripts/sprite.h index a416c09..6c60900 100644 --- a/scripts/sprite.h +++ b/scripts/sprite.h @@ -1,6 +1,7 @@ #ifndef SPRITE_H #define SPRITE_H #include +#include typedef struct { Texture2D texture; @@ -22,6 +23,14 @@ void UpdateSpriteDestRec(Sprite *sprite, const Vector2 *vector){ sprite->destRec.y = vector->y; } +void UpdateSpriteRotation(Sprite *sprite, Vector2 *vector){ + if(Vector2Length(*vector) <= 0.0f){ + return; + } + float targetRotation = (float)atan2(vector->y, vector->x) * (180.0f / PI) + 90.0f; + sprite->rotation = Lerp(sprite->rotation, targetRotation, 0.1f); +} + void RenderSprite(const Sprite *sprite){ DrawTexturePro( sprite->texture, diff --git a/scripts/vector.h b/scripts/vector.h index 12d9d99..8267718 100644 --- a/scripts/vector.h +++ b/scripts/vector.h @@ -1,6 +1,8 @@ #ifndef VECTOR_H #define VECTOR_H #include +#include +#include typedef struct { Vector2 *data;