diff options
-rw-r--r-- | resource-manager/CMakeLists.txt | 1 | ||||
-rw-r--r-- | resource-manager/Image_asset.cpp | 15 | ||||
-rw-r--r-- | resource-manager/Image_asset.h | 10 | ||||
-rw-r--r-- | resource-manager/main.cpp | 51 | ||||
-rw-r--r-- | resource-manager/resource_fabricator.cpp | 6 | ||||
-rw-r--r-- | resource-manager/resource_manager.cpp | 15 | ||||
-rw-r--r-- | resource-manager/resource_manager.h | 18 | ||||
-rw-r--r-- | resource-manager/spritesheet.cpp | 38 | ||||
-rw-r--r-- | resource-manager/spritesheet.h | 27 | ||||
-rw-r--r-- | resource-manager/spritesheet_test.png | bin | 0 -> 616 bytes | |||
-rw-r--r-- | resource-manager/test.cpp | 0 |
11 files changed, 131 insertions, 50 deletions
diff --git a/resource-manager/CMakeLists.txt b/resource-manager/CMakeLists.txt index 5c2c962..c25ae2b 100644 --- a/resource-manager/CMakeLists.txt +++ b/resource-manager/CMakeLists.txt @@ -23,6 +23,7 @@ add_executable(main Image_asset.cpp resource_fabricator.cpp resource_manager.cpp + spritesheet.cpp constants.cpp ) diff --git a/resource-manager/Image_asset.cpp b/resource-manager/Image_asset.cpp index 77eee2f..10b35f8 100644 --- a/resource-manager/Image_asset.cpp +++ b/resource-manager/Image_asset.cpp @@ -1,12 +1,21 @@ #include "Image_asset.h" +#include "spritesheet.h" #include <SDL2/SDL_surface.h> +#include <SDL_image.h> +#include <string> +Image::Image(const std::string& path){ + surface = IMG_Load(path.c_str()); +} + Image::~Image(){ - if (surface) { - SDL_FreeSurface(surface); - } + SDL_FreeSurface(surface); +} + +SDL_Surface* Image::getSurface() const { + return surface; } diff --git a/resource-manager/Image_asset.h b/resource-manager/Image_asset.h index e7d13e9..8563352 100644 --- a/resource-manager/Image_asset.h +++ b/resource-manager/Image_asset.h @@ -3,7 +3,9 @@ #include "resource.h" +#include "spritesheet.h" #include <SDL_surface.h> +#include <string> @@ -12,8 +14,12 @@ class Image : public Resource { public: - SDL_Surface* surface = nullptr; - + Image(const std::string& path); ~Image(); + SDL_Surface* getSurface() const; + +private: + SDL_Surface* surface; }; + diff --git a/resource-manager/main.cpp b/resource-manager/main.cpp index 62426d1..6dc362b 100644 --- a/resource-manager/main.cpp +++ b/resource-manager/main.cpp @@ -2,56 +2,61 @@ #include "Image_asset.h" #include "resource_manager.h" +#include "spritesheet.h" #include <SDL.h> #include <SDL2/SDL_image.h> #include <SDL_events.h> #include <SDL_render.h> +#include <SDL_stdinc.h> #include <SDL_surface.h> #include <SDL_timer.h> #include <SDL_video.h> #include <cstddef> - -int main(){ +int main() { SDL_Init(SDL_INIT_VIDEO); - ResourceManager* rm = new ResourceManager; - + ResourceManager * rm = new ResourceManager; - Image* img = static_cast<Image*>(rm->Load("../img.png")); + //Image* img = rm->Load<Image>("../spritesheet_test.png"); //Resource* sound = rm->Load("/sound.ogg"); - bool quit = false; - + SDL_Event event; - SDL_Window* window = SDL_CreateWindow("Tessting resources", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0); + SDL_Window * window + = SDL_CreateWindow("Tessting resources", SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, 640, 480, 0); - SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); - SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, img->surface); + SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0); + SpriteSheet spritesheet("../spritesheet_test.png", *renderer, 1, 4); + SDL_SetRenderDrawColor(renderer, 168, 230, 255, 255); + SDL_RenderClear(renderer); while (!quit) { - SDL_WaitEvent(&event); - - switch (event.type) { - case SDL_QUIT: - quit = true; - break; + Uint32 ticks = SDL_GetTicks(); + int sprite = (ticks / 100) % 4; + + //SDL_Rect srcrect = { sprite * 32, 0, 32, 64 }; + SDL_Rect dstrect = {10, 10, 32, 64}; + + while (SDL_PollEvent(&event) != NULL) { + switch (event.type) { + case SDL_QUIT: + quit = true; + break; + } } - SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderClear(renderer); + spritesheet.select_sprite(sprite, 0); + spritesheet.draw_selected_sprite(renderer, &dstrect); SDL_RenderPresent(renderer); - - SDL_Delay(100); - } - SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); - - return 0; } diff --git a/resource-manager/resource_fabricator.cpp b/resource-manager/resource_fabricator.cpp index 03e3f74..2b1f5f7 100644 --- a/resource-manager/resource_fabricator.cpp +++ b/resource-manager/resource_fabricator.cpp @@ -15,12 +15,8 @@ Resource* ResourceFactory::create_resource(const Constants::FILE_PATH &file_path std::string extension = std::filesystem::path(file_path).extension(); - - if( extension == Constants::PNG_EXT ) { - Image* img = new Image; - img->surface = IMG_Load(file_path.c_str()); - return img; + return new Image(file_path); } else if ( extension == Constants::OGG_EXT ){ return new Audio; diff --git a/resource-manager/resource_manager.cpp b/resource-manager/resource_manager.cpp index ce4d5dc..e8828a4 100644 --- a/resource-manager/resource_manager.cpp +++ b/resource-manager/resource_manager.cpp @@ -24,21 +24,6 @@ ResourceManager::~ResourceManager(){ } -Resource* ResourceManager::Load(const Constants::FILE_PATH& file_path){ - - if(m_resources.find(file_path) != m_resources.end( )){ - return m_resources[file_path]; - } - - Resource* res = ResourceFactory::create_resource(file_path); - if(res){ - m_resources[file_path] = std::move(res); - } - - return m_resources[file_path]; -} - - void ResourceManager::Unload(const Constants::FILE_PATH& file_path){ std::unordered_map<Constants::FILE_PATH, Resource* >::iterator itr = m_resources.find(file_path); if(itr != m_resources.end()){ diff --git a/resource-manager/resource_manager.h b/resource-manager/resource_manager.h index 7a86360..fd6657c 100644 --- a/resource-manager/resource_manager.h +++ b/resource-manager/resource_manager.h @@ -2,12 +2,14 @@ +#include <algorithm> #include <string> #include <unordered_map> #include "resource.h" #include "constants.h" +#include "resource_fabricator.h" using namespace crepe; @@ -20,9 +22,21 @@ public: ResourceManager(); ~ResourceManager(); - Resource* Load(const Constants::FILE_PATH& file_path); - void Unload(const Constants::FILE_PATH& file_path); + template<typename T> + T* Load(const Constants::FILE_PATH& file_path){ + + if (m_resources.find(file_path) != m_resources.end()) { + return static_cast<T*>(m_resources[file_path]); + } + + Resource* resource = ResourceFactory::create_resource(file_path); + if (resource) { + m_resources[file_path] = std::move(resource); + } + return static_cast<T*>(m_resources[file_path]); + } + void Unload(const Constants::FILE_PATH& file_path); private: std::unordered_map<Constants::FILE_PATH, Resource*> m_resources; diff --git a/resource-manager/spritesheet.cpp b/resource-manager/spritesheet.cpp new file mode 100644 index 0000000..c8e1b70 --- /dev/null +++ b/resource-manager/spritesheet.cpp @@ -0,0 +1,38 @@ + + +#include "spritesheet.h" + +#include <SDL2/SDL.h> +#include <SDL_image.h> +#include <SDL_render.h> +#include <SDL_surface.h> +#include <cstdlib> +#include <string> + + +SpriteSheet::SpriteSheet(const std::string& path, SDL_Renderer& renderer, const int row, const int column){ + m_spritesheet_image = IMG_Load(path.c_str()); + texture = SDL_CreateTextureFromSurface(&renderer, m_spritesheet_image); + m_clip.w = m_spritesheet_image->w / column; + m_clip.h = m_spritesheet_image->h / row; + +} + +SpriteSheet::~SpriteSheet(){ + SDL_DestroyTexture(texture); + SDL_FreeSurface(m_spritesheet_image); +} + +void SpriteSheet::select_sprite(const int x, const int y){ + m_clip.x = x * m_clip.w; + m_clip.y = y * m_clip.h; +} + +void SpriteSheet::draw_selected_sprite(SDL_Renderer* window_surface, SDL_Rect* position){ + SDL_RenderCopy(window_surface, texture, &m_clip, position); +} + + +SDL_Surface* SpriteSheet::getSurface() const { + return m_spritesheet_image; +} diff --git a/resource-manager/spritesheet.h b/resource-manager/spritesheet.h new file mode 100644 index 0000000..022b6cf --- /dev/null +++ b/resource-manager/spritesheet.h @@ -0,0 +1,27 @@ +#pragma once + + + + +#include <SDL_rect.h> +#include <SDL_render.h> +#include <SDL_surface.h> +#include <string> +class SpriteSheet{ + + +public: + SpriteSheet(const std::string& path, SDL_Renderer& renderer, const int row, const int column); + ~SpriteSheet(); + + + void select_sprite(const int x, const int y); + void draw_selected_sprite(SDL_Renderer* window_surface, SDL_Rect* position); + SDL_Surface* getSurface() const; + +private: + SDL_Rect m_clip; + SDL_Surface* m_spritesheet_image; + SDL_Texture * texture; + +}; diff --git a/resource-manager/spritesheet_test.png b/resource-manager/spritesheet_test.png Binary files differnew file mode 100644 index 0000000..d68a72a --- /dev/null +++ b/resource-manager/spritesheet_test.png diff --git a/resource-manager/test.cpp b/resource-manager/test.cpp new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/resource-manager/test.cpp |