aboutsummaryrefslogtreecommitdiff
path: root/src/crepe
diff options
context:
space:
mode:
authorWBoerenkamps <wrj.boerenkamps@student.avans.nl>2024-12-04 10:27:42 +0100
committerWBoerenkamps <wrj.boerenkamps@student.avans.nl>2024-12-04 10:27:42 +0100
commit7d1f3b90a5d640e4ae23d6ff8f0bf1bf35b6e4cb (patch)
tree0697c269ce96e55c7841344ec426e0e3daa2c864 /src/crepe
parent5981ab2262a98b80a1339f86a6b71093576a9b35 (diff)
parentc7c4cc0e3b1a3152256bc8ebf6494c19519538db (diff)
merge 2 gameloop branches
Diffstat (limited to 'src/crepe')
-rw-r--r--src/crepe/api/LoopManager.cpp32
-rw-r--r--src/crepe/api/LoopManager.h4
-rw-r--r--src/crepe/api/LoopTimer.cpp11
-rw-r--r--src/crepe/api/LoopTimer.h15
-rw-r--r--src/crepe/api/Sprite.cpp4
-rw-r--r--src/crepe/api/Texture.cpp11
-rw-r--r--src/crepe/api/Texture.h13
-rw-r--r--src/crepe/facade/SDLContext.cpp26
-rw-r--r--src/crepe/facade/SDLContext.h22
-rw-r--r--src/crepe/system/RenderSystem.cpp2
-rw-r--r--src/crepe/system/RenderSystem.h7
11 files changed, 74 insertions, 73 deletions
diff --git a/src/crepe/api/LoopManager.cpp b/src/crepe/api/LoopManager.cpp
index df09f7e..14e68c2 100644
--- a/src/crepe/api/LoopManager.cpp
+++ b/src/crepe/api/LoopManager.cpp
@@ -6,20 +6,25 @@
#include "../system/PhysicsSystem.h"
#include "../system/RenderSystem.h"
#include "../system/ScriptSystem.h"
-
+#include "../api/EventManager.h"
#include "LoopManager.h"
#include "LoopTimer.h"
-
+#include <iostream>
using namespace crepe;
using namespace std;
LoopManager::LoopManager() {
+ this->loop_timer = make_unique<LoopTimer>();
this->load_system<AnimatorSystem>();
this->load_system<CollisionSystem>();
this->load_system<ParticleSystem>();
this->load_system<PhysicsSystem>();
this->load_system<RenderSystem>();
this->load_system<ScriptSystem>();
+ EventManager::get_instance().subscribe<ShutDownEvent>([this](const ShutDownEvent& event) {
+ return this->on_shutdown(event);
+ });
+
}
void LoopManager::process_input() {
@@ -35,29 +40,32 @@ void LoopManager::set_running(bool running) { this->game_running = running; }
void LoopManager::fixed_update() {}
void LoopManager::loop() {
- LoopTimer & timer = LoopTimer::get_instance();
- timer.start();
+ this->loop_timer->start();
while (game_running) {
- timer.update();
+ this->loop_timer->update();
- while (timer.get_lag() >= timer.get_fixed_delta_time()) {
+ while (this->loop_timer->get_lag() >= this->loop_timer->get_fixed_delta_time()) {
this->process_input();
this->fixed_update();
- timer.advance_fixed_update();
+ this->loop_timer->advance_fixed_update();
}
this->update();
this->render();
-
- timer.enforce_frame_rate();
+ this->loop_timer->enforce_frame_rate();
}
}
void LoopManager::setup() {
this->game_running = true;
+<<<<<<< HEAD
LoopTimer::get_instance().start();
LoopTimer::get_instance().set_target_fps(200);
+=======
+ this->loop_timer->start();
+ this->loop_timer->set_fps(60);
+>>>>>>> wouter/gameloop-improvements
}
void LoopManager::render() {
@@ -65,5 +73,9 @@ void LoopManager::render() {
this->get_system<RenderSystem>().update();
}
}
+bool LoopManager::on_shutdown(const ShutDownEvent & e){
+ this->game_running = false;
+ return false;
+}
-void LoopManager::update() { LoopTimer & timer = LoopTimer::get_instance(); }
+void LoopManager::update() {}
diff --git a/src/crepe/api/LoopManager.h b/src/crepe/api/LoopManager.h
index 13e6dac..ff1ff55 100644
--- a/src/crepe/api/LoopManager.h
+++ b/src/crepe/api/LoopManager.h
@@ -7,7 +7,7 @@
#include "api/SceneManager.h"
namespace crepe {
-
+class LoopTimer;
/**
* \brief Main game loop manager
*
@@ -91,6 +91,8 @@ private:
SceneManager scene_manager{component_manager};
private:
+ std::unique_ptr<LoopTimer> loop_timer;
+ bool on_shutdown(const ShutDownEvent & e);
/**
* \brief Collection of System instances
*
diff --git a/src/crepe/api/LoopTimer.cpp b/src/crepe/api/LoopTimer.cpp
index f94e24b..fe5544d 100644
--- a/src/crepe/api/LoopTimer.cpp
+++ b/src/crepe/api/LoopTimer.cpp
@@ -9,10 +9,6 @@ using namespace crepe;
LoopTimer::LoopTimer() { dbg_trace(); }
-LoopTimer & LoopTimer::get_instance() {
- static LoopTimer instance;
- return instance;
-}
void LoopTimer::start() {
this->last_frame_time = std::chrono::steady_clock::now();
@@ -57,11 +53,8 @@ void LoopTimer::set_game_scale(double value) { this->game_scale = value; }
double LoopTimer::get_game_scale() const { return this->game_scale; }
void LoopTimer::enforce_frame_rate() {
- std::chrono::steady_clock::time_point current_frame_time
- = std::chrono::steady_clock::now();
- std::chrono::milliseconds frame_duration
- = std::chrono::duration_cast<std::chrono::milliseconds>(current_frame_time
- - this->last_frame_time);
+ auto current_frame_time = std::chrono::steady_clock::now();
+ auto frame_duration = current_frame_time - this->last_frame_time;
if (frame_duration < this->frame_target_time) {
std::chrono::milliseconds delay_time
diff --git a/src/crepe/api/LoopTimer.h b/src/crepe/api/LoopTimer.h
index 0a48e20..e348628 100644
--- a/src/crepe/api/LoopTimer.h
+++ b/src/crepe/api/LoopTimer.h
@@ -6,13 +6,7 @@ namespace crepe {
class LoopTimer {
public:
- /**
- * \brief Get the singleton instance of LoopTimer.
- *
- * \return A reference to the LoopTimer instance.
- */
- static LoopTimer & get_instance();
-
+ LoopTimer();
/**
* \brief Get the current delta time for the current frame.
*
@@ -96,12 +90,7 @@ private:
*/
double get_lag() const;
- /**
- * \brief Construct a new LoopTimer object.
- *
- * Private constructor for singleton pattern to restrict instantiation outside the class.
- */
- LoopTimer();
+
/**
* \brief Update the timer to the current frame.
diff --git a/src/crepe/api/Sprite.cpp b/src/crepe/api/Sprite.cpp
index 8647794..0a2ad4c 100644
--- a/src/crepe/api/Sprite.cpp
+++ b/src/crepe/api/Sprite.cpp
@@ -22,8 +22,8 @@ Sprite::Sprite(game_object_id_t id, Texture & image, const Color & color,
dbg_trace();
- this->mask.w = sprite_image.get_width();
- this->mask.h = sprite_image.get_height();
+ this->mask.w = sprite_image.get_size().x;
+ this->mask.h = sprite_image.get_size().y;
this->aspect_ratio = static_cast<double>(this->mask.w) / this->mask.h;
}
diff --git a/src/crepe/api/Texture.cpp b/src/crepe/api/Texture.cpp
index e43bdaa..2b56271 100644
--- a/src/crepe/api/Texture.cpp
+++ b/src/crepe/api/Texture.cpp
@@ -3,6 +3,7 @@
#include "Asset.h"
#include "Texture.h"
+#include "types.h"
using namespace crepe;
using namespace std;
@@ -31,11 +32,7 @@ void Texture::load(const Asset & res) {
this->texture = ctx.texture_from_path(res.get_path());
}
-int Texture::get_width() const {
- if (this->texture == nullptr) return 0;
- return SDLContext::get_instance().get_width(*this);
-}
-int Texture::get_height() const {
- if (this->texture == nullptr) return 0;
- return SDLContext::get_instance().get_height(*this);
+ivec2 Texture::get_size() const {
+ if (this->texture == nullptr) return {};
+ return SDLContext::get_instance().get_size(*this);
}
diff --git a/src/crepe/api/Texture.h b/src/crepe/api/Texture.h
index 7206a66..1817910 100644
--- a/src/crepe/api/Texture.h
+++ b/src/crepe/api/Texture.h
@@ -8,6 +8,7 @@
#include <memory>
#include "Asset.h"
+#include "types.h"
namespace crepe {
@@ -42,16 +43,10 @@ public:
Texture & operator=(const Texture &) = delete;
/**
- * \brief Gets the width of the texture.
- * \return Width of the texture in pixels.
+ * \brief Gets the width and height of the texture.
+ * \return Width and height of the texture in pixels.
*/
- int get_width() const;
-
- /**
- * \brief Gets the height of the texture.
- * \return Height of the texture in pixels.
- */
- int get_height() const;
+ ivec2 get_size() const;
private:
/**
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 9f60285..e8be7ca 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -1,4 +1,5 @@
#include <SDL2/SDL.h>
+#include <SDL2/SDL_blendmode.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_keycode.h>
#include <SDL2/SDL_rect.h>
@@ -7,7 +8,9 @@
#include <SDL2/SDL_video.h>
#include <cmath>
#include <cstddef>
+#include <cstdint>
#include <functional>
+#include <iostream>
#include <memory>
#include <stdexcept>
@@ -18,6 +21,7 @@
#include "../util/Log.h"
#include "SDLContext.h"
+#include "api/Color.h"
#include "types.h"
using namespace crepe;
@@ -134,6 +138,7 @@ void SDLContext::draw(const RenderContext & ctx) {
SDL_Rect dstrect
= this->get_dst_rect(ctx.sprite, ctx.pos, ctx.cam, ctx.cam_pos, ctx.scale);
+ this->set_color_texture(ctx.sprite.sprite_image, ctx.sprite.color);
SDL_RenderCopyEx(this->game_renderer.get(), ctx.sprite.sprite_image.texture.get(),
&srcrect, &dstrect, ctx.angle, NULL, render_flip);
}
@@ -207,16 +212,19 @@ SDLContext::texture_from_path(const std::string & path) {
std::unique_ptr<SDL_Texture, std::function<void(SDL_Texture *)>> img_texture;
img_texture = {tmp_texture, [](SDL_Texture * texture) { SDL_DestroyTexture(texture); }};
+ SDL_SetTextureBlendMode(img_texture.get(), SDL_BLENDMODE_BLEND);
return img_texture;
}
-int SDLContext::get_width(const Texture & ctx) const {
- int w;
- SDL_QueryTexture(ctx.texture.get(), NULL, NULL, &w, NULL);
- return w;
-}
-int SDLContext::get_height(const Texture & ctx) const {
- int h;
- SDL_QueryTexture(ctx.texture.get(), NULL, NULL, NULL, &h);
- return h;
+
+ivec2 SDLContext::get_size(const Texture & ctx) {
+ ivec2 size;
+ SDL_QueryTexture(ctx.texture.get(), NULL, NULL, &size.x, &size.y);
+ return size;
}
+
void SDLContext::delay(int ms) const { SDL_Delay(ms); }
+
+void SDLContext::set_color_texture(const Texture & texture, const Color & color) {
+ SDL_SetTextureColorMod(texture.texture.get(), color.r, color.g, color.b);
+ SDL_SetTextureAlphaMod(texture.texture.get(), color.a);
+}
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index 6030a6e..e49ca78 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -12,6 +12,8 @@
#include "../api/Camera.h"
#include "../api/Sprite.h"
+#include "api/Color.h"
+#include "api/Texture.h"
#include "types.h"
namespace crepe {
@@ -104,18 +106,11 @@ private:
std::unique_ptr<SDL_Texture, std::function<void(SDL_Texture *)>>
texture_from_path(const std::string & path);
/**
- * \brief Gets the width of a texture.
+ * \brief Gets the size of a texture.
* \param texture Reference to the Texture object.
- * \return Width of the texture as an integer.
+ * \return Width and height of the texture as an integer.
*/
- int get_width(const Texture & texture) const;
-
- /**
- * \brief Gets the height of a texture.
- * \param texture Reference to the Texture object.
- * \return Height of the texture as an integer.
- */
- int get_height(const Texture & texture) const;
+ ivec2 get_size(const Texture & ctx);
private:
//! Will use draw,clear_screen, present_screen, camera.
@@ -160,6 +155,13 @@ private:
*/
SDL_Rect get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam,
const vec2 & cam_pos, const double & img_scale) const;
+ /**
+ * \brief Set an additional color value multiplied into render copy operations.
+ *
+ * \param texture the given texture to adjust
+ * \param color the color data for the texture
+ */
+ void set_color_texture(const Texture & texture, const Color & color);
private:
//! sdl Window
diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp
index c196bb1..11c9669 100644
--- a/src/crepe/system/RenderSystem.cpp
+++ b/src/crepe/system/RenderSystem.cpp
@@ -70,7 +70,7 @@ bool RenderSystem::render_particle(const Sprite & sprite, const Camera & cam,
bool rendering_particles = false;
for (const ParticleEmitter & em : emitters) {
- if (!(&em.data.sprite == &sprite)) continue;
+ if (&em.data.sprite != &sprite) continue;
rendering_particles = true;
if (!em.active) continue;
diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h
index e70831e..096d058 100644
--- a/src/crepe/system/RenderSystem.h
+++ b/src/crepe/system/RenderSystem.h
@@ -46,7 +46,10 @@ private:
* \brief Renders all the particles on the screen from a given sprite.
*
* \param sprite renders the particles with given texture
- * \param tm the Transform component for scale
+ * \param tm the Transform component for scale. This is not a const reference because each
+ * particle has a position and rotation that needs to overwrite the transform position and
+ * rotation without overwriting the current transform. and because the transform
+ * constructor is now protected i cannot make tmp inside
* \return true if particles have been rendered
*/
bool render_particle(const Sprite & sprite, const Camera & cam, const double & scale);
@@ -68,13 +71,13 @@ private:
RefVector<Sprite> sort(RefVector<Sprite> & objs) const;
/**
- * \todo Include color handling for sprites.
* \todo Add text rendering using SDL_ttf for text components.
* \todo Implement a text component and a button component.
* \todo Consider adding text input functionality.
*/
private:
+ // FIXME: retrieve sdlcontext via mediator after #PR57
SDLContext & context = SDLContext::get_instance();
//! camera postion in the current scene