aboutsummaryrefslogtreecommitdiff
path: root/src/crepe
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe')
-rw-r--r--src/crepe/api/Animator.cpp2
-rw-r--r--src/crepe/api/Camera.h19
-rw-r--r--src/crepe/api/Vector2.cpp14
-rw-r--r--src/crepe/api/Vector2.h9
-rw-r--r--src/crepe/facade/SDLContext.cpp26
-rw-r--r--src/crepe/system/AnimatorSystem.cpp1
-rw-r--r--src/crepe/system/AnimatorSystem.h3
7 files changed, 58 insertions, 16 deletions
diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp
index 464b0fd..d206428 100644
--- a/src/crepe/api/Animator.cpp
+++ b/src/crepe/api/Animator.cpp
@@ -18,7 +18,7 @@ Animator::Animator(game_object_id_t id, Sprite & ss, int row, int col, int col_a
animator_rect.h /= col;
animator_rect.w /= row;
animator_rect.x = 0;
- animator_rect.y = col_animator * animator_rect.h;
+ animator_rect.y = (col_animator - 1) * animator_rect.h;
this->active = false;
}
Animator::~Animator() { dbg_trace(); }
diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h
index e0cda34..d7292ef 100644
--- a/src/crepe/api/Camera.h
+++ b/src/crepe/api/Camera.h
@@ -2,6 +2,7 @@
#include "Color.h"
#include "Component.h"
+#include "api/Vector2.h"
namespace crepe {
@@ -27,20 +28,20 @@ public:
//! Background color of the camera view.
Color bg_color;
- //! Aspect ratio height for the camera.
- double aspect_height = 480;
+ //! pos The position of the camera in world units
+ Vector2 pos = {0, 0};
- //! Aspect ratio width for the camera.
- double aspect_width = 640;
+ //! screen the display size in pixels ( output resolution )
+ Vector2 screen = {640, 480};
- //! X-coordinate of the camera position.
- double x = 0.0;
+ //! viewport is the area of the world visible through the camera (in world units)
+ Vector2 viewport = {500, 500};
- //! Y-coordinate of the camera position.
- double y = 0.0;
+ //! scale scaling factor from world units to pixel coordinates
+ Vector2 scale = {0, 0};
//! Zoom level of the camera view.
- double zoom = 1.0;
+ double zoom = 1.0f;
public:
/**
diff --git a/src/crepe/api/Vector2.cpp b/src/crepe/api/Vector2.cpp
index 30b968e..8658c00 100644
--- a/src/crepe/api/Vector2.cpp
+++ b/src/crepe/api/Vector2.cpp
@@ -8,12 +8,22 @@ Vector2 Vector2::operator+(const Vector2 & other) const { return {x + other.x, y
Vector2 Vector2::operator*(double scalar) const { return {x * scalar, y * scalar}; }
+Vector2 Vector2::operator*(const Vector2 & other) const {
+ return {this->x * other.x, this->y * other.y};
+}
+
Vector2 & Vector2::operator*=(const Vector2 & other) {
x *= other.x;
y *= other.y;
return *this;
}
+Vector2 & Vector2::operator*=(const double & other) {
+ x *= other;
+ y *= other;
+ return *this;
+}
+
Vector2 & Vector2::operator+=(const Vector2 & other) {
x += other.x;
y += other.y;
@@ -26,6 +36,10 @@ Vector2 & Vector2::operator+=(double other) {
return *this;
}
+Vector2 Vector2::operator/(const Vector2 & other) const {
+ return {this->x / other.x, this->y / other.y};
+}
+
Vector2 Vector2::operator-() const { return {-x, -y}; }
bool Vector2::operator==(const Vector2 & other) const { return x == other.x && y == other.y; }
diff --git a/src/crepe/api/Vector2.h b/src/crepe/api/Vector2.h
index 2fb6136..790160d 100644
--- a/src/crepe/api/Vector2.h
+++ b/src/crepe/api/Vector2.h
@@ -19,8 +19,17 @@ struct Vector2 {
Vector2 operator*(double scalar) const;
//! Multiplies this vector by another vector element-wise and updates this vector.
+ Vector2 operator*(const Vector2 & other) const;
+
+ //! Multiplies this vector by another vector element-wise and updates this vector.
Vector2 & operator*=(const Vector2 & other);
+ //! Multiplies a scalar value to both components of this vector and updates this vector.
+ Vector2 & operator*=(const double & other);
+
+ //! Divides this vector by another vector element-wise and updates this vector.
+ Vector2 operator/(const Vector2 & other) const;
+
//! Adds another vector to this vector and updates this vector.
Vector2 & operator+=(const Vector2 & other);
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 00523a6..74af25f 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -18,6 +18,7 @@
#include "../api/Transform.h"
#include "../api/Vector2.h"
#include "../util/Log.h"
+#include "api/Vector2.h"
#include "SDLContext.h"
@@ -107,6 +108,10 @@ SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const {
SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos,
const double & scale, const Camera & cam) const {
+ Vector2 pixel_coord = (transform.position - cam.pos) * cam.scale;
+ double pixel_w = sprite.sprite_rect.w * transform.scale * cam.scale.x;
+ double pixel_h = sprite.sprite_rect.h * transform.scale * cam.scale.y;
+
double adjusted_x = (pos.x - cam.x) * cam.zoom;
double adjusted_y = (pos.y - cam.y) * cam.zoom;
double adjusted_w = sprite.sprite_rect.w * scale * cam.zoom;
@@ -149,10 +154,23 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const
}
void SDLContext::set_camera(const Camera & cam) {
- this->viewport.w = static_cast<int>(cam.aspect_width);
- this->viewport.h = static_cast<int>(cam.aspect_height);
- this->viewport.x = static_cast<int>(cam.x) - (this->viewport.w / 2);
- this->viewport.y = static_cast<int>(cam.y) - (this->viewport.h / 2);
+
+
+ double screen_aspect = cam.screen.x / cam.screen.y;
+ double viewport_aspect = cam.viewport.x / cam.viewport.y;
+ Vector2 zoomed_viewport = cam.viewport * cam.zoom;
+
+ if (screen_aspect > viewport_aspect) {
+ cam.scale.x = cam.scale.y = cam.screen.x / zoomed_viewport.x;
+ } else {
+ cam.scale.y = cam.scale.x = cam.screen.y / zoomed_viewport.y;
+ }
+
+ if (this->viewport.w != cam.screen.x && this->viewport.h != cam.screen.y) {
+ this->viewport.w = cam.screen.x;
+ this->viewport.h = cam.screen.y;
+ SDL_SetWindowSize(this->game_window.get(), cam.screen.x, cam.screen.y);
+ }
SDL_SetRenderDrawColor(this->game_renderer.get(), cam.bg_color.r, cam.bg_color.g,
cam.bg_color.b, cam.bg_color.a);
diff --git a/src/crepe/system/AnimatorSystem.cpp b/src/crepe/system/AnimatorSystem.cpp
index 676e485..bc94253 100644
--- a/src/crepe/system/AnimatorSystem.cpp
+++ b/src/crepe/system/AnimatorSystem.cpp
@@ -16,6 +16,7 @@ void AnimatorSystem::update() {
uint64_t tick = SDLContext::get_instance().get_ticks();
for (Animator & a : animations) {
if (a.active) {
+ // (10 frames per second)
a.curr_row = (tick / 100) % a.row;
a.animator_rect.x = (a.curr_row * a.animator_rect.w) + a.curr_col;
a.spritesheet.sprite_rect = a.animator_rect;
diff --git a/src/crepe/system/AnimatorSystem.h b/src/crepe/system/AnimatorSystem.h
index 56cc7b3..f8179a9 100644
--- a/src/crepe/system/AnimatorSystem.h
+++ b/src/crepe/system/AnimatorSystem.h
@@ -21,12 +21,11 @@ public:
/**
* \brief Updates the Animator components.
*
- * This method is called periodically (likely every frame) to update the state of all
+ * This method is called to update the state of all
* Animator components, moving the animations forward and managing their behavior (e.g.,
* looping).
*/
void update() override;
- // FIXME: never say "likely" in the documentation lmao
};
} // namespace crepe