Implement ResourceManager and TextureLoader

This commit is contained in:
Lexi / Zoe 2025-11-26 01:57:08 +01:00
parent e37eb0b03f
commit b8bd56392c
Signed by: binaryDiv
GPG key ID: F8D4956E224DA232
8 changed files with 290 additions and 93 deletions

View file

@ -2,12 +2,13 @@ module;
#include <cassert>
#include <memory>
#include <vector>
#include <SDL3/SDL.h>
export module game.game;
import core.engine;
import core.renderer;
import core.render_server;
import game.sprite;
import wrappers.sdl;
import wrappers.sdl_image;
@ -22,21 +23,18 @@ export namespace game
// Reference to the engine
core::Engine& engine_;
// Sprite for testing
std::unique_ptr<Sprite> sprite_{nullptr};
// Sprites for testing
Sprite player_sprite_;
std::vector<Sprite> sprites_;
// Private constructor
explicit Game(core::Engine& engine)
: engine_(engine)
{
// TODO: Texture should be a reference/pointer to an object managed by a ResourceManager or similar.
auto texture = sdl_image::LoadTexture(
engine_.get_renderer().get_sdl_renderer(),
"assets/neocat.png"
);
sprite_ = std::make_unique<Sprite>(std::move(texture), 100, 100);
}
: engine_(engine),
player_sprite_{
engine_.get_render_server().load_texture("assets/neocat.png"),
sdl::FRect{0, 0, 100, 100}
}
{}
public:
Game() = delete;
@ -62,15 +60,28 @@ export namespace game
}
// Handles an SDL event. Returns true if the event has been handled.
bool handle_event(const sdl::Event* event) const
bool handle_event(const sdl::Event* event)
{
if (event->type == SDL_EVENT_MOUSE_MOTION) {
sprite_->move(
player_sprite_.move(
event->motion.x - 50,
event->motion.y - 50
);
return true;
}
if (event->type == SDL_EVENT_MOUSE_BUTTON_UP) {
sprites_.emplace_back(
engine_.get_render_server().load_texture("assets/neofox.png"),
sdl::FRect{
event->motion.x - 50,
event->motion.y - 50,
100, 100
}
);
return true;
}
return false;
}
@ -80,10 +91,15 @@ export namespace game
void render() const
{
const auto& renderer = engine_.get_renderer();
renderer.start_frame();
sprite_->draw(renderer);
renderer.finish_frame();
const auto& render_server = engine_.get_render_server();
render_server.start_frame();
for (const Sprite& sprite : sprites_) {
sprite.draw(render_server);
}
player_sprite_.draw(render_server);
render_server.finish_frame();
}
void shutdown()