Primera implementación Sprite + renderer changes

This commit is contained in:
2021-11-12 18:54:19 +01:00
parent 25dcfb03fc
commit 3ec5e7329b
16 changed files with 277 additions and 61 deletions
+8 -5
View File
@@ -12,7 +12,7 @@ namespace UE
int AssetManager::AssetManagerInit() int AssetManager::AssetManagerInit()
{ {
IMG_Init(IMG_INIT_PNG); IMG_Init(IMG_INIT_PNG);
return 1; return 0;
} }
int AssetManager::AssetManagerClean() int AssetManager::AssetManagerClean()
@@ -21,7 +21,9 @@ namespace UE
{ {
SDL_DestroyTexture(i->second); SDL_DestroyTexture(i->second);
} }
//CPP se debería de encargar de ellos, pero bueno.
_textures.clear();
_assets.clear();
IMG_Quit(); IMG_Quit();
return 0; return 0;
@@ -50,7 +52,7 @@ namespace UE
_assets.push_back(Others.at(i)); _assets.push_back(Others.at(i));
} }
file.close(); file.close();
return 1; return 0;
} }
int AssetManager::LoadAssetQueue() int AssetManager::LoadAssetQueue()
@@ -77,7 +79,7 @@ namespace UE
} }
_assets.clear(); _assets.clear();
return 1; return 0;
} }
void AssetManager::AddAssetToQueue(Asset& as) void AssetManager::AddAssetToQueue(Asset& as)
@@ -95,8 +97,9 @@ namespace UE
} }
int AssetManager::RemoveTexture(std::string name) int AssetManager::RemoveTexture(std::string name)
{ {
SDL_DestroyTexture(_textures.at(name));
_textures.erase(name); _textures.erase(name);
return 1; return 0;
} }
SDL_Texture* AssetManager::getTexture(std::string TextureName) SDL_Texture* AssetManager::getTexture(std::string TextureName)
{ {
+6 -3
View File
@@ -16,9 +16,11 @@
/// ///
/// TODO: /// TODO:
/// - Modificar las funciones de Carga para quitar la queue o implementar una que tenga sentido.
/// Por ejemplo, se puede crear una cola (std::deque) y cargar un asset cada gameLoop en vez de
/// procesar toda la cola de golpe. Optimizaría la carga de assets.
/// - Logging. /// - Logging.
/// - ERROR HANDLING /// - ERROR HANDLING
/// - Cambiar el _assetPath para permitir cargar desde tantos ficheros como se quiera (AssetLoadFromFile).
/// - More asset types. /// - More asset types.
namespace UE namespace UE
@@ -46,10 +48,10 @@ namespace UE
/* Carga de Assets */ /* Carga de Assets */
/* Se cargarán a una queue los asset struct desde un fichero JSON. */ /* Se cargarán a una queue los asset struct desde un fichero JSON. */
/* Se cargarán en memoria los assets de la queue en su correspondiente contenedor. */
int LoadAssetsFromFile(std::string fileToLoad); //Añade a la cola los assets de un archivo. int LoadAssetsFromFile(std::string fileToLoad); //Añade a la cola los assets de un archivo.
int LoadAssetQueue(); //Carga en memoria los assets de la cola.
void AddAssetToQueue(Asset& as); //Añade manualmente un asset a la cola de carga. void AddAssetToQueue(Asset& as); //Añade manualmente un asset a la cola de carga.
/* Se cargarán en memoria los assets de la queue en su correspondiente contenedor. */
int LoadAssetQueue(); //Procesa la queue de carga.
/* Métodos para manejar las SDL_Texture* almacenados. */ /* Métodos para manejar las SDL_Texture* almacenados. */
@@ -70,6 +72,7 @@ namespace UE
/* Almacenes de asssets */ /* Almacenes de asssets */
std::unordered_map<std::string, SDL_Texture*> _textures = {}; std::unordered_map<std::string, SDL_Texture*> _textures = {};
//Necesario para crear las SDL_Texture a partir de SDL_Surface.
SDL_Renderer* _mainRenderer = NULL; SDL_Renderer* _mainRenderer = NULL;
}; };
+58
View File
@@ -0,0 +1,58 @@
#include "Sprite.h"
#include "Render\Renderer.h"
#include "Assets\AssetManager.h"
#include <iostream>
void UE::Sprite::SetTexturePtr(SDL_Texture* texture)
{
_spriteTx = texture;
}
void UE::Sprite::SetTexturePtr(std::string textureName, AssetManager* assetManager)
{
_spriteTx = assetManager->getTexture(textureName);
}
void UE::Sprite::SetPosition(float x, float y)
{
_pos = glm::vec2(x, y);
}
void UE::Sprite::SetPosition(glm::vec<2, float> newPosition)
{
_pos = newPosition;
}
void UE::Sprite::SetSize(float x, float y)
{
_size = glm::vec2(x, y);
}
void UE::Sprite::SetSize(glm::vec<2,float> newSize)
{
_size = newSize;
}
void UE::Sprite::SetLayer(int newLayer)
{
_layer = newLayer;
}
void UE::Sprite::Draw(Renderer* renderer)
{
SDL_Rect destination;
destination.x = _pos.x;
destination.y = _pos.y;
destination.w = _size.x;
destination.h = _size.y;
//std::cout << "Sprite Rendered to: " << destination.x << "-" << destination.y << std::endl;
renderer->QueueDrawCall(_layer, _spriteTx, destination);
}
+96
View File
@@ -0,0 +1,96 @@
#pragma once
#include <string>
#include <SDL.h>
//#include <glm.hpp>
#include <vec2.hpp>
#include "Render\Drawable.h"
namespace UE
{
class Renderer;
class AssetManager;
class Sprite : public Drawable
{
public:
/*
// --------------
// Constructores.
// --------------
*/
/*
Se establecen todos los parámetos.
La textura es obligatoria, y puede darse:
- En std::string nombre y assetManager* -> Va a buscarse al assetManager especificado.
- En SDL_Texture* -> Sin más, se entiende.
En ambos casos se llama al método SetTexturePtr.
Los demás parámetros tienen un valor por defecto.
*/
Sprite(std::string texture_Name, AssetManager* assetManager, int renderLayer = 1,
glm::vec2 position = glm::vec2(0, 0), glm::vec2 size = glm::vec2(100, 100))
: _layer(renderLayer), _pos(position), _size(size)
{
SetTexturePtr(texture_Name, assetManager);
}
Sprite(SDL_Texture* texture, int renderLayer = 1,
glm::vec2 position = glm::vec2(0, 0), glm::vec2 size = glm::vec2(100, 100))
: _layer(renderLayer), _pos(position), _size(size)
{
SetTexturePtr(texture);
}
~Sprite() {}
/*
//-----------
// Setters
//-----------
*/
//Establece la textura a _spriteTx.
//Lo llama el constructor.
// ¿Queremos darle acceso al usuario? ¿Lo movemos a private / protected?
void SetTexturePtr(SDL_Texture* texture);
void SetTexturePtr(std::string textureName, AssetManager* assetManager);
//Modifica la posición del Sprite.
void SetPosition(float x, float y);
void SetPosition(glm::vec<2, float> newPosition);
//Modifica la escala de sprite (en relación a la textura).
void SetSize(float x, float y);
void SetSize(glm::vec<2,float> newSize);
//Set rendering layer.
void SetLayer(int newLayer);
//Implementa el Draw de Drawable.
void Draw(Renderer* renderer) override;
private:
SDL_Texture* _spriteTx = nullptr;
glm::vec<2, float> _pos = glm::vec2(25, 25);
glm::vec<2, float> _size = glm::vec2(100, 100);
int _layer = 1;
};
}
+38 -12
View File
@@ -1,9 +1,11 @@
#include "Game.h" #include "Game.h"
#include "Render/Renderer.h" #include "Render\Renderer.h"
#include "Drawables\Sprite.h"
int UE::Game::GameInit() int UE::Game::GameInit()
{ {
renderer = new Renderer(); renderer = new Renderer(640,480);
renderer->RenderInit(); renderer->RenderInit();
assetManager = new AssetManager(renderer->GetSDLRenderer()); assetManager = new AssetManager(renderer->GetSDLRenderer());
@@ -18,34 +20,58 @@ int UE::Game::GameLoop()
#pragma region TEMP_REDERING #pragma region TEMP_REDERING
SDL_Surface* loaderSurface; //SDL_Surface* loaderSurface;
SDL_Texture* background; SDL_Texture* background;
SDL_Texture* test1;
SDL_Rect DestR; SDL_Rect DestR;
DestR.x = 640 / 2 - 16 / 2; DestR.x = 0;
DestR.y = 580 / 2 - 16 / 2; DestR.y = 0;
DestR.w = 16; DestR.w = 640;
DestR.h = 16; DestR.h = 480;
Asset as1("test1", "resources\\Sprites\\bc.png", AssetType::Texture); SDL_Rect DestR2;
assetManager->AddAssetToQueue(as1); DestR2.x = 48;
DestR2.y = 48;
DestR2.w = 128;
DestR2.h = 128;
//Asset as1("bg1", "resources\\Sprites\\bc.png", AssetType::Texture);
//assetManager->AddAssetToQueue(as1);
assetManager->LoadAssetsFromFile("resources\\AssetList\\MainAssets.json");
assetManager->LoadAssetQueue(); assetManager->LoadAssetQueue();
background = assetManager->getTexture("test1"); background = assetManager->getTexture("bg1");
test1 = assetManager->getTexture("test1");
glm::vec2 sp1_pos(48, 48);
glm::vec2 sp1_size(145, 145);
Sprite sp1("test1", assetManager, 5, sp1_pos, sp1_size);
Sprite sp2("test1", assetManager, 7, sp1_pos);
Sprite sp3(test1);
#pragma endregion #pragma endregion
while (true) while (true)
{ {
SDL_RenderClear(renderer->GetSDLRenderer()); SDL_RenderClear(renderer->GetSDLRenderer());
//FRAME PHYSICS //FRAME PHYSICS
//TICK ALL OBJECTS. //TICK ALL OBJECTS.
renderer->QueueDrawCall(1, background, &DestR); renderer->QueueDrawCall(6, test1, DestR2);
renderer->QueueDrawCall(1, background, DestR);
renderer->Render(sp1);
sp2.Draw(renderer);
//sp3.Draw(renderer);
renderer->RenderDraw(); renderer->RenderDraw();
renderer->RenderUpdate(); renderer->RenderUpdate();
} }
return 0; return 0;
} }
-1
View File
@@ -6,7 +6,6 @@ namespace UE
class Drawable class Drawable
{ {
class DrawCall;
public: public:
Drawable() {} Drawable() {}
+13 -8
View File
@@ -34,7 +34,7 @@ int UE::Renderer::RenderInit()
//Init layers. //Init layers.
for (int i = 0; i < layers; i++) for (int i = 0; i < LAYER_AMOUNT; i++)
{ {
renderLayers.push_back(std::vector<DrawCall>()); renderLayers.push_back(std::vector<DrawCall>());
} }
@@ -48,9 +48,9 @@ void UE::Renderer::RenderDraw()
DrawCall item = renderQueue.at(i); DrawCall item = renderQueue.at(i);
//Add item i to layer number i.layer. //Add item i to layer number i.layer.
if (item.layer > layers) if (item.layer > LAYER_AMOUNT)
{ {
std::cout << "Layer out of range"; std::cout << "Layer out of range\n";
return; return;
} }
renderLayers.at(item.layer).push_back(item); renderLayers.at(item.layer).push_back(item);
@@ -66,7 +66,11 @@ void UE::Renderer::RenderDraw()
for (int k = 0; k < layer.size(); k++) for (int k = 0; k < layer.size(); k++)
{ {
DrawCall item = layer.at(k); DrawCall item = layer.at(k);
SDL_RenderCopy(main_Renderer, item.tx, item.tx_rect, item.pos_rect); if (!item.fullTexture)
{
SDL_RenderCopy(main_Renderer, item.tx, &item.tx_rect, &item.pos_rect);
}
SDL_RenderCopy(main_Renderer, item.tx, NULL, &item.pos_rect);
} }
layer.clear(); layer.clear();
} }
@@ -100,15 +104,16 @@ void UE::Renderer::QueueDrawCall(DrawCall drawCall)
renderQueue.push_back(drawCall); renderQueue.push_back(drawCall);
} }
void UE::Renderer::QueueDrawCall(int layer, SDL_Texture* texture, SDL_Rect* texture_position, SDL_Rect* position) void UE::Renderer::QueueDrawCall(int layer, SDL_Texture* texture, SDL_Rect & texture_position, SDL_Rect & position)
{ {
DrawCall dc = DrawCall(layer, texture, texture_position, position); DrawCall dc = DrawCall(layer, position, texture, texture_position, false);
renderQueue.push_back(dc); renderQueue.push_back(dc);
} }
void UE::Renderer::QueueDrawCall(int layer, SDL_Texture* texture, SDL_Rect* position) void UE::Renderer::QueueDrawCall(int layer, SDL_Texture* texture, SDL_Rect & position)
{ {
DrawCall dc = DrawCall(layer, texture, NULL, position); //std::cout << "Drawable added to queue";
DrawCall dc = DrawCall(layer, position, texture);
renderQueue.push_back(dc); renderQueue.push_back(dc);
} }
+19 -10
View File
@@ -17,7 +17,8 @@ namespace UE
public: public:
/* Constructor */ /* Constructor */
Renderer() Renderer(int windowWidth, int windowHeight, int renderingLayers = 10)
: SCREEN_WIDTH(windowWidth), SCREEN_HEIGHT(windowHeight), LAYER_AMOUNT(renderingLayers)
{ {
printf("Renderer Created"); printf("Renderer Created");
} }
@@ -46,8 +47,8 @@ namespace UE
//Añade un DrawCall al renderQueue. //Añade un DrawCall al renderQueue.
void QueueDrawCall(DrawCall drawCall); void QueueDrawCall(DrawCall drawCall);
void QueueDrawCall(int layer, SDL_Texture* texture, SDL_Rect* texture_position, SDL_Rect* position); void QueueDrawCall(int layer, SDL_Texture* texture, SDL_Rect& texture_position, SDL_Rect& position);
void QueueDrawCall(int layer, SDL_Texture* texture, SDL_Rect* position); void QueueDrawCall(int layer, SDL_Texture* texture, SDL_Rect & position);
//Le pasamos el este renderer al Drawable para que haga lo que quiera. //Le pasamos el este renderer al Drawable para que haga lo que quiera.
//Como si quiere usar el SDL_Renderer, es libre. //Como si quiere usar el SDL_Renderer, es libre.
@@ -57,6 +58,7 @@ namespace UE
SDL_Renderer* GetSDLRenderer() { return main_Renderer; } SDL_Renderer* GetSDLRenderer() { return main_Renderer; }
private: private:
/* Objetos de SDL para el rendering. */
SDL_Window* window = NULL; SDL_Window* window = NULL;
SDL_Surface* screenSurface = NULL; SDL_Surface* screenSurface = NULL;
SDL_Renderer* main_Renderer = NULL; SDL_Renderer* main_Renderer = NULL;
@@ -65,7 +67,9 @@ namespace UE
//Se podría sustituir por un std::queue o std::deque si fuera necesario. //Se podría sustituir por un std::queue o std::deque si fuera necesario.
std::vector<DrawCall> renderQueue; std::vector<DrawCall> renderQueue;
const int layers = 10; //Las capas en las que se organizan los diferentes objetos.
//Permite dibujar unos sprites sobre otros.
const int LAYER_AMOUNT = 10;
std::vector<std::vector<DrawCall>> renderLayers; std::vector<std::vector<DrawCall>> renderLayers;
@@ -75,20 +79,25 @@ namespace UE
}; };
/* /*
Contiene los valores necesarios para realizar el renderizado. Contiene los valores necesarios para realizar el renderizado con SDL_RenderCopy();
Es el resultado de las funciones Draw de los objetos. Se almacena en la renderQueue y luego son ordenados por las renderLayers.
*/ */
struct DrawCall struct DrawCall
{ {
DrawCall(int layer, SDL_Texture* texture, SDL_Rect* texture_position, SDL_Rect* position) DrawCall(int layer, SDL_Rect position, SDL_Texture* texture, SDL_Rect texture_position = SDL_Rect(), bool renderFullTexture = true)
: layer(layer), tx(texture), tx_rect(texture_position), pos_rect(position) {} : layer(layer), fullTexture(renderFullTexture), tx(texture), tx_rect(texture_position), pos_rect(position)
{}
int layer; int layer;
/*Es necesario saber si es la textura completa o sólo una parte.
//De tal forma, el renderer puede pasar un NULL o el tx_rect al SDL_RenderCopy().
*/
bool fullTexture;
SDL_Texture* tx; SDL_Texture* tx;
SDL_Rect* tx_rect; SDL_Rect tx_rect;
SDL_Rect* pos_rect; SDL_Rect pos_rect;
}; };
} }
-18
View File
@@ -1,18 +0,0 @@
#pragma once
#include "Drawable.h"
namespace UE
{
class Sprite : public Drawable
{
public:
};
}
+5 -4
View File
@@ -33,13 +33,14 @@ project (""..GameName.."")
includedirs includedirs
{ {
"UberEngine/vendor/FastNoiseLite", --Header Only -- "UberEngine/vendor/FastNoiseLite", --Header Only
"UberEngine/vendor/glm", -- "UberEngine/vendor/glm",
"UberEngine/vendor/ImGui", -- "UberEngine/vendor/ImGui",
"UberEngine/vendor/json", --Header-Only -- "UberEngine/vendor/json", --Header-Only
"UberEngine/vendor/SDL/include", "UberEngine/vendor/SDL/include",
"UberEngine/vendor/SDL2_image/include", "UberEngine/vendor/SDL2_image/include",
"UberEngine/vendor/spdlog/include", "UberEngine/vendor/spdlog/include",
"UberEngine/vendor",
"UberEngine/src" "UberEngine/src"
} }
+34
View File
@@ -0,0 +1,34 @@
{
"Textures": [
{
"name": "bg1",
"Path": "resources/Sprites/bc.png",
"Type": 0,
"ID": 0
},
{
"name": "test1",
"Path": "resources/Sprites/Test1.png",
"Type": 0,
"ID": 1
},
{
"name": "Player",
"Path": "resources/Sprites/Player.png",
"Type": 0,
"ID": 2
},
{
"name": "Button",
"Path": "resources/Sprites/Button.png",
"Type": 0,
"ID": 3
},
{
"name": "Tilemap",
"Path": "resources/Sprites/Tilemap2.png",
"Type": 0,
"ID": 5
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B