From 30168411c7d2b60398a536591eb0d218ff083702 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 29 Nov 2018 14:12:00 +0000 Subject: [PATCH] Rect classes and basic texture management with SDL_image --- CMakeLists.txt | 1 + bin/crumpet-engine | Bin 24976 -> 108480 bytes sdl2-config.cmake | 10 -- src/crumpet-engine/crumpet-engine.h | 3 - src/crumpet-engine/game.cpp | 4 +- src/crumpet-engine/game.h | 3 + src/crumpet-engine/rect.cpp | 170 ++++++++++++++++++ src/crumpet-engine/rect.h | 70 ++++++++ .../resourcemanager/resourcemanager.h | 10 ++ .../resourcemanager/texturemanager.cpp | 46 +++++ .../resourcemanager/texturemanager.h | 25 +++ src/main.cpp | 13 +- 12 files changed, 330 insertions(+), 25 deletions(-) delete mode 100644 sdl2-config.cmake create mode 100644 src/crumpet-engine/rect.cpp create mode 100644 src/crumpet-engine/rect.h create mode 100644 src/crumpet-engine/resourcemanager/resourcemanager.h create mode 100644 src/crumpet-engine/resourcemanager/texturemanager.cpp create mode 100644 src/crumpet-engine/resourcemanager/texturemanager.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a7e5140..745d441 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,7 @@ file(GLOB_RECURSE SourceFiles ${EngineDIR}/* ${EngineDIR}/renderengine/* ${EngineDIR}/input/* + ${EngineDIR}/resourcemanager/* ) add_executable(${BuildDIR}/${EXEName} ${SourceFiles}) diff --git a/bin/crumpet-engine b/bin/crumpet-engine index ea6659909f0ccbb91a9b40bd1724338c23fab137..a5516ffe785e3b13d014d91f2697e11e0c492a1d 100755 GIT binary patch literal 108480 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 X=ju-{;7e5fpZ!9v{DxP-JFNU4+n|e@ literal 24976 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 ZofR~L{jwbGb?4I$bSR1C76l6`{u8tihdKZN diff --git a/sdl2-config.cmake b/sdl2-config.cmake deleted file mode 100644 index 4c5eaa6..0000000 --- a/sdl2-config.cmake +++ /dev/null @@ -1,10 +0,0 @@ -set(SDL2_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/include") - -# Support both 32 and 64 bit builds -if (${CMAKE_SIZEOF_VOID_P} MATCHES 8) - set(SDL2_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2main.lib") -else () - set(SDL2_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2main.lib") -endif () - -string(STRIP "${SDL2_LIBRARIES}" SDL2_LIBRARIES) diff --git a/src/crumpet-engine/crumpet-engine.h b/src/crumpet-engine/crumpet-engine.h index 5e2b6dd..0bdd7c4 100644 --- a/src/crumpet-engine/crumpet-engine.h +++ b/src/crumpet-engine/crumpet-engine.h @@ -1,8 +1,5 @@ #pragma once -#include -#include - #include "game.h" #undef main diff --git a/src/crumpet-engine/game.cpp b/src/crumpet-engine/game.cpp index c437934..121a0d1 100644 --- a/src/crumpet-engine/game.cpp +++ b/src/crumpet-engine/game.cpp @@ -1,7 +1,9 @@ #include "game.h" Game::Game() - : input(&renderer) { + : input(&renderer) + , resourceManager(&renderer) + , textureManager(resourceManager.textureManager) { } diff --git a/src/crumpet-engine/game.h b/src/crumpet-engine/game.h index 61d234a..d5dcbfe 100644 --- a/src/crumpet-engine/game.h +++ b/src/crumpet-engine/game.h @@ -6,12 +6,15 @@ #include #include "renderengine/renderer.h" +#include "resourcemanager/resourcemanager.h" #include "input/input.h" class Game { public: Game(); + ResourceManger resourceManager; + TextureManager textureManager; Renderer renderer; Input input; diff --git a/src/crumpet-engine/rect.cpp b/src/crumpet-engine/rect.cpp new file mode 100644 index 0000000..c29189f --- /dev/null +++ b/src/crumpet-engine/rect.cpp @@ -0,0 +1,170 @@ +#include "rect.h" + +Rect::Rect() + : rect(new SDL_Rect{ 0, 0, 0, 0 }) { + Clear(); +} + +Rect::Rect(int x, int y, int w, int h) + : rect(new SDL_Rect{ x, y, w, h }) { + SetRect(x, y, w, h); +} + +void Rect::Clear() { + SetRect(0, 0, 0, 0); +} + +SDL_Rect* Rect::ToSDLRect() { + rect->x = x; + rect->y = y; + rect->w = w; + rect->h = h; + + return rect; +} + +std::string Rect::ToString() { + std::string res = "("; + res += std::to_string(x); + res += ", "; + res += std::to_string(y); + res += ", "; + res += std::to_string(w); + res += ", "; + res += std::to_string(h); + res += ")"; + return res; +} + +bool Rect::Intersects(Rect* rect) { + int leftA = x; + int rightA = x + w; + int topA = y; + int bottomA = y + h; + + int leftB = rect->x; + int rightB = rect->x + rect->w; + int topB = rect->y; + int bottomB = rect->y + rect->h; + + if (bottomA <= topB) return false; + if (topA >= bottomB) return false; + if (rightA <= leftB) return false; + if (leftA >= rightB) return false; + + return true; +} + +// bool Rect::Intersects(int x, int y, int w, int h) { +// return Intersects(&CreateRect(x, y, w, h)); +// } + +bool Rect::Contains(Rect* rect) { + return (rect->x >= x && rect->Right() <= (x + w) && rect->y >= y && rect->Bottom() <= (y + h)); +} + +bool Rect::Contains(Vec2* point) { + return (point->x >= x && point->x <= (x + w) && point->y >= y && point->y <= (y + h)); +} + +bool Rect::Contains(int x, int y, int w, int h) { + Rect tempRect(x, y, w, h); + return Contains(&tempRect); +} + +Vec2* Rect::Position() { + Vec2* res = new Vec2(x, y); + return res; +} + +Vec2* Rect::Center() { + Vec2* res = new Vec2(x + (w / 2), y + (h / 2)); + return res; +} + +int Rect::CenterX() { + return (x + (w / 2)); +} + +int Rect::CenterY() { + return (y + (h / 2)); +} + +int Rect::Left() { + return x; +} + +int Rect::Right() { + return (x + w); +} + +int Rect::Top() { + return y; +} + +int Rect::Bottom() { + return y + h; +} + +int Rect::Perimiter() { + return (w + w + h + h); +} + +int Rect::Area() { + return (w + h); +} + +int Rect::GetX() { + return x; +} + +int Rect::GetY() { + return y; +} + +int Rect::GetW() { + return w; +} + +int Rect::GetH() { + return h; +} + +void Rect::SetRect(int x, int y, int w, int h) { + this->x = x; + this->y = y; + this->w = w; + this->h = h; + + this->rect->x = x; + this->rect->y = y; + this->rect->w = w; + this->rect->h = h; +} + +void Rect::SetSize(Vec2* size) { + this->x = size->x; + this->y = size->y; +} + +void Rect::SetPos(Vec2* pos) { + this->w = pos->x; + this->h = pos->y; +} + +void Rect::Translate(Vec2* offset) { + this->x += offset->x; + this->y += offset->y; +} + +void Rect::TranslateX(int x) { + this->x += x; +} + +void Rect::TranslateY(int y) { + this->y += y; +} + +Rect::~Rect() { + rect = NULL; +} diff --git a/src/crumpet-engine/rect.h b/src/crumpet-engine/rect.h new file mode 100644 index 0000000..5125b50 --- /dev/null +++ b/src/crumpet-engine/rect.h @@ -0,0 +1,70 @@ +#pragma once + +#include +#include +#include "math.h" + +class Rect { +public: + Rect(); + Rect(int x, int y, int w, int h); + void Clear(); + + static Rect CreateRect(int x, int y, int w, int h) { + Rect tempRect(x, y, w, h); + return tempRect; + } + + Rect operator+(Rect* rect) { + return Rect(this->x + rect->x, this->y + this->x, w, h); + } + Rect operator-(Rect* rect) { + return Rect(this->x - rect->x, this->y - this->x, w, h); + } + bool operator==(const Rect* rect) { + return (x == rect->x && y == rect->y && w == rect->w && h == rect->h); + } + bool operator!=(const Rect* rect) { + return !(x == rect->x && y == rect->y && w == rect->w && h == rect->h); + } + + SDL_Rect* ToSDLRect(); + std::string ToString(); + + bool Intersects(Rect* rect); + // bool Intersects(int x, int y, int w, int h); + + bool Contains(Rect* rect); + bool Contains(Vec2* point); + bool Contains(int x, int y, int w, int h); + + Vec2* Position(); + Vec2* Center(); + int CenterX(); + int CenterY(); + + int Left(); + int Right(); + int Top(); + int Bottom(); + int Perimiter(); + int Area(); + + int GetX(); + int GetY(); + int GetW(); + int GetH(); + + void SetRect(int x, int y, int w, int h); + void SetSize(Vec2* size); + void SetPos(Vec2* pos); + void Translate(Vec2* offset); + void TranslateX(int x); + void TranslateY(int y); + + int x, y, w, h; + + virtual ~Rect(); +private: + SDL_Rect* rect; +}; diff --git a/src/crumpet-engine/resourcemanager/resourcemanager.h b/src/crumpet-engine/resourcemanager/resourcemanager.h new file mode 100644 index 0000000..b486ee6 --- /dev/null +++ b/src/crumpet-engine/resourcemanager/resourcemanager.h @@ -0,0 +1,10 @@ +#pragma once + +#include "texturemanager.h" + +class ResourceManger { +public: + ResourceManger(Renderer* renderer) : textureManager(renderer) {}; + + TextureManager textureManager; +}; diff --git a/src/crumpet-engine/resourcemanager/texturemanager.cpp b/src/crumpet-engine/resourcemanager/texturemanager.cpp new file mode 100644 index 0000000..97e4e98 --- /dev/null +++ b/src/crumpet-engine/resourcemanager/texturemanager.cpp @@ -0,0 +1,46 @@ +#include "texturemanager.h" + +TextureManager::TextureManager(Renderer* renderer) { + m_renderer = renderer; +} + +bool TextureManager::registerTexture(std::string textureSource, std::string textureName) { + SDL_Texture* texture; + SDL_Surface* loadSurface = IMG_Load(textureSource.c_str()); + if (loadSurface == NULL) { + std::cout << "ERROR LOADING SURFACE " << SDL_GetError() << std::endl; + return false; + } + texture = SDL_CreateTextureFromSurface(m_renderer->SDLRenderer, loadSurface); + if (texture == NULL) { + std::cout << "ERROR LOADING TEXTURE " << SDL_GetError() << std::endl; + return false; + } + SDL_FreeSurface(loadSurface); + + m_textureSources[textureName] = textureSource; + m_registerdTextures[textureName] = texture; + + return true; +} + +void TextureManager::unregisterTexture(std::string textureName) { + SDL_DestroyTexture(m_registerdTextures[textureName]); + + delete &m_textureSources[textureName]; + delete &m_registerdTextures[textureName]; +} + +SDL_Texture* TextureManager::getTexture(std::string textureName) { + return m_registerdTextures[textureName]; +} + +std::string TextureManager::getTextureSource(std::string textureName) { + return m_textureSources[textureName]; +} + +TextureManager::~TextureManager() { + for (std::map::iterator it = m_registerdTextures.begin(); it != m_registerdTextures.end(); it++) { + SDL_DestroyTexture(m_registerdTextures[it->first]); + } +} diff --git a/src/crumpet-engine/resourcemanager/texturemanager.h b/src/crumpet-engine/resourcemanager/texturemanager.h new file mode 100644 index 0000000..ecb1812 --- /dev/null +++ b/src/crumpet-engine/resourcemanager/texturemanager.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "../renderengine/renderer.h" + +class TextureManager { +public: + TextureManager(Renderer* renderer); + + bool registerTexture(std::string textureSource, std::string textureName); + void unregisterTexture(std::string textureName); + SDL_Texture* getTexture(std::string textureName); + std::string getTextureSource(std::string textureName); + + virtual ~TextureManager(); +private: + std::map m_textureSources; + std::map m_registerdTextures; + Renderer* m_renderer; +}; diff --git a/src/main.cpp b/src/main.cpp index 9e1008f..6b9d44a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,21 +4,12 @@ int main(int argc, char** argv) { Game game; game.renderer.createWindow("Crumpet Engine", 600, 400, SCREEN_MODE_VSYNC); - SDL_Texture* texture; - SDL_Surface* loadSurface = IMG_Load("./resources/mario.png"); - if (loadSurface == NULL) { - std::cout << "ERROR LOADING SURFACE " << SDL_GetError() << std::endl; - } - texture = SDL_CreateTextureFromSurface(game.renderer.SDLRenderer, loadSurface); - if (texture == NULL) { - std::cout << "ERROR LOADING TEXTURE " << SDL_GetError() << std::endl; - } - SDL_FreeSurface(loadSurface); + game.textureManager.registerTexture("./resources/mario.png", "mario"); while (!game.renderer.isWindowClosed()) { game.renderer.clear(); game.input.poll(); - SDL_RenderCopy(game.renderer.SDLRenderer, texture, NULL, NULL); + SDL_RenderCopy(game.renderer.SDLRenderer, game.textureManager.getTexture("mario"), NULL, NULL); game.renderer.update(); } }