From 0a1739de21e5ab270cb45efb6fc0aed092d81227 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 2 Dec 2024 21:00:54 +0100 Subject: added all the contructor strutcts for animator,sprite and camera --- src/crepe/api/Animator.cpp | 15 +++++++++++++-- src/crepe/api/Animator.h | 8 ++------ src/crepe/api/Camera.cpp | 1 - src/crepe/facade/SDLContext.cpp | 35 ++++++++++++++++++----------------- src/crepe/facade/SDLContext.h | 2 +- src/crepe/system/AnimatorSystem.cpp | 6 ++---- src/crepe/system/RenderSystem.cpp | 2 +- src/example/rendering_particle.cpp | 14 +++++++++++--- 8 files changed, 48 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index ce824e6..1234967 100644 --- a/src/crepe/api/Animator.cpp +++ b/src/crepe/api/Animator.cpp @@ -9,8 +9,7 @@ using namespace crepe; Animator::Animator(game_object_id_t id, const Animator::Data & ctx) : Component(id), - data(ctx) -{ + data(ctx) { dbg_trace(); this->data.spritesheet.mask.h /= this->data.col; @@ -23,21 +22,33 @@ Animator::Animator(game_object_id_t id, const Animator::Data & ctx) ss.data.aspect_ratio = static_cast(this->data.spritesheet.mask.w) / this->data.spritesheet.mask.h; } + Animator::~Animator() { dbg_trace(); } void Animator::loop() { this->data.looping = true; } + void Animator::play() { this->active = true; } + void Animator::pause() { this->active = false; } + void Animator::stop() { this->active = false; this->data.curr_col = 0; this->data.curr_row = 0; } void Animator::set_fps(int fps) { this->data.fps = fps; } + void Animator::set_cycle_range(int start, int end) { this->data.cycle_start = start, this->data.cycle_end = end; } + void Animator::set_anim(int col) { this->data.curr_row = 0; this->data.curr_col = col; } + +void Animator::next_anim() { + Animator::Data & ctx = this->data; + ctx.curr_row = ctx.curr_row++ % ctx.row; + ctx.spritesheet.mask.x = ctx.curr_row * ctx.spritesheet.mask.w; +} diff --git a/src/crepe/api/Animator.h b/src/crepe/api/Animator.h index 194a9cf..36bc9f4 100644 --- a/src/crepe/api/Animator.h +++ b/src/crepe/api/Animator.h @@ -47,6 +47,7 @@ public: //! offset in pixels. + // TODO implement int offset_x = 0; }; @@ -108,12 +109,7 @@ public: * \brief Constructs an Animator object that will control animations for a sprite sheet. * * \param id The unique identifier for the component, typically assigned automatically. - * \param spritesheet A reference to the Sprite object which holds the sprite sheet for - * animation. - * \param row The maximum number of rows in the sprite sheet. - * \param col The maximum number of columns in the sprite sheet. - * \param col_animate The specific col index of the sprite sheet to animate. This allows - * selecting which col to animate from multiple col in the sheet. + * \param ctx animator data * * This constructor sets up the Animator with the given parameters, and initializes the * animation system. diff --git a/src/crepe/api/Camera.cpp b/src/crepe/api/Camera.cpp index 27bcb35..ff41710 100644 --- a/src/crepe/api/Camera.cpp +++ b/src/crepe/api/Camera.cpp @@ -7,7 +7,6 @@ using namespace crepe; Camera::Camera(game_object_id_t id, const Data & ctx) : Component(id), data(ctx) { - dbg_trace(); } diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index ab3fa45..32461f2 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -156,53 +156,54 @@ void SDLContext::draw(const RenderContext & ctx) { void SDLContext::set_camera(const Camera & cam, CameraValues & ctx) { + const Camera::Data & cam_data = cam.data; // resize window int w, h; SDL_GetWindowSize(this->game_window.get(), &w, &h); - if (w != cam.screen.x || h != cam.screen.y) { - SDL_SetWindowSize(this->game_window.get(), cam.screen.x, cam.screen.y); + if (w != cam_data.screen.x || h != cam_data.screen.y) { + SDL_SetWindowSize(this->game_window.get(), cam_data.screen.x, cam_data.screen.y); } vec2 & zoomed_viewport = ctx.zoomed_viewport; vec2 & bar_size = ctx.bar_size; vec2 & render_scale = ctx.render_scale; - zoomed_viewport = cam.viewport_size * cam.zoom; - double screen_aspect = static_cast(cam.screen.x) / cam.screen.y; + zoomed_viewport = cam_data.viewport_size * cam_data.zoom; + double screen_aspect = static_cast(cam_data.screen.x) / cam_data.screen.y; double viewport_aspect = zoomed_viewport.x / zoomed_viewport.y; // calculate black bars if (screen_aspect > viewport_aspect) { // pillarboxing - float scale = cam.screen.y / zoomed_viewport.y; + float scale = cam_data.screen.y / zoomed_viewport.y; float adj_width = zoomed_viewport.x * scale; - float bar_width = (cam.screen.x - adj_width) / 2; - this->black_bars[0] = {0, 0, bar_width, (float) cam.screen.y}; - this->black_bars[1] = {(cam.screen.x - bar_width), 0, bar_width, (float) cam.screen.y}; + float bar_width = (cam_data.screen.x - adj_width) / 2; + this->black_bars[0] = {0, 0, bar_width, (float) cam_data.screen.y}; + this->black_bars[1] = {(cam_data.screen.x - bar_width), 0, bar_width, (float) cam_data.screen.y}; bar_size = {bar_width, 0}; render_scale.x = render_scale.y = scale; } else { // letterboxing - float scale = cam.screen.x / (cam.viewport_size.x * cam.zoom); - float adj_height = cam.viewport_size.y * scale; - float bar_height = (cam.screen.y - adj_height) / 2; - this->black_bars[0] = {0, 0, (float) cam.screen.x, bar_height}; + float scale = cam_data.screen.x / (cam_data.viewport_size.x * cam_data.zoom); + float adj_height = cam_data.viewport_size.y * scale; + float bar_height = (cam_data.screen.y - adj_height) / 2; + this->black_bars[0] = {0, 0, (float) cam_data.screen.x, bar_height}; this->black_bars[1] - = {0, (cam.screen.y - bar_height), (float) cam.screen.x, bar_height}; + = {0, (cam_data.screen.y - bar_height), (float) cam_data.screen.x, bar_height}; bar_size = {0, bar_height}; render_scale.x = render_scale.y = scale; } - SDL_SetRenderDrawColor(this->game_renderer.get(), cam.bg_color.r, cam.bg_color.g, - cam.bg_color.b, cam.bg_color.a); + SDL_SetRenderDrawColor(this->game_renderer.get(), cam_data.bg_color.r, cam_data.bg_color.g, + cam_data.bg_color.b, cam_data.bg_color.a); SDL_Rect bg = { .x = 0, .y = 0, - .w = cam.screen.x, - .h = cam.screen.y, + .w = cam_data.screen.x, + .h = cam_data.screen.y, }; // fill bg color diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 0a6fce6..a0d1da8 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -128,7 +128,7 @@ private: /** * \brief Draws a sprite to the screen using the specified transform and camera. - * \param RenderCtx Reference to rendering data to draw + * \param RenderContext Reference to rendering data to draw */ void draw(const RenderContext & ctx); diff --git a/src/crepe/system/AnimatorSystem.cpp b/src/crepe/system/AnimatorSystem.cpp index b1f23d1..ff8d2ce 100644 --- a/src/crepe/system/AnimatorSystem.cpp +++ b/src/crepe/system/AnimatorSystem.cpp @@ -4,7 +4,6 @@ #include "AnimatorSystem.h" #include "ComponentManager.h" -#include using namespace crepe; @@ -21,7 +20,7 @@ void AnimatorSystem::update() { Animator::Data & ctx = a.data; double frame_duration = 1.0f / ctx.fps; - int cycle_end = (ctx.cycle_end == -1) ? ctx.row : cycle_end; + int cycle_end = (ctx.cycle_end == -1) ? ctx.row : ctx.cycle_end; int total_frames = cycle_end - ctx.cycle_start; int curr_frame = static_cast(elapsed_time / frame_duration) % total_frames; @@ -30,8 +29,7 @@ void AnimatorSystem::update() { ctx.spritesheet.mask.x = ctx.curr_row * ctx.spritesheet.mask.w; ctx.spritesheet.mask.y = (ctx.curr_col * ctx.spritesheet.mask.h); - std::cout << curr_frame << " " << total_frames << std::endl; - if (!ctx.looping && curr_frame == 0) { + if (!ctx.looping && curr_frame == total_frames - 1) { a.active = false; } } diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 08f254f..1bf5f65 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -33,7 +33,7 @@ const Camera & RenderSystem::update_camera() { const Transform & transform = mgr.get_components_by_id(cam.game_object_id).front().get(); this->context.set_camera(cam, this->cam_ctx); - this->cam_ctx.cam_pos = transform.position + cam.offset; + this->cam_ctx.cam_pos = transform.position + cam.data.offset; return cam; } throw std::runtime_error("No active cameras in current scene"); diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 4fd4071..f84eb94 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -70,11 +70,19 @@ public: .spritesheet = test_sprite, .col = 4, .row = 4, - .fps = 10, + .fps = 1, + .looping = true, + .cycle_start = 1, + .cycle_end = 3, }); + anim.set_anim(2); - auto & cam = game_object.add_component(Color::WHITE, ivec2{720, 1280}, - vec2{400, 400}, 1.0); + auto & cam = game_object.add_component(Camera::Data{ + .bg_color = Color::WHITE, + .screen = ivec2{720, 1280}, + .viewport_size = vec2{400, 400}, + .zoom = 1.0, + }); } string get_name() const { return "TestScene"; }; -- cgit v1.2.3