Compare commits

3 Commits
Author SHA1 Message Date
Daniel-Garmig 692812a710 Unificar Encoding.
Revisado que todos los archivos son UTF-8 y espacios como indentación.
2022-08-11 16:47:50 +02:00
Daniel-Garmig 006d223f57 Nueva Clase Engine.
Se ha eliminado la antigua clase Game y movido a la nueva clase Engine.
La clase Engine, encargada de iniciar las cosas, ahora está en el Engine
Además, tiene seguridad en la inicialización.
Ya no se inicia el juego si hay error al cargar libs o sistemas.
2022-08-11 15:16:23 +02:00
Daniel-Garmig b2d6a31275 Nuevo sistema de Escenas.
Nos quitamos del medio la cosa rara del SceneBuilder.
Simplificamos la estructura y la hacemos más o menos segura.
2022-08-11 12:57:40 +02:00
34 changed files with 1676 additions and 1491 deletions
+3
View File
@@ -39,3 +39,6 @@ Repositorio principal de UberEngine. Sin mucho más.
### JSON / AssetManager ### JSON / AssetManager
- [ ] Crear un sistema sencillo (un método o algo común para todas las veces que sea necesario) para añadir seguridad al parse y uso de los JSON. De tal forma que se devuelva el error por consola pero no salten exepciones ni mierdas. - [ ] Crear un sistema sencillo (un método o algo común para todas las veces que sea necesario) para añadir seguridad al parse y uso de los JSON. De tal forma que se devuelva el error por consola pero no salten exepciones ni mierdas.
### Sistema de Escenas.
- [ ] Revisar los métodos para carga/descarga y de cambio de escenas. Creo que se pueden estructurar mejor.
+46 -46
View File
@@ -9,48 +9,48 @@ using json = nlohmann::ordered_json;
namespace UE namespace UE
{ {
/* All types of Assets that can be loadedand stored by an AssetManager */ /* All types of Assets that can be loadedand stored by an AssetManager */
enum class AssetType enum class AssetType
{ {
Texture = 0, Font, Sound, Other, Unvalid = 15 Texture = 0, Font, Sound, Other, Unvalid = 15
}; };
/* Asset struct. Contains info regarding Assets para ser cargados. */ /* Asset struct. Contains info regarding Assets para ser cargados. */
struct Asset struct Asset
{ {
public: public:
Asset() {}; Asset() {};
Asset(std::string name, Asset(std::string name,
std::string path, std::string path,
AssetType type) AssetType type)
: _name(name), _path(path), _type(type) {} : _name(name), _path(path), _type(type) {}
std::string _name = ""; std::string _name = "";
std::string _path = ""; std::string _path = "";
AssetType _type = AssetType::Unvalid; AssetType _type = AssetType::Unvalid;
}; };
/* Conversi�n de una struct Asset a JSON */ /* Conversi�n de una struct Asset a JSON */
inline void to_json(nlohmann::ordered_json& j, const Asset& as) inline void to_json(nlohmann::ordered_json& j, const Asset& as)
{ {
j = nlohmann::ordered_json j = nlohmann::ordered_json
{ {
{"name", as._name}, {"name", as._name},
{"Path", as._path}, {"Path", as._path},
{"Type", as._type}, {"Type", as._type},
}; };
} }
/* Conversi�n de un JSON a una struct Asset */ /* Conversi�n de un JSON a una struct Asset */
inline void from_json(const nlohmann::ordered_json& j, Asset& as) inline void from_json(const nlohmann::ordered_json& j, Asset& as)
{ {
j.at("name").get_to(as._name); j.at("name").get_to(as._name);
j.at("Path").get_to(as._path); j.at("Path").get_to(as._path);
j.at("Type").get_to(as._type); j.at("Type").get_to(as._type);
} }
} }
@@ -62,20 +62,20 @@ namespace UE
/* Conversi�n de un Struct SDL_Rect a JSON */ /* Conversi�n de un Struct SDL_Rect a JSON */
inline void to_json(nlohmann::ordered_json& j, const SDL_Rect& rect) inline void to_json(nlohmann::ordered_json& j, const SDL_Rect& rect)
{ {
j = nlohmann::ordered_json j = nlohmann::ordered_json
{ {
{"posX", rect.x}, {"posX", rect.x},
{"posY", rect.y}, {"posY", rect.y},
{"sizeX", rect.w}, {"sizeX", rect.w},
{"sizeY", rect.h} {"sizeY", rect.h}
}; };
} }
/* Conversi�n de un JSON a un struct SDL_Rect */ /* Conversi�n de un JSON a un struct SDL_Rect */
inline void from_json(const nlohmann::ordered_json& j, SDL_Rect& rect) inline void from_json(const nlohmann::ordered_json& j, SDL_Rect& rect)
{ {
j.at("posX").get_to(rect.x); j.at("posX").get_to(rect.x);
j.at("posY").get_to(rect.y); j.at("posY").get_to(rect.y);
j.at("sizeX").get_to(rect.w); j.at("sizeX").get_to(rect.w);
j.at("sizeY").get_to(rect.h); j.at("sizeY").get_to(rect.h);
} }
+154 -177
View File
@@ -1,4 +1,4 @@
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include "Logging/Logger.h" #include "Logging/Logger.h"
@@ -10,209 +10,186 @@
namespace UE namespace UE
{ {
void AssetManager::InitAssetManager() void AssetManager::InitAssetManager()
{ {
if (IMG_Init(IMG_INIT_PNG)) UE_LOG_INFO("AssetManager Iniciado con éxito.");
{ }
UE_LOG_INFO("SDL_Image Init.");
}
else
{
UE_LOG_ERROR("SDL_Image - Error al inicarse: {0}", IMG_GetError());
}
if (!TTF_Init()) //Retorna 0 si está correcto. void AssetManager::CleanAssetManager()
{ {
UE_LOG_INFO("SDL_TTF se ha inicializado correctamente."); //Destruye todas las texturas de SDL.
} for (auto i = _textures.begin(); i != _textures.end(); i++)
else {
{ i->second->~Texture();
UE_LOG_ERROR("SDL_TTF - Error al inicarse: {0}", TTF_GetError()); }
}
UE_LOG_INFO("AssetManager Iniciado con éxito."); //Limpiamos las fuentes.
} for (auto i = _fonts.begin(); i != _fonts.end(); i++)
{
//Limpiamos las fuentes.
delete i->second;
}
void AssetManager::CleanAssetManager() //CPP se debería de encargar de ellos, pero bueno.
{ _assetQueue.clear();
//Destruye todas las texturas de SDL. _textures.clear();
for (auto i = _textures.begin(); i != _textures.end(); i++)
{
i->second->~Texture();
}
//Limpiamos las fuentes. UE_LOG_INFO("AssetManager Cleaned");
for (auto i = _fonts.begin(); i != _fonts.end(); i++) }
{
//Limpiamos las fuentes.
delete i->second;
}
//CPP se debería de encargar de ellos, pero bueno.
_assetQueue.clear();
_textures.clear();
IMG_Quit(); void AssetManager::LoadAssetsFromFile(std::string filePath)
{
std::fstream file(filePath.c_str());
UE_LOG_INFO("AssetManager Cleaned"); if (!file.is_open())
} {
UE_LOG_ERROR("No se ha podido abrir la lista de assets: {0}", filePath);
}
//Load Asset data from JSON.
json jread = json::parse(file);
json Textures = jread["Textures"];
json Fonts = jread["Fonts"];
json Sounds = jread["Sounds"];
json Others = jread["Others"];
/* Add assets struct to asset map. */
for (int i = 0; i < Textures.size(); i++)
{
_assetQueue.push_back(Textures.at(i));
}
for (int i = 0; i < Fonts.size(); i++)
{
_assetQueue.push_back(Fonts.at(i));
}
for (int i = 0; i < Sounds.size(); i++)
{
_assetQueue.push_back(Sounds.at(i));
}
for (int i = 0; i < Others.size(); i++)
{
_assetQueue.push_back(Others.at(i));
}
file.close();
}
void AssetManager::LoadAsset(Asset& as)
{
_assetQueue.push_back(as);
}
void AssetManager::ProcessAssetQueue(int amount)
{
int cantidad = amount;
if (amount == -1 || cantidad >= _assetQueue.size())
cantidad = _assetQueue.size();
//Load Assets from files, depending on the type.
for (int i = 0; i < cantidad; i++)
{
Asset& as = _assetQueue.front();
switch (as._type)
{
case AssetType::Texture:
{
LoadTexture(as._name, as._path);
break;
}
case AssetType::Font:
{
LoadFont(as._name, as._path);
break;
}
default:
{
UE_LOG_WARN("Asset {0}, Type {1} Cannot be loaded from {2}", as._name, as._type, as._path);
break;
}
}
_assetQueue.pop_front();
}
}
void AssetManager::LoadAssetsFromFile(std::string filePath) void AssetManager::LoadTexture(std::string name, std::string txPath)
{ {
std::fstream file(filePath.c_str()); Texture* tx = new Texture(txPath, _SDL_Renderer);
_textures.insert(std::make_pair(name, tx));
if (!file.is_open()) //std::fstream file(txPath.c_str());
{
UE_LOG_ERROR("No se ha podido abrir la lista de assets: {0}", filePath);
}
//Load Asset data from JSON. //json jread = json::parse(file);
json jread = json::parse(file); //std::string path = jread["TexturePath"];
json Textures = jread["Textures"]; ////Cargamos la textura.
json Fonts = jread["Fonts"]; //SDL_Surface* loadSurface = IMG_Load(path.c_str());
json Sounds = jread["Sounds"]; //SDL_Texture* tx = SDL_CreateTextureFromSurface(_mainRenderer, loadSurface);
json Others = jread["Others"]; //_textures.insert(std::make_pair(name, tx));
//SDL_FreeSurface(loadSurface);
/* Add assets struct to asset map. */ ////Almacenamos los Rects (sprites) de esa textura.
for (int i = 0; i < Textures.size(); i++) //json textureRects = jread["TextureRects"];
{
_assetQueue.push_back(Textures.at(i)); //_textureRects.insert(std::make_pair(name, std::vector<SDL_Rect>()));
} //std::vector<SDL_Rect>& vector = _textureRects.at(name);
for (int i = 0; i < Fonts.size(); i++)
{ //for (int i = 0; i < textureRects.size(); i++)
_assetQueue.push_back(Fonts.at(i)); //{
} // //json rectData = textureRects.at(i);
for (int i = 0; i < Sounds.size(); i++) // //SDL_Rect rect;
{ // //rect.x = rectData.at()
_assetQueue.push_back(Sounds.at(i));
} // vector.push_back(textureRects.at(i).get<SDL_Rect>());
for (int i = 0; i < Others.size(); i++) //}
{
_assetQueue.push_back(Others.at(i));
}
file.close(); //file.close();
} }
void AssetManager::LoadAsset(Asset& as) void AssetManager::RemoveTexture(std::string name)
{ {
_assetQueue.push_back(as); //Se supone que el erase del map llama al destructor del objeto...
} //Pero no lo he comprobado del todo.
_textures.erase(name);
}
void AssetManager::ProcessAssetQueue(int amount) void AssetManager::LoadFont(std::string name, std::string fontPath)
{ {
int cantidad = amount; Font* fo = new Font(fontPath);
_fonts.insert(std::make_pair(name, fo));
if (amount == -1 || cantidad >= _assetQueue.size()) }
cantidad = _assetQueue.size();
//Load Assets from files, depending on the type.
for (int i = 0; i < cantidad; i++)
{
Asset& as = _assetQueue.front();
switch (as._type)
{
case AssetType::Texture:
{
LoadTexture(as._name, as._path);
break;
}
case AssetType::Font:
{
LoadFont(as._name, as._path);
break;
}
default:
{
UE_LOG_WARN("Asset {0}, Type {1} Cannot be loaded from {2}", as._name, as._type, as._path);
break;
}
}
_assetQueue.pop_front();
}
}
void AssetManager::RemoveFont(std::string name)
{
//Se supone que el erase del map llama al destructor del objeto...
//Pero no lo he comprobado del todo.
_fonts.erase(name);
}
void AssetManager::LoadTexture(std::string name, std::string txPath) //////////DEBUG//////////
{
Texture* tx = new Texture(txPath, _SDL_Renderer);
_textures.insert(std::make_pair(name, tx));
//std::fstream file(txPath.c_str());
//json jread = json::parse(file);
//std::string path = jread["TexturePath"];
////Cargamos la textura.
//SDL_Surface* loadSurface = IMG_Load(path.c_str());
//SDL_Texture* tx = SDL_CreateTextureFromSurface(_mainRenderer, loadSurface);
//_textures.insert(std::make_pair(name, tx));
//SDL_FreeSurface(loadSurface);
////Almacenamos los Rects (sprites) de esa textura.
//json textureRects = jread["TextureRects"];
//_textureRects.insert(std::make_pair(name, std::vector<SDL_Rect>()));
//std::vector<SDL_Rect>& vector = _textureRects.at(name);
//for (int i = 0; i < textureRects.size(); i++)
//{
// //json rectData = textureRects.at(i);
// //SDL_Rect rect;
// //rect.x = rectData.at()
// vector.push_back(textureRects.at(i).get<SDL_Rect>());
//}
//file.close(); void AssetManager::PrintAssetInfo()
} {
std::cout << "AM - Debug INFO: " << std::endl;
for (int i = 0; i < _assetQueue.size(); i++) {
std::cout << _assetQueue[i]._name << " - " << _assetQueue[i]._path << std::endl;
}
}
/////////////////////////
void AssetManager::RemoveTexture(std::string name)
{
//Se supone que el erase del map llama al destructor del objeto...
//Pero no lo he comprobado del todo.
_textures.erase(name);
}
void AssetManager::LoadFont(std::string name, std::string fontPath)
{
Font* fo = new Font(fontPath);
_fonts.insert(std::make_pair(name, fo));
}
void AssetManager::RemoveFont(std::string name)
{
//Se supone que el erase del map llama al destructor del objeto...
//Pero no lo he comprobado del todo.
_fonts.erase(name);
}
//////////DEBUG//////////
void AssetManager::PrintAssetInfo()
{
std::cout << "AM - Debug INFO: " << std::endl;
for (int i = 0; i < _assetQueue.size(); i++) {
std::cout << _assetQueue[i]._name << " - " << _assetQueue[i]._path << std::endl;
}
}
/////////////////////////
} }
+116 -117
View File
@@ -11,20 +11,19 @@
#include <SDL_image.h> #include <SDL_image.h>
/*UberEngine Includes*/ /*UberEngine Includes*/
//#include "Assets\Asset.h" #include "Assets/Asset.h"
#include "Assets/Texture.h" #include "Assets/Texture.h"
#include "Assets/Font.h" #include "Assets/Font.h"
#include "Assets/Asset.h"
using json = nlohmann::ordered_json; using json = nlohmann::ordered_json;
/// ///
/// TODO: /// TODO:
/// - Modificar las funciones de Carga para quitar la queue o implementar una que tenga sentido. /// - 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 /// 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. /// procesar toda la cola de golpe. Optimizar�a la carga de assets.
/// - Terminar la implementaci�n del tipo de carga (queue/now). /// - Terminar la implementaci�n del tipo de carga (queue/now).
/// - Modificar los for en la carga de archivo, as� como la estructura del archivo JSON. El tipo de Asset est� repetido. /// - Modificar los for en la carga de archivo, as� como la estructura del archivo JSON. El tipo de Asset est� repetido.
/// - Logging. /// - Logging.
/// - ERROR HANDLING /// - ERROR HANDLING
@@ -33,151 +32,151 @@ using json = nlohmann::ordered_json;
namespace UE namespace UE
{ {
/* Gestiona todos assets primitivos, almacenando sus ptrs en un lugar seguro. */ /* Gestiona todos assets primitivos, almacenando sus ptrs en un lugar seguro. */
class AssetManager class AssetManager
{ {
public: public:
/* Constructor. */ /* Constructor. */
AssetManager(SDL_Renderer* SDLrenderer) AssetManager(SDL_Renderer* SDLrenderer)
: _SDL_Renderer(SDLrenderer) {} : _SDL_Renderer(SDLrenderer) {}
/** /**
* Init AssetManager y todo lo necesario para funcionar correctamente. * Init AssetManager y todo lo necesario para funcionar correctamente.
* - Inicia SDL_IMG. * - Inicia SDL_IMG.
*/ */
void InitAssetManager(); void InitAssetManager();
/** /**
* *
* Clean AssetManager Data on exit * Clean AssetManager Data on exit
* - Elimina todos los assets de sus contenedores. * - Elimina todos los assets de sus contenedores.
* - Descarga SDL_IMG * - Descarga SDL_IMG
*/ */
void CleanAssetManager(); void CleanAssetManager();
/* Carga de Assets */ /* Carga de Assets */
/** /**
* Carga los datos de los Assets desde un fichero JSON seg�n par�metros. * Carga los datos de los Assets desde un fichero JSON seg�n par�metros.
* *
* \param filePath: Ubicaci�n del archivo JSON. * \param filePath: Ubicaci�n del archivo JSON.
* \param loadMethod: Forma de carga. Procesado al momento o a�adido a la cola de carga. * \param loadMethod: Forma de carga. Procesado al momento o a�adido a la cola de carga.
* *
*/ */
void LoadAssetsFromFile(std::string filePath); void LoadAssetsFromFile(std::string filePath);
/** /**
* Carga el Asset pasado por par�metro. * Carga el Asset pasado por par�metro.
* *
* \param as: Asset que cargar. * \param as: Asset que cargar.
* \param loadMethod: Forma de carga. Procesado al momento o a�adido a la cola de carga. * \param loadMethod: Forma de carga. Procesado al momento o a�adido a la cola de carga.
* *
*/ */
void LoadAsset(Asset& as); void LoadAsset(Asset& as);
/** /**
* Procesa la cola de carga de Assets. * Procesa la cola de carga de Assets.
* *
* \param Amount: N�mero de Assets de la cola a procesar. Si vale -1 se procesar�n todos. * \param Amount: N�mero de Assets de la cola a procesar. Si vale -1 se procesar�n todos.
* *
*/ */
void ProcessAssetQueue(int amount = -1); void ProcessAssetQueue(int amount = -1);
/** /**
* Devuelve la cantidad de Assets que quedan sin procesar en la cola. * Devuelve la cantidad de Assets que quedan sin procesar en la cola.
* De esta forma, se puede hacer un bucle hasta que la cola sea <= 0. * De esta forma, se puede hacer un bucle hasta que la cola sea <= 0.
* *
*/ */
inline int GetAssetQueueSize() { return _assetQueue.size(); } inline int GetAssetQueueSize() { return _assetQueue.size(); }
/// <summary> /// <summary>
/// Comprueba si la cola de carga de Assets est� vac�a. /// Comprueba si la cola de carga de Assets est� vac�a.
/// </summary> /// </summary>
/// <returns>El resultado de la cola.</returns> /// <returns>El resultado de la cola.</returns>
inline bool IsAssetQueueEmpty() { return _assetQueue.empty(); } inline bool IsAssetQueueEmpty() { return _assetQueue.empty(); }
/*--------------------------------------/ /*--------------------------------------/
* M�todos para manejar las texturas. * * M�todos para manejar las texturas. *
*--------------------------------------*/ *--------------------------------------*/
//Crea una textura de SDL y la a�ade al mapa de texturas identificada por su nombre. //Crea una textura de SDL y la a�ade al mapa de texturas identificada por su nombre.
void LoadTexture(std::string name, std::string txPath); void LoadTexture(std::string name, std::string txPath);
//Elimina una textura del mapa a partir de su nombre. //Elimina una textura del mapa a partir de su nombre.
void RemoveTexture(std::string name); void RemoveTexture(std::string name);
//Obtiene una textura del mapa a partir de su nombre. //Obtiene una textura del mapa a partir de su nombre.
//inline SDL_Texture* getTexture(std::string textureName) { return _textures.at(textureName); } //inline SDL_Texture* getTexture(std::string textureName) { return _textures.at(textureName); }
inline Texture* getTexture(std::string textureName) { return _textures.at(textureName); } inline Texture* getTexture(std::string textureName) { return _textures.at(textureName); }
//inline std::vector<SDL_Rect>* getTexureRects(std::string textureName) { return &_textureRects.at(textureName); } //inline std::vector<SDL_Rect>* getTexureRects(std::string textureName) { return &_textureRects.at(textureName); }
/*------------------------------------/ /*------------------------------------/
* M�todos para manejar las fuentes. * * M�todos para manejar las fuentes. *
*------------------------------------*/ *------------------------------------*/
/** /**
* Crea un objeto UE:Font y lo a�ade al mapa de fuentes. * Crea un objeto UE:Font y lo a�ade al mapa de fuentes.
* *
* @param name : Nombre del asset (key para el mapa de fuentes). * @param name : Nombre del asset (key para el mapa de fuentes).
* @param fontPath : Ubicaci�n del archivo de datos sobre la fuente. * @param fontPath : Ubicaci�n del archivo de datos sobre la fuente.
* *
*/ */
void LoadFont(std::string name, std::string fontPath); void LoadFont(std::string name, std::string fontPath);
/** /**
* Elimina una fuente (y en teor�a limpia la fuente) dado su nombre de Asset. * Elimina una fuente (y en teor�a limpia la fuente) dado su nombre de Asset.
* *
* @param name : Nombre del Asset (key del mapa de fuentes). * @param name : Nombre del Asset (key del mapa de fuentes).
* *
*/ */
void RemoveFont(std::string name); void RemoveFont(std::string name);
/** /**
* Obtiene y devuelve el ptr a una fuente dado su nombre de asset. * Obtiene y devuelve el ptr a una fuente dado su nombre de asset.
* *
* @param fontName : Nombre del Asset. * @param fontName : Nombre del Asset.
* @return UE::Font* : El ptr a la fuente solicitada. * @return UE::Font* : El ptr a la fuente solicitada.
* *
*/ */
inline Font* GetFont(std::string fontName) { return _fonts.at(fontName); } inline Font* GetFont(std::string fontName) { return _fonts.at(fontName); }
///////DEBUG//////// ///////DEBUG////////
void PrintAssetInfo(); void PrintAssetInfo();
/////////////////// ///////////////////
private: private:
//---------------------- //----------------------
//VARIABLES //VARIABLES
//--------------------- //---------------------
//std::string _assetPath; //std::string _assetPath;
//std::vector<UE::Asset> _assets = {}; //std::vector<UE::Asset> _assets = {};
std::deque<UE::Asset> _assetQueue = {}; std::deque<UE::Asset> _assetQueue = {};
/* Almacenes de asssets */ /* Almacenes de asssets */
//Almac�n de SDL_Texture* (ptrs, pues lo gestiona SDL). //Almac�n de SDL_Texture* (ptrs, pues lo gestiona SDL).
//std::unordered_map<std::string, SDL_Texture*> _textures = {}; //std::unordered_map<std::string, SDL_Texture*> _textures = {};
//std::unordered_map<std::string, std::vector<SDL_Rect>> _textureRects = {}; //std::unordered_map<std::string, std::vector<SDL_Rect>> _textureRects = {};
std::unordered_map <std::string, Texture*> _textures = {}; std::unordered_map <std::string, Texture*> _textures = {};
//Almacen de TTF_Fonts* (Para las fuentes de SDL_TTF). //Almacen de TTF_Fonts* (Para las fuentes de SDL_TTF).
std::unordered_map<std::string, Font*> _fonts = {}; std::unordered_map<std::string, Font*> _fonts = {};
//Necesario para crear las SDL_Texture a partir de SDL_Surface. //Necesario para crear las SDL_Texture a partir de SDL_Surface.
SDL_Renderer* _SDL_Renderer = NULL; SDL_Renderer* _SDL_Renderer = NULL;
}; };
} }
+44 -44
View File
@@ -10,70 +10,70 @@ using json = nlohmann::ordered_json;
TTF_Font* UE::Font::GetFont(int size) TTF_Font* UE::Font::GetFont(int size)
{ {
TTF_Font* font; TTF_Font* font;
auto it = _fonts.find(size); auto it = _fonts.find(size);
if (it == _fonts.end()) if (it == _fonts.end())
{ {
//El tama�o pedido no est� disponible. //El tama�o pedido no est� disponible.
//La creamos nueva. //La creamos nueva.
font = CreateFontSize(size); font = CreateFontSize(size);
return font; return font;
} }
//En caso de estar disponible, lo retornamos. //En caso de estar disponible, lo retornamos.
font = it->second; font = it->second;
return font; return font;
} }
void UE::Font::InitFont() void UE::Font::InitFont()
{ {
//Cargamos los datos desde el archivo. //Cargamos los datos desde el archivo.
std::fstream file(_dataPath.c_str()); std::fstream file(_dataPath.c_str());
if (!file.is_open()) if (!file.is_open())
{ {
UE_LOG_ERROR("No se ha podido abrir el archivo de datos de fuente: {0}", _fontPath); UE_LOG_ERROR("No se ha podido abrir el archivo de datos de fuente: {0}", _fontPath);
return; return;
} }
json jread = json::parse(file); json jread = json::parse(file);
_fontPath = jread["FontPath"].get<std::string>(); _fontPath = jread["FontPath"].get<std::string>();
//Obtenemos los tama�os que crear de inicio. //Obtenemos los tama�os que crear de inicio.
std::vector<int> vect = jread["FontSizes"].get<std::vector<int>>(); std::vector<int> vect = jread["FontSizes"].get<std::vector<int>>();
for (auto it : vect) for (auto it : vect)
{ {
CreateFontSize(it); CreateFontSize(it);
} }
file.close(); file.close();
} }
void UE::Font::CleanFont() void UE::Font::CleanFont()
{ {
//Eliminamos todos los tama�os de las fuentes. //Eliminamos todos los tama�os de las fuentes.
for (auto i = _fonts.begin(); i != _fonts.end(); i++) for (auto i = _fonts.begin(); i != _fonts.end(); i++)
{ {
TTF_CloseFont(i->second); TTF_CloseFont(i->second);
} }
} }
TTF_Font* UE::Font::CreateFontSize(int size) TTF_Font* UE::Font::CreateFontSize(int size)
{ {
//Creamos la fuente del tama�o requerido. //Creamos la fuente del tama�o requerido.
TTF_Font* font = TTF_OpenFont(_fontPath.c_str(), size); TTF_Font* font = TTF_OpenFont(_fontPath.c_str(), size);
if (font == nullptr) if (font == nullptr)
{ {
UE_LOG_ERROR("No se ha podido crear la fuente: {0} - Size: {1}", _fontPath, size); UE_LOG_ERROR("No se ha podido crear la fuente: {0} - Size: {1}", _fontPath, size);
return nullptr; return nullptr;
} }
//La a�adimos al mapa. //La a�adimos al mapa.
_fonts.insert(std::make_pair(size, font)); _fonts.insert(std::make_pair(size, font));
UE_LOG_TRACE("Font: {0} se ha creado con tamanho: {1}", _fontPath, size); UE_LOG_TRACE("Font: {0} se ha creado con tamanho: {1}", _fontPath, size);
return font; return font;
} }
+59 -59
View File
@@ -7,79 +7,79 @@
namespace UE namespace UE
{ {
/** /**
* Clase Wrapper para las SDL_Fonts. * Clase Wrapper para las SDL_Fonts.
* También sirve de "cache" para los diferentes tamaños de la fuente, de esta forma * Tambi�n sirve de "cache" para los diferentes tama�os de la fuente, de esta forma
* reducimos las veces que generamos las fuentes y podemos utilizar múltiples tamaños de forma sencilla. * reducimos las veces que generamos las fuentes y podemos utilizar m�ltiples tama�os de forma sencilla.
* *
*/ */
class Font class Font
{ {
public: public:
//----------------------- //-----------------------
//----- Constructor ----- //----- Constructor -----
//----------------------- //-----------------------
Font(std::string dataPath) Font(std::string dataPath)
: _dataPath(dataPath) : _dataPath(dataPath)
{ {
InitFont(); InitFont();
} }
~Font() ~Font()
{ {
CleanFont(); CleanFont();
} }
//----------------------- //-----------------------
//------- Methods ------- //------- Methods -------
//----------------------- //-----------------------
/** /**
* Devuelve la fuente del tamaño pedido. * Devuelve la fuente del tama�o pedido.
* En caso de no estar disponible, la genera y la añade al cache antes de devolverla. * En caso de no estar disponible, la genera y la a�ade al cache antes de devolverla.
* *
* @param size : tamaño de la fuente. * @param size : tama�o de la fuente.
* @return TTF_Font* : Fuente del tamaño solicitado. * @return TTF_Font* : Fuente del tama�o solicitado.
*/ */
TTF_Font* GetFont(int size); TTF_Font* GetFont(int size);
private: private:
/** /**
* Crea la fuente a partir del archivo de datos. * Crea la fuente a partir del archivo de datos.
*/ */
void InitFont(); void InitFont();
/** /**
* Limpia la fuente, eliminando todos sus tamaños y vaciando toda la memoria. * Limpia la fuente, eliminando todos sus tama�os y vaciando toda la memoria.
*/ */
void CleanFont(); void CleanFont();
/** /**
* Se encarga de generar el tamaño de fuente deseado. * Se encarga de generar el tama�o de fuente deseado.
* *
* @param size : tamaño a generar. * @param size : tama�o a generar.
* @return TTF_Font* : Ptr al nuevo tamaño generado. Hay que guardarlo en algún sitio. * @return TTF_Font* : Ptr al nuevo tama�o generado. Hay que guardarlo en alg�n sitio.
*/ */
TTF_Font* CreateFontSize(int size); TTF_Font* CreateFontSize(int size);
//----------------------- //-----------------------
//------ Variables ------ //------ Variables ------
//----------------------- //-----------------------
private: private:
//Ubicación del archivo de datos (.json). //Ubicaci�n del archivo de datos (.json).
std::string _dataPath = ""; std::string _dataPath = "";
//Ubicación de la tipografía (.ttf). //Ubicaci�n de la tipograf�a (.ttf).
std::string _fontPath = ""; std::string _fontPath = "";
//Caché de los diferentes tamaños de la fuente. //Cach� de los diferentes tama�os de la fuente.
std::unordered_map<int, TTF_Font*> _fonts = {}; std::unordered_map<int, TTF_Font*> _fonts = {};
}; };
} }
+34 -34
View File
@@ -10,61 +10,61 @@ using json = nlohmann::ordered_json;
SDL_Rect* UE::Texture::GetTextureRect(int i) SDL_Rect* UE::Texture::GetTextureRect(int i)
{ {
try try
{ {
SDL_Rect* rect = &_txRects.at(i); SDL_Rect* rect = &_txRects.at(i);
return rect; return rect;
} }
catch (const std::out_of_range&) catch (const std::out_of_range&)
{ {
UE_LOG_ERROR("La textura {0} no tiene rect {1}", _txPath, i); UE_LOG_ERROR("La textura {0} no tiene rect {1}", _txPath, i);
return &_txRects.at(0); return &_txRects.at(0);
} }
} }
void UE::Texture::InitTexture() void UE::Texture::InitTexture()
{ {
std::fstream file(_dataPath); std::fstream file(_dataPath);
//Comprobamos si el archivo se ha abierto. //Comprobamos si el archivo se ha abierto.
if (!file.is_open()) if (!file.is_open())
{ {
UE_LOG_ERROR("No se ha podido abrir el archivo de datos de textura: {0}", _dataPath); UE_LOG_ERROR("No se ha podido abrir el archivo de datos de textura: {0}", _dataPath);
return; return;
} }
json jread = json::parse(file); json jread = json::parse(file);
_txPath = jread["TexturePath"].get<std::string>(); _txPath = jread["TexturePath"].get<std::string>();
//Creamos la textura. //Creamos la textura.
CreateTexture(); CreateTexture();
//Cargamos los Rects. //Cargamos los Rects.
json textureRects = jread["TextureRects"]; json textureRects = jread["TextureRects"];
for (int i = 0; i < textureRects.size(); i++) for (int i = 0; i < textureRects.size(); i++)
{ {
AddRect(textureRects.at(i).get<SDL_Rect>()); AddRect(textureRects.at(i).get<SDL_Rect>());
} }
file.close(); file.close();
} }
void UE::Texture::CleanTexture() void UE::Texture::CleanTexture()
{ {
SDL_DestroyTexture(_texture); SDL_DestroyTexture(_texture);
_txRects.clear(); _txRects.clear();
} }
void UE::Texture::CreateTexture() void UE::Texture::CreateTexture()
{ {
SDL_Surface* loadSurface = IMG_Load(_txPath.c_str()); SDL_Surface* loadSurface = IMG_Load(_txPath.c_str());
_texture = SDL_CreateTextureFromSurface(_SDL_Renderer, loadSurface); _texture = SDL_CreateTextureFromSurface(_SDL_Renderer, loadSurface);
SDL_FreeSurface(loadSurface); SDL_FreeSurface(loadSurface);
} }
void UE::Texture::AddRect(SDL_Rect newRect) void UE::Texture::AddRect(SDL_Rect newRect)
{ {
_txRects.push_back(newRect); _txRects.push_back(newRect);
} }
+67 -67
View File
@@ -9,93 +9,93 @@
namespace UE namespace UE
{ {
class Texture class Texture
{ {
public: public:
//----------------------- //-----------------------
//----- Constructor ----- //----- Constructor -----
//----------------------- //-----------------------
Texture(std::string dataPath, SDL_Renderer* renderer) Texture(std::string dataPath, SDL_Renderer* renderer)
: _dataPath(dataPath), _SDL_Renderer(renderer) : _dataPath(dataPath), _SDL_Renderer(renderer)
{ {
InitTexture(); InitTexture();
} }
~Texture() ~Texture()
{ {
CleanTexture(); CleanTexture();
} }
//----------------------- //-----------------------
//------- Methods ------- //------- Methods -------
//----------------------- //-----------------------
/** /**
* Retorna la textura. * Retorna la textura.
*/ */
inline SDL_Texture* GetTexture() { return _texture; } inline SDL_Texture* GetTexture() { return _texture; }
/** /**
* Retorna los Rects de la textura. * Retorna los Rects de la textura.
*/ */
inline std::vector<SDL_Rect>* GetRectsVector() { return &_txRects; } inline std::vector<SDL_Rect>* GetRectsVector() { return &_txRects; }
/** /**
* Retorna el Rect pedido. Comprobando que está disponible. * Retorna el Rect pedido. Comprobando que est� disponible.
* Si no está disponible, devuelve el rect de index 0 (que debería ser el por defecto). * Si no est� disponible, devuelve el rect de index 0 (que deber�a ser el por defecto).
* *
* @param i : Índice del rect. * @param i : �ndice del rect.
* @return El SDL_Rect* solicitado (o el por defecto en caso de error). * @return El SDL_Rect* solicitado (o el por defecto en caso de error).
*/ */
SDL_Rect* GetTextureRect(int i); SDL_Rect* GetTextureRect(int i);
private: private:
/** /**
* Carga los datos desde el archivo de datos y crea la textura y sus rects. * Carga los datos desde el archivo de datos y crea la textura y sus rects.
*/ */
void InitTexture(); void InitTexture();
/** /**
* Limpia todos los datos guardados. * Limpia todos los datos guardados.
*/ */
void CleanTexture(); void CleanTexture();
/** /**
* Método encargado de generar la textura a partir de los valores de la clase. * M�todo encargado de generar la textura a partir de los valores de la clase.
*/ */
void CreateTexture(); void CreateTexture();
/** /**
* Método que añade un SDL_Rect al vector correspondiente. * M�todo que a�ade un SDL_Rect al vector correspondiente.
* @param newRect : Nuevo Rect que añadir al vector de Rects. * @param newRect : Nuevo Rect que a�adir al vector de Rects.
*/ */
void AddRect(SDL_Rect newRect); void AddRect(SDL_Rect newRect);
//----------------------- //-----------------------
//------ Variables ------ //------ Variables ------
//----------------------- //-----------------------
private: private:
//Ubicación del archivo de datos (.json). //Ubicaci�n del archivo de datos (.json).
std::string _dataPath = ""; std::string _dataPath = "";
//El propio renderer de SDL. Es necesario para crear y operar con las SDL_Textures. //El propio renderer de SDL. Es necesario para crear y operar con las SDL_Textures.
SDL_Renderer* _SDL_Renderer = nullptr; SDL_Renderer* _SDL_Renderer = nullptr;
//Ubicación de la textura (.png). //Ubicaci�n de la textura (.png).
std::string _txPath = ""; std::string _txPath = "";
//La propia textura. //La propia textura.
SDL_Texture* _texture = nullptr; SDL_Texture* _texture = nullptr;
//Conjunto de rects que hay en la textura. //Conjunto de rects que hay en la textura.
std::vector<SDL_Rect> _txRects = {}; std::vector<SDL_Rect> _txRects = {};
}; };
} }
+19 -19
View File
@@ -9,45 +9,45 @@
void UE::Sprite::SetTextureRect(int textureID) void UE::Sprite::SetTextureRect(int textureID)
{ {
SDL_Rect* newRect = _texture->GetTextureRect(textureID); SDL_Rect* newRect = _texture->GetTextureRect(textureID);
if (newRect != nullptr) if (newRect != nullptr)
{ {
_actualTxRect = newRect; _actualTxRect = newRect;
} }
} }
void UE::Sprite::SetActive(bool active) void UE::Sprite::SetActive(bool active)
{ {
isActive = active; isActive = active;
} }
bool UE::Sprite::IsActive() bool UE::Sprite::IsActive()
{ {
return isActive; return isActive;
} }
void UE::Sprite::Draw(Renderer* renderer) void UE::Sprite::Draw(Renderer* renderer)
{ {
//Convertimos a ScreenCoords. //Convertimos a ScreenCoords.
glm::ivec2 screenCoords = renderer->WorldToSreenCoords(_pos); glm::ivec2 screenCoords = renderer->WorldToSreenCoords(_pos);
SDL_Rect position = { screenCoords.x, screenCoords.y, _size.x, _size.y }; SDL_Rect position = { screenCoords.x, screenCoords.y, _size.x, _size.y };
//destination.x = _pos.x; //destination.x = _pos.x;
//destination.y = _pos.y; //destination.y = _pos.y;
// //
//destination.w = _size.x; //destination.w = _size.x;
//destination.h = _size.y; //destination.h = _size.y;
//std::cout << "Sprite Rendered to: " << destination.x << "-" << destination.y << std::endl; //std::cout << "Sprite Rendered to: " << destination.x << "-" << destination.y << std::endl;
renderer->QueueDrawCall(_renderLayer, position, _texture->GetTexture(), *_actualTxRect); renderer->QueueDrawCall(_renderLayer, position, _texture->GetTexture(), *_actualTxRect);
} }
SDL_Rect UE::Sprite::getPositionRect() SDL_Rect UE::Sprite::getPositionRect()
{ {
SDL_Rect position = { _pos.x, _pos.y, _size.x, _size.y }; SDL_Rect position = { _pos.x, _pos.y, _size.x, _size.y };
return position; return position;
} }
+49 -49
View File
@@ -21,80 +21,80 @@
namespace UE namespace UE
{ {
class Renderer; class Renderer;
class Sprite : public Drawable, public Transformable class Sprite : public Drawable, public Transformable
{ {
public: public:
/* /*
// -------------- // --------------
// Constructores. // Constructores.
// -------------- // --------------
*/ */
/* /*
Se establecen todos los par�metos. Se establecen todos los par�metos.
La textura es obligatoria, y puede ha de darse: La textura es obligatoria, y puede ha de darse:
- En SDL_Texture* -> Sin m�s, se entiende. - En SDL_Texture* -> Sin m�s, se entiende.
En ambos casos se llama al m�todo SetTexturePtr. En ambos casos se llama al m�todo SetTexturePtr.
Los dem�s par�metros tienen un valor por defecto. Los dem�s par�metros tienen un valor por defecto.
\param texturePtr: El pointer a la textura de SDL. \param texturePtr: El pointer a la textura de SDL.
\param textureRects: El pointer al conjunto de SDL_Rects de la textura. \param textureRects: El pointer al conjunto de SDL_Rects de la textura.
\param textureRectID: El n�mero de Rect del conjunto de rects. \param textureRectID: El n�mero de Rect del conjunto de rects.
\param renderLayer: La Layer en que se renderizar�. \param renderLayer: La Layer en que se renderizar�.
*/ */
Sprite(UE::Texture* texture, Sprite(UE::Texture* texture,
int textureRectID = 0, int textureRectID = 0,
int renderLayer = 1, int renderLayer = 1,
glm::vec2 position = glm::vec2(0, 0), glm::vec2 position = glm::vec2(0, 0),
glm::vec2 size = glm::vec2(100, 100)) glm::vec2 size = glm::vec2(100, 100))
: _texture(texture) : _texture(texture)
{ {
SetTextureRect(textureRectID); SetTextureRect(textureRectID);
SetLayer(renderLayer); SetLayer(renderLayer);
SetPosition(position); SetPosition(position);
SetSize(size); SetSize(size);
} }
~Sprite() {} ~Sprite() {}
//----------- //-----------
//- Setters - //- Setters -
//----------- //-----------
void SetTextureRect(int textureID); void SetTextureRect(int textureID);
void SetActive(bool active); void SetActive(bool active);
bool IsActive(); bool IsActive();
//Implementa el Draw de Drawable. //Implementa el Draw de Drawable.
void Draw(Renderer* renderer) override; void Draw(Renderer* renderer) override;
SDL_Rect getPositionRect(); SDL_Rect getPositionRect();
private: private:
//Datos de la textura. Sirven para pedirla al AssetManager. //Datos de la textura. Sirven para pedirla al AssetManager.
UE::Texture* _texture = nullptr; UE::Texture* _texture = nullptr;
//El que se va a renderizar. //El que se va a renderizar.
SDL_Rect* _actualTxRect = nullptr; SDL_Rect* _actualTxRect = nullptr;
bool isActive = true; bool isActive = true;
}; };
} }
+47 -47
View File
@@ -5,28 +5,28 @@
void UE::TextBox::SetText(std::string newText) void UE::TextBox::SetText(std::string newText)
{ {
_text = newText; _text = newText;
RenderTextTexture(); RenderTextTexture();
} }
void UE::TextBox::SetSize(int newSize) void UE::TextBox::SetSize(int newSize)
{ {
_textSize = newSize; _textSize = newSize;
RenderTextTexture(); RenderTextTexture();
} }
void UE::TextBox::SetColor(UE_Color newColor) void UE::TextBox::SetColor(UE_Color newColor)
{ {
_textColor = newColor; _textColor = newColor;
RenderTextTexture(); RenderTextTexture();
} }
void UE::TextBox::SetColor(int r, int g, int b, int a) void UE::TextBox::SetColor(int r, int g, int b, int a)
{ {
UE_Color c = UE_Color(r, g, b, a); UE_Color c = UE_Color(r, g, b, a);
_textColor = c; _textColor = c;
RenderTextTexture(); RenderTextTexture();
} }
@@ -34,56 +34,56 @@ void UE::TextBox::SetColor(int r, int g, int b, int a)
void UE::TextBox::Draw(Renderer* renderer) void UE::TextBox::Draw(Renderer* renderer)
{ {
//Si a�n no tenemos renderer, lo guardamos y procesamos. //Si a�n no tenemos renderer, lo guardamos y procesamos.
if (_sdlRenderer == nullptr) if (_sdlRenderer == nullptr)
{ {
_sdlRenderer = renderer->GetSDLRenderer(); _sdlRenderer = renderer->GetSDLRenderer();
RenderTextTexture(); RenderTextTexture();
} }
if (_textTexture == nullptr) if (_textTexture == nullptr)
{ {
UE_LOG_WARN("El texto: {0} ; No se est� renderizando. La textura no existe.", _text); UE_LOG_WARN("El texto: {0} ; No se est� renderizando. La textura no existe.", _text);
return; return;
} }
//Generamos el SDL_Rect destino. //Generamos el SDL_Rect destino.
SDL_Rect dest = { _pos.x, _pos.y, _size.x, _size.y }; SDL_Rect dest = { _pos.x, _pos.y, _size.x, _size.y };
renderer->QueueDrawCall(_renderLayer, dest, _textTexture); renderer->QueueDrawCall(_renderLayer, dest, _textTexture);
} }
void UE::TextBox::RenderTextTexture() void UE::TextBox::RenderTextTexture()
{ {
//No podemos continuar hasta que no tengamos un renderer. //No podemos continuar hasta que no tengamos un renderer.
if (_sdlRenderer == nullptr) { return; } if (_sdlRenderer == nullptr) { return; }
SDL_DestroyTexture(_textTexture); SDL_DestroyTexture(_textTexture);
//Creamos el SDL_Color a partir del vec4 que contiene el color. //Creamos el SDL_Color a partir del vec4 que contiene el color.
SDL_Color color = { _textColor.x,_textColor.y, _textColor.z, _textColor.w }; SDL_Color color = { _textColor.x,_textColor.y, _textColor.z, _textColor.w };
//Tomamos la TTF_Font del tama�o que queremos de UE::Font. //Tomamos la TTF_Font del tama�o que queremos de UE::Font.
TTF_Font* fn = _font->GetFont(_textSize); TTF_Font* fn = _font->GetFont(_textSize);
SDL_Surface* loader = TTF_RenderText_Solid(fn, _text.c_str(), color); SDL_Surface* loader = TTF_RenderText_Solid(fn, _text.c_str(), color);
if (loader == NULL) if (loader == NULL)
{ {
UE_LOG_ERROR("No se ha podido crear el texto: {0} ; Error: {1}", UE_LOG_ERROR("No se ha podido crear el texto: {0} ; Error: {1}",
_text, TTF_GetError()); _text, TTF_GetError());
return; return;
} }
_textTexture = SDL_CreateTextureFromSurface(_sdlRenderer, loader); _textTexture = SDL_CreateTextureFromSurface(_sdlRenderer, loader);
if (_textTexture == NULL) if (_textTexture == NULL)
{ {
UE_LOG_ERROR("No se ha podido crear la textura del texto: {0} ; Error: {1}", UE_LOG_ERROR("No se ha podido crear la textura del texto: {0} ; Error: {1}",
_text, SDL_GetError()); _text, SDL_GetError());
return; return;
} }
_size.x = loader->w; _size.x = loader->w;
_size.y = loader->h; _size.y = loader->h;
SDL_FreeSurface(loader); SDL_FreeSurface(loader);
} }
+38 -38
View File
@@ -14,57 +14,57 @@
namespace UE namespace UE
{ {
typedef glm::tvec4<int> UE_Color; typedef glm::tvec4<int> UE_Color;
class TextBox : public Drawable, public Transformable class TextBox : public Drawable, public Transformable
{ {
public: public:
TextBox(UE::Font* font, TextBox(UE::Font* font,
std::string text = "Texto por defecto", std::string text = "Texto por defecto",
int textSize = 18, int textSize = 18,
UE_Color textColor = UE_Color(0, 0, 0, 255), UE_Color textColor = UE_Color(0, 0, 0, 255),
int renderLayer = 1, int renderLayer = 1,
glm::vec2 position = glm::vec2(0, 0)) glm::vec2 position = glm::vec2(0, 0))
: _font(font), _text(text), _textSize(textSize) : _font(font), _text(text), _textSize(textSize)
{ {
SetColor(textColor); SetColor(textColor);
SetLayer(renderLayer); SetLayer(renderLayer);
SetPosition(position); SetPosition(position);
RenderTextTexture(); RenderTextTexture();
} }
//Se generar� una textura y todo eso... //Se generar� una textura y todo eso...
void SetText(std::string newText); void SetText(std::string newText);
void SetSize(int newSize); void SetSize(int newSize);
void SetColor(UE_Color newColor); void SetColor(UE_Color newColor);
void SetColor(int r, int g, int b, int a); void SetColor(int r, int g, int b, int a);
//Implementa el Draw de Drawable. //Implementa el Draw de Drawable.
void Draw(Renderer* renderer) override; void Draw(Renderer* renderer) override;
private: private:
void RenderTextTexture(); void RenderTextTexture();
private: private:
UE::Font* _font = nullptr; UE::Font* _font = nullptr;
std::string _text = "Texto por defecto"; std::string _text = "Texto por defecto";
int _textSize = 18; int _textSize = 18;
UE_Color _textColor; UE_Color _textColor;
SDL_Texture* _textTexture = nullptr; SDL_Texture* _textTexture = nullptr;
//Esto est� muy mal hecho, no deber�a de ser as�. //Esto est� muy mal hecho, no deber�a de ser as�.
//Necesito un renderer para crear la textura del texto, pero no puedo conseguirlo con la arquitectura actual. //Necesito un renderer para crear la textura del texto, pero no puedo conseguirlo con la arquitectura actual.
//No quiero regenerar la textura en cada frame de forma innecesaria... //No quiero regenerar la textura en cada frame de forma innecesaria...
//Por ello, me toca forzar un poco el sistema. //Por ello, me toca forzar un poco el sistema.
SDL_Renderer* _sdlRenderer = nullptr; SDL_Renderer* _sdlRenderer = nullptr;
}; };
} }
+152
View File
@@ -0,0 +1,152 @@
#include "Engine.h"
#include "Logging/Logger.h"
#include "Render/Renderer.h"
#include "Assets/AssetManager.h"
#include "Scene/SceneManager.h"
namespace UE
{
//Le decimos a C++ que son objetos static y que los cree cuando vea.
Renderer* Engine::_renderer;
AssetManager* Engine::_assetManager;
SceneManager* Engine::_sceneManager;
int Engine::Init()
{
//Lo primero, es iniciar el Logger, para poder imprimir errores.
UE::Logger::InitLogger();
//Etapa de carga de librerías.
if(InitLibs() < 0) //Retorna negativos en caso de error.
{
UE_LOG_CRITICAL("Engine - Error al inicial las librerías");
return -1;
}
//Iniciamos los sistemas del motor.
if(InitRenderer() < 0)
{
UE_LOG_CRITICAL("Engine - Error al iniciar el renderer.");
return -2;
}
if(InitAssetManager() < 0)
{
UE_LOG_CRITICAL("Engine - Error al inicial el AssetManager.");
return -3;
}
if(InitSceneManager() < 0)
{
UE_LOG_CRITICAL("Engine - Error al inicial el SceneManager.");
return -4;
}
UE_LOG_INFO("Engine - El motor se ha iniciado correctamente.");
return 0;
}
void Engine::Clean()
{
//Etapa para limpiar los sistemas del motor.
_sceneManager->CleanSceneManager();
delete _sceneManager;
_assetManager->CleanAssetManager();
delete _assetManager;
_renderer->CleanRenderer();
delete _renderer;
//Etapa para desactivar y limpiar todas las librerías.
QuitLibs();
}
int Engine::InitLibs()
{
//Iniciamos SDL.
SDL_HINT_RENDER_DRIVER "opengl";
Uint32 SDL_Flags = SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_EVENTS;
if (SDL_Init(SDL_Flags) < 0)
{
UE_LOG_CRITICAL("Engine - SDL: Error al iniciar SDL: {0}", SDL_GetError());
return -1;
}
UE_LOG_TRACE("Engine - SDL se ha iniciado correctamente");
//Iniciamos SDL_Image
if (IMG_Init(IMG_INIT_PNG) == 0) //Retorna 0 en caso de fallo.
{
UE_LOG_ERROR("Engine - SDL_Image: Error al iniciarse: {0}", IMG_GetError());
return -2;
}
UE_LOG_TRACE("Engine - SDL_Image se ha iniciado correctamente");
//Iniciamos el SDL_TTF
if (TTF_Init() < 0) //Retorna -1 en caso de error.
{
UE_LOG_ERROR("Engine - SDL_TTF: Error al inicarse: {0}", TTF_GetError());
return -3;
}
UE_LOG_TRACE("Engine - SDL_TTF se ha iniciado correctamente");
return 0;
}
int Engine::InitRenderer()
{
//Cargamos el Renderer.
//Hay que implementar un sistema de flags o
// una struct de configuración para la inicialización del renderer.
_renderer = new UE::Renderer(640, 480, 5);
if(_renderer->InitRenderer() < 0)
{
return -1;
}
UE_LOG_TRACE("Engine - Renderer: Se ha iniciado correctamente");
return 0;
}
int Engine::InitAssetManager()
{
//Cargamos el AssetManager
//Faltaría control de errores en caso de haberlo.
_assetManager = new UE::AssetManager(_renderer->GetSDLRenderer());
_assetManager->InitAssetManager();
UE_LOG_TRACE("Engine - AssetManager: Se ha iniciado correctamente");
return 0;
}
int Engine::InitSceneManager()
{
//Cargamos el SceneManager
//Faltaría control de errores en caso de haberlo.
_sceneManager = new UE::SceneManager();
UE_LOG_TRACE("Engine - SceneManager: Se ha iniciado correctamente.");
return 0;
}
int Engine::QuitLibs()
{
TTF_Quit();
IMG_Quit();
SDL_Quit();
return 0;
}
}
+80
View File
@@ -0,0 +1,80 @@
#pragma once
namespace UE
{
//Declaraciones de clases de UberEngine
class Renderer;
class AssetManager;
class SceneManager;
/* Clase Principal del motor.
* Carga todas los sistemas y librerías al inicio y los descarga al final.
* Contiene ptrs a los sistemas principales.
*/
class Engine
{
public:
/*
* Inicia todos los sistemas y librerías necesarias.
* Retornará 0 o un código de error negativo.
*/
static int Init();
/*
* Limpia todas las cosas del motor.
*/
static void Clean();
inline static UE::Renderer* GetRenderer() { return _renderer; }
inline static UE::AssetManager* GetAssetManager() { return _assetManager; }
inline static UE::SceneManager* GetSceneManager() { return _sceneManager; }
private:
//Vamos a crear un método para la inicialización de cada sistema.
// de esta forma, debería ser más fácil modificar la inicialización cuando sea necesario.
/*
* Inicializa las librerías de SDL.
* Retorna códigos de error negativos.
*/
static int InitLibs();
/*
* Inicializa el renderer.
* En un futuro, debería ser configurable, además de soportar distintos backends.
*/
static int InitRenderer();
/*
* Inicializa el AssetManager.
* Es necesario iniciar primero el Renderer para poder acceder al SDL_Renderer.
* (al menos, mientras usemos el SDL_Renderer.)
*/
static int InitAssetManager();
/*
* Inicializa el SceneManager.
*/
static int InitSceneManager();
/*
* Al igual que se inician, hay que limpiar las libs.
*/
static int QuitLibs();
/*
* Ptrs de los sistemas.
*/
static Renderer* _renderer;
static AssetManager* _assetManager;
static SceneManager* _sceneManager;
};
}
+10 -10
View File
@@ -5,18 +5,18 @@
namespace UE namespace UE
{ {
std::shared_ptr<spdlog::logger> Logger::_engineLogger; std::shared_ptr<spdlog::logger> Logger::_engineLogger;
std::shared_ptr<spdlog::logger> Logger::_gameLogger; std::shared_ptr<spdlog::logger> Logger::_gameLogger;
void Logger::InitLogger() void Logger::InitLogger()
{ {
spdlog::set_pattern("%^[%T]: %l - %n: %v %$"); spdlog::set_pattern("%^[%T]: %l - %n: %v %$");
_engineLogger = spdlog::stdout_color_mt("UberEngine"); _engineLogger = spdlog::stdout_color_mt("UberEngine");
_engineLogger->set_level(spdlog::level::trace); _engineLogger->set_level(spdlog::level::trace);
_gameLogger = spdlog::stdout_color_mt("UberGame1"); _gameLogger = spdlog::stdout_color_mt("UberGame1");
_gameLogger->set_level(spdlog::level::trace); _gameLogger->set_level(spdlog::level::trace);
} }
} }
+23 -23
View File
@@ -7,35 +7,35 @@
namespace UE namespace UE
{ {
class Logger class Logger
{ {
public: public:
static void InitLogger(); static void InitLogger();
inline static std::shared_ptr<spdlog::logger>& GetGameLogger() { return _gameLogger; } inline static std::shared_ptr<spdlog::logger>& GetGameLogger() { return _gameLogger; }
inline static std::shared_ptr<spdlog::logger>& GetEngineLogger() { return _engineLogger; } inline static std::shared_ptr<spdlog::logger>& GetEngineLogger() { return _engineLogger; }
private: private:
static std::shared_ptr<spdlog::logger> _engineLogger; static std::shared_ptr<spdlog::logger> _engineLogger;
static std::shared_ptr<spdlog::logger> _gameLogger; static std::shared_ptr<spdlog::logger> _gameLogger;
}; };
//Macros para el Logging. Es m�s c�modo que estar poniendo la l�nea entera cada vez... //Macros para el Logging. Es más cómodo que estar poniendo la línea entera cada vez...
#define UE_LOG_TRACE(...) ::UE::Logger::GetEngineLogger()->trace(__VA_ARGS__) #define UE_LOG_TRACE(...) ::UE::Logger::GetEngineLogger()->trace(__VA_ARGS__)
#define UE_LOG_DEBUG(...) ::UE::Logger::GetEngineLogger()->debug(__VA_ARGS__) #define UE_LOG_DEBUG(...) ::UE::Logger::GetEngineLogger()->debug(__VA_ARGS__)
#define UE_LOG_INFO(...) ::UE::Logger::GetEngineLogger()->info(__VA_ARGS__) #define UE_LOG_INFO(...) ::UE::Logger::GetEngineLogger()->info(__VA_ARGS__)
#define UE_LOG_WARN(...) ::UE::Logger::GetEngineLogger()->warn(__VA_ARGS__) #define UE_LOG_WARN(...) ::UE::Logger::GetEngineLogger()->warn(__VA_ARGS__)
#define UE_LOG_ERROR(...) ::UE::Logger::GetEngineLogger()->error(__VA_ARGS__) #define UE_LOG_ERROR(...) ::UE::Logger::GetEngineLogger()->error(__VA_ARGS__)
#define UE_LOG_CRITICAL(...) ::UE::Logger::GetEngineLogger()->critical(__VA_ARGS__) #define UE_LOG_CRITICAL(...) ::UE::Logger::GetEngineLogger()->critical(__VA_ARGS__)
#define GAME_LOG_TRACE(...) ::UE::Logger::GetEngineLogger()->trace(__VA_ARGS__) #define GAME_LOG_TRACE(...) ::UE::Logger::GetEngineLogger()->trace(__VA_ARGS__)
#define GAME_LOG_DEBUG(...) ::UE::Logger::GetEngineLogger()->debug(__VA_ARGS__) #define GAME_LOG_DEBUG(...) ::UE::Logger::GetEngineLogger()->debug(__VA_ARGS__)
#define GAME_LOG_INFO(...) ::UE::Logger::GetEngineLogger()->info(__VA_ARGS__) #define GAME_LOG_INFO(...) ::UE::Logger::GetEngineLogger()->info(__VA_ARGS__)
#define GAME_LOG_WARN(...) ::UE::Logger::GetEngineLogger()->warn(__VA_ARGS__) #define GAME_LOG_WARN(...) ::UE::Logger::GetEngineLogger()->warn(__VA_ARGS__)
#define GAME_LOG_ERROR(...) ::UE::Logger::GetEngineLogger()->error(__VA_ARGS__) #define GAME_LOG_ERROR(...) ::UE::Logger::GetEngineLogger()->error(__VA_ARGS__)
#define GAME_LOG_CRITICAL(...) ::UE::Logger::GetEngineLogger()->critical(__VA_ARGS__) #define GAME_LOG_CRITICAL(...) ::UE::Logger::GetEngineLogger()->critical(__VA_ARGS__)
} }
+15 -15
View File
@@ -2,26 +2,26 @@
namespace UE namespace UE
{ {
class Renderer; class Renderer;
class Drawable class Drawable
{ {
public: public:
Drawable() {} Drawable() {}
virtual ~Drawable() {}; virtual ~Drawable() {};
//Get-Set del renderLayer. //Get-Set del renderLayer.
inline void SetLayer(int newLayer) { _renderLayer = newLayer; } inline void SetLayer(int newLayer) { _renderLayer = newLayer; }
inline int GetLayer() { return _renderLayer; } inline int GetLayer() { return _renderLayer; }
public: public:
virtual void Draw(Renderer* renderer) = 0; virtual void Draw(Renderer* renderer) = 0;
protected: protected:
//renderLayer usada en el renderer como "profundidad". //renderLayer usada en el renderer como "profundidad".
int _renderLayer = 0; int _renderLayer = 0;
}; };
} }
+184 -195
View File
@@ -3,7 +3,7 @@
#include <ImGui/imgui.h> #include <ImGui/imgui.h>
#include <ImGui/imgui_impl_sdl.h> #include <ImGui/imgui_impl_sdl.h>
#include <ImGui/imgui_impl_sdlrenderer.h> #include <ImGui/imgui_impl_sdlrenderer.h>
//#include <ImGui\imgui_impl_opengl3.h> //#include <ImGui/imgui_impl_opengl3.h>
#include <SDL_opengl.h> #include <SDL_opengl.h>
@@ -13,257 +13,246 @@
namespace UE namespace UE
{ {
//class Game; int Renderer::InitRenderer()
{
//Configuramos los par�metros de la ventana de SDL.
Uint32 windowFlags = (SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_RESIZABLE);
int Renderer::InitRenderer() //Creamos la ventana de SDL.
{ _window = SDL_CreateWindow("UberGame1", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, screenSize.x, screenSize.y, windowFlags);
//Iniciamos SDL. if (_window == NULL)
SDL_HINT_RENDER_DRIVER "opengl"; {
UE_LOG_CRITICAL("Renderer - CreateWindow: No se ha podido crear la ventana con OpenGL: {0}", SDL_GetError());
return -1;
}
Uint32 SDL_Flags = SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_EVENTS; //Creamos el Renderer de SDL.
if (SDL_Init(SDL_Flags) < 0) main_Renderer = SDL_CreateRenderer(_window, -1, SDL_RENDERER_ACCELERATED);
{ if (main_Renderer == NULL)
UE_LOG_CRITICAL("No se ha podido iniciar SDL, sufre mam�n: {0}", SDL_GetError()); {
return 1; UE_LOG_CRITICAL("Renderer - SDL_Renderer: No se ha podido crear el Renderer de SDL: {0}", SDL_GetError());
} return -2;
}
//Configuramos los par�metros de la ventana de SDL. SDL_SetRenderDrawColor(main_Renderer, 0xFF, 0xFF, 0xFF, 0xFF);
Uint32 windowFlags = (SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_RESIZABLE);
//Creamos la ventana de SDL.
_window = SDL_CreateWindow("UberGame1", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, screenSize.x, screenSize.y, windowFlags);
if (_window == NULL)
{
UE_LOG_CRITICAL("No se ha podido crear la ventana de SDL con OpenGL y esas mierdas: {0}", SDL_GetError());
return 1;
}
//Creamos el Renderer de SDL.
main_Renderer = SDL_CreateRenderer(_window, -1, SDL_RENDERER_ACCELERATED);
if (main_Renderer == NULL)
{
UE_LOG_CRITICAL("No se ha podido crear el Renderer de SDL: {0}", SDL_GetError());
}
SDL_SetRenderDrawColor(main_Renderer, 0xFF, 0xFF, 0xFF, 0xFF);
#pragma region ImGui. #pragma region ImGui.
IMGUI_CHECKVERSION(); IMGUI_CHECKVERSION();
ImGui::CreateContext(); ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); ImGuiIO& io = ImGui::GetIO();
(void)io; //Evita que de un Warning por variable no usada. (void)io; //Evita que de un Warning por variable no usada.
ImGui::StyleColorsDark(); ImGui::StyleColorsDark();
ImGui_ImplSDL2_InitForSDLRenderer(_window, main_Renderer); ImGui_ImplSDL2_InitForSDLRenderer(_window, main_Renderer);
ImGui_ImplSDLRenderer_Init(main_Renderer); ImGui_ImplSDLRenderer_Init(main_Renderer);
#pragma endregion #pragma endregion
//Init layers. //Init layers.
for (int i = 0; i < LAYER_AMOUNT; i++) for (int i = 0; i <= LAYER_AMOUNT; i++)
{ {
renderLayers.push_back(std::vector<DrawCall>()); renderLayers.push_back(std::vector<DrawCall>());
} }
} }
void Renderer::CleanRenderer() void Renderer::CleanRenderer()
{ {
renderQueue.empty(); renderQueue.empty();
ImGui_ImplSDLRenderer_Shutdown(); ImGui_ImplSDLRenderer_Shutdown();
ImGui_ImplSDL2_Shutdown(); ImGui_ImplSDL2_Shutdown();
ImGui::DestroyContext(); ImGui::DestroyContext();
SDL_DestroyRenderer(main_Renderer); SDL_DestroyRenderer(main_Renderer);
SDL_DestroyWindow(_window); SDL_DestroyWindow(_window);
} }
void Renderer::RenderFrame() void Renderer::RenderFrame()
{ {
NewFrame(); NewFrame();
RenderData(); RenderData();
EndFrame(); EndFrame();
} }
void Renderer::NewFrame() void Renderer::NewFrame()
{ {
SDL_RenderClear(main_Renderer); SDL_RenderClear(main_Renderer);
ImGui_ImplSDLRenderer_NewFrame(); ImGui_ImplSDLRenderer_NewFrame();
ImGui_ImplSDL2_NewFrame(); ImGui_ImplSDL2_NewFrame();
ImGui::NewFrame(); ImGui::NewFrame();
//Quiz�s deber�amos limpiar la cola y las Layers aqu� para eliminar residuos... //Quiz�s deber�amos limpiar la cola y las Layers aqu� para eliminar residuos...
//callCounter = 0; //callCounter = 0;
//rendererCounter = 0; //rendererCounter = 0;
} }
void Renderer::RenderData() void Renderer::RenderData()
{ {
//Add items to their layer. //Add items to their layer.
for (int i = 0; i < renderQueue.size(); i++) for (int i = 0; i < renderQueue.size(); i++)
{ {
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 > LAYER_AMOUNT) if (item.layer > LAYER_AMOUNT)
{ {
UE_LOG_ERROR("Error rendering data: Can't render item to Layer {0} -> out of range\n", item.layer); UE_LOG_ERROR("Error rendering data: Can't render item to Layer {0} -> out of range\n", item.layer);
return; return;
} }
renderLayers.at(item.layer).push_back(item); renderLayers.at(item.layer).push_back(item);
} }
renderQueue.clear(); renderQueue.clear();
//Iterate layers. //Iterate layers.
for (int j = 0; j < renderLayers.size(); j++) for (int j = 0; j < renderLayers.size(); j++)
{ {
std::vector<DrawCall>& layer = renderLayers.at(j); std::vector<DrawCall>& layer = renderLayers.at(j);
//Render items from layer j. //Render items from layer j.
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);
if (item.fullTexture) if (item.fullTexture)
{ {
SDL_RenderCopy(main_Renderer, item.tx, NULL, &item.pos_rect); SDL_RenderCopy(main_Renderer, item.tx, NULL, &item.pos_rect);
continue; continue;
} }
SDL_RenderCopy(main_Renderer, item.tx, &item.tx_rect, &item.pos_rect); SDL_RenderCopy(main_Renderer, item.tx, &item.tx_rect, &item.pos_rect);
} }
layer.clear(); layer.clear();
} }
} }
void Renderer::EndFrame() void Renderer::EndFrame()
{ {
//SDL_UpdateWindowSurface(window); //SDL_UpdateWindowSurface(window);
//SDL_RenderPresent(main_Renderer); //SDL_RenderPresent(main_Renderer);
//SDL_RenderClear(main_Renderer); //SDL_RenderClear(main_Renderer);
ImGui::Render(); ImGui::Render();
ImGui_ImplSDLRenderer_RenderDrawData(ImGui::GetDrawData()); ImGui_ImplSDLRenderer_RenderDrawData(ImGui::GetDrawData());
SDL_RenderPresent(main_Renderer); SDL_RenderPresent(main_Renderer);
//UE_LOG_INFO("CallCounter: {0} ; Renderer: {1}", callCounter, rendererCounter); //UE_LOG_INFO("CallCounter: {0} ; Renderer: {1}", callCounter, rendererCounter);
} }
void Renderer::SetScreenSize(int newWidth, int newHeight) void Renderer::SetScreenSize(int newWidth, int newHeight)
{ {
screenSize.x = newWidth; screenSize.x = newWidth;
screenSize.y = newHeight; screenSize.y = newHeight;
SDL_SetWindowSize(_window, newWidth, newHeight); SDL_SetWindowSize(_window, newWidth, newHeight);
glViewport(0, 0, newWidth, newHeight); glViewport(0, 0, newWidth, newHeight);
UE_LOG_TRACE("Screen size chaged to: {0}x{1}", newWidth, newHeight); UE_LOG_TRACE("Screen size chaged to: {0}x{1}", newWidth, newHeight);
} }
void Renderer::SetCamPosition(int posX, int posY) void Renderer::SetCamPosition(int posX, int posY)
{ {
camPosition.x = posX; camPosition.x = posX;
camPosition.y = posY; camPosition.y = posY;
//UE_LOG_TRACE("Cam position chaged to: {0}x{1}", posX, posY); //UE_LOG_TRACE("Cam position chaged to: {0}x{1}", posX, posY);
} }
glm::ivec2 Renderer::WorldToSreenCoords(glm::ivec2 worldCoord) glm::ivec2 Renderer::WorldToSreenCoords(glm::ivec2 worldCoord)
{ {
//Convertimos las coordenas de WorldCoords a ScreenCoords relativas a la camPosition. //Convertimos las coordenas de WorldCoords a ScreenCoords relativas a la camPosition.
glm::ivec2 fPos = worldCoord - camPosition; glm::ivec2 fPos = worldCoord - camPosition;
return fPos; return fPos;
} }
glm::ivec2 Renderer::ScreenToWorldCoords(glm::ivec2 screenCoord) glm::ivec2 Renderer::ScreenToWorldCoords(glm::ivec2 screenCoord)
{ {
//Convertimos las coordenas de ScreenCoords a WorldCoords relativas a la camPosition. //Convertimos las coordenas de ScreenCoords a WorldCoords relativas a la camPosition.
glm::ivec2 fPos = screenCoord + camPosition; glm::ivec2 fPos = screenCoord + camPosition;
return fPos; return fPos;
} }
//CREO QUE ESTE M�TODO NO FUNCIONA. //CREO QUE ESTE M�TODO NO FUNCIONA.
//LAS COORDS QUE USAMOS EN LA COMPROBACI�N NO SON LAS ADECUADAS. //LAS COORDS QUE USAMOS EN LA COMPROBACI�N NO SON LAS ADECUADAS.
bool Renderer::IsObjectVisible(SDL_Rect* objectRect) bool Renderer::IsObjectVisible(SDL_Rect* objectRect)
{ {
//Generamos un rect que representa la pantalla. //Generamos un rect que representa la pantalla.
SDL_Rect screen{ camPosition.x, camPosition.y, screenSize.x, screenSize.y }; SDL_Rect screen{ camPosition.x, camPosition.y, screenSize.x, screenSize.y };
//Comprobamos si hay intersecci�n entre ambos. //Comprobamos si hay intersecci�n entre ambos.
if (!SDL_HasIntersection(&screen, objectRect)) if (!SDL_HasIntersection(&screen, objectRect))
{ {
//UE_LOG_TRACE("Se omite el renderizado de un objeto al estar fuera de la c�mara."); //UE_LOG_TRACE("Se omite el renderizado de un objeto al estar fuera de la c�mara.");
return false; return false;
} }
return true; return true;
} }
//�Deber�amos operar la posici�n para que tenga en cuenta la c�mara? //�Deber�amos operar la posici�n para que tenga en cuenta la c�mara?
void Renderer::DrawObject(SDL_Rect* position, SDL_Rect* texture_pos, SDL_Texture* texture) void Renderer::DrawObject(SDL_Rect* position, SDL_Rect* texture_pos, SDL_Texture* texture)
{ {
SDL_RenderCopy(main_Renderer, texture, texture_pos, position); SDL_RenderCopy(main_Renderer, texture, texture_pos, position);
} }
void Renderer::QueueDrawCall(DrawCall drawCall) void Renderer::QueueDrawCall(DrawCall drawCall)
{ {
//callCounter++; //callCounter++;
//Add item i to layer number i.layer. //Add item i to layer number i.layer.
if (drawCall.layer > LAYER_AMOUNT) if (drawCall.layer > LAYER_AMOUNT)
{ {
UE_LOG_ERROR("Can't add DrawCall to Layer {0} -> out of range\n", drawCall.layer); UE_LOG_ERROR("Can't add DrawCall to Layer {0} -> out of range\n", drawCall.layer);
return; return;
} }
//Comprobamos si el objeto es visible. //Comprobamos si el objeto es visible.
// //
//Generamos un rect que representa la pantalla. //Generamos un rect que representa la pantalla.
SDL_Rect screen{ 0, 0, screenSize.x, screenSize.y }; SDL_Rect screen{ 0, 0, screenSize.x, screenSize.y };
//Comprobamos si hay intersecci�n entre ambos. //Comprobamos si hay intersecci�n entre ambos.
if (!SDL_HasIntersection(&screen, &drawCall.pos_rect)) if (!SDL_HasIntersection(&screen, &drawCall.pos_rect))
{ {
//UE_LOG_TRACE("Se omite el renderizado de un objeto al estar fuera de la c�mara."); //UE_LOG_TRACE("Se omite el renderizado de un objeto al estar fuera de la c�mara.");
return; return;
} }
renderLayers.at(drawCall.layer).push_back(drawCall); renderLayers.at(drawCall.layer).push_back(drawCall);
//rendererCounter++; //rendererCounter++;
//renderQueue.push_back(drawCall); //renderQueue.push_back(drawCall);
} }
void Renderer::QueueDrawCall(int layer, SDL_Rect& position, SDL_Texture* texture, SDL_Rect& texture_position) void Renderer::QueueDrawCall(int layer, SDL_Rect& position, SDL_Texture* texture, SDL_Rect& texture_position)
{ {
DrawCall dc = DrawCall(layer, position, texture, texture_position); DrawCall dc = DrawCall(layer, position, texture, texture_position);
QueueDrawCall(dc); QueueDrawCall(dc);
} }
void Renderer::QueueDrawCall(int layer, SDL_Rect & position, SDL_Texture* texture) void Renderer::QueueDrawCall(int layer, SDL_Rect & position, SDL_Texture* texture)
{ {
//std::cout << "Drawable added to queue"; //std::cout << "Drawable added to queue";
DrawCall dc = DrawCall(layer, position, texture); DrawCall dc = DrawCall(layer, position, texture);
QueueDrawCall(dc); QueueDrawCall(dc);
} }
void Renderer::Render(Drawable& drawable) void Renderer::Render(Drawable& drawable)
{ {
drawable.Draw(this); drawable.Draw(this);
} }
} }
+106 -106
View File
@@ -19,155 +19,155 @@
namespace UE namespace UE
{ {
struct DrawCall; struct DrawCall;
class Renderer class Renderer
{ {
public: public:
/* Constructor */ /* Constructor */
Renderer(int windowWidth, Renderer(int windowWidth,
int windowHeight, int windowHeight,
int renderingLayers = 10) int renderingLayers = 10)
: LAYER_AMOUNT(renderingLayers) : LAYER_AMOUNT(renderingLayers)
{ {
screenSize.x = windowWidth; screenSize.x = windowWidth;
screenSize.y = windowHeight; screenSize.y = windowHeight;
//UE_LOG_INFO("Game Renderer Created."); //UE_LOG_INFO("Game Renderer Created.");
} }
/* Inicializa los componentes necesarios: /* Inicializa los componentes necesarios:
- Inicializa SDL - Inicializa SDL
- Crea la ventana. - Crea la ventana.
- Crea el renderer. - Crea el renderer.
- ... - ...
*/ */
int InitRenderer(); int InitRenderer();
/* Limpia todo antes de salir. */ /* Limpia todo antes de salir. */
void CleanRenderer(); void CleanRenderer();
//Hace el SDL_RenderClear() para limpiar el buffer al principio de un nuevo frame. //Hace el SDL_RenderClear() para limpiar el buffer al principio de un nuevo frame.
void NewFrame(); void NewFrame();
//Ordena por layer todos los objetos de la renderQueue y los dibuja en orden. //Ordena por layer todos los objetos de la renderQueue y los dibuja en orden.
//Se puede mover el proceso de ordenado a otra funci�n, con el objeto de ir vaciando la Queue. //Se puede mover el proceso de ordenado a otra funci�n, con el objeto de ir vaciando la Queue.
void RenderData(); void RenderData();
//Hace el swap del render buffer (tras dibujar todos los objetos). Termina el renderizado. //Hace el swap del render buffer (tras dibujar todos los objetos). Termina el renderizado.
void EndFrame(); void EndFrame();
//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_Rect& position, SDL_Texture* texture, SDL_Rect& texture_position); void QueueDrawCall(int layer, SDL_Rect& position, SDL_Texture* texture, SDL_Rect& texture_position);
void QueueDrawCall(int layer, SDL_Rect & position, SDL_Texture* texture); void QueueDrawCall(int layer, SDL_Rect & position, SDL_Texture* texture);
//Le pasamos este renderer al Drawable para que haga lo que quiera. //Le pasamos 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.
void Render(Drawable& drawable); void Render(Drawable& drawable);
/* Get SDL Renderer. */ /* Get SDL Renderer. */
SDL_Renderer* GetSDLRenderer() { return main_Renderer; } SDL_Renderer* GetSDLRenderer() { return main_Renderer; }
inline glm::ivec2 GetScreenSize() { return screenSize; } inline glm::ivec2 GetScreenSize() { return screenSize; }
void SetScreenSize(int newWidth, int newHeight); void SetScreenSize(int newWidth, int newHeight);
inline glm::ivec2 GetCamPosition() { return camPosition; } inline glm::ivec2 GetCamPosition() { return camPosition; }
void SetCamPosition(int posX, int posY); void SetCamPosition(int posX, int posY);
/* M�todos para transformar las coordenadas entre Screen y Wolrd. */ /* M�todos para transformar las coordenadas entre Screen y Wolrd. */
//WorldCoords = ScreenPos + CamPos -> ScreenPos = WorldCoords - CamPos; //WorldCoords = ScreenPos + CamPos -> ScreenPos = WorldCoords - CamPos;
//Convierte coordenadas de mundo a la pantalla (en funci�n de la c�mara). //Convierte coordenadas de mundo a la pantalla (en funci�n de la c�mara).
glm::ivec2 WorldToSreenCoords(glm::ivec2 worldCoord); glm::ivec2 WorldToSreenCoords(glm::ivec2 worldCoord);
//Convierte coordenadas de la pantalla al mundo. //Convierte coordenadas de la pantalla al mundo.
glm::ivec2 ScreenToWorldCoords(glm::ivec2 screenCoord); glm::ivec2 ScreenToWorldCoords(glm::ivec2 screenCoord);
//Comprueba si un objeto est� dentro del rect�ngulo de la c�mara. //Comprueba si un objeto est� dentro del rect�ngulo de la c�mara.
//Usada para saber si un objeto se deber�a de renderizar o no. //Usada para saber si un objeto se deber�a de renderizar o no.
bool IsObjectVisible(SDL_Rect* objectRect); bool IsObjectVisible(SDL_Rect* objectRect);
//DEBUG //DEBUG
//Funci�n para renderizar un objeto un objeto en concreto directamente en el SDL_Renderer. //Funci�n para renderizar un objeto un objeto en concreto directamente en el SDL_Renderer.
void DrawObject(SDL_Rect* position, SDL_Rect* texture_pos, SDL_Texture* texture); void DrawObject(SDL_Rect* position, SDL_Rect* texture_pos, SDL_Texture* texture);
private: private:
//Realizar RenderClear(), RenderDraw() y RenderUpdate(); //Realizar RenderClear(), RenderDraw() y RenderUpdate();
//Es decir, todo lo necesario para renderizar un frame. //Es decir, todo lo necesario para renderizar un frame.
void RenderFrame(); void RenderFrame();
private: private:
/* Objetos de SDL para el rendering. */ /* Objetos de SDL para el rendering. */
SDL_Window* _window = nullptr; SDL_Window* _window = nullptr;
SDL_Surface* screenSurface = nullptr; SDL_Surface* screenSurface = nullptr;
SDL_Renderer* main_Renderer = nullptr; SDL_Renderer* main_Renderer = nullptr;
//SDL_GLContext _glContext = nullptr; //SDL_GLContext _glContext = nullptr;
//Almacena todas las "draw calls" para luego ordenar los objetos por layers y dibujarlos. //Almacena todas las "draw calls" para luego ordenar los objetos por layers y dibujarlos.
//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;
//Las capas en las que se organizan los diferentes objetos. //Las capas en las que se organizan los diferentes objetos.
//Permite dibujar unos sprites sobre otros. //Permite dibujar unos sprites sobre otros.
const int LAYER_AMOUNT = 10; const int LAYER_AMOUNT = 10;
std::vector<std::vector<DrawCall>> renderLayers; std::vector<std::vector<DrawCall>> renderLayers;
//int screenWidth = 640; //int screenWidth = 640;
//int screenHeight = 480; //int screenHeight = 480;
glm::ivec2 screenSize{ 640,480 }; glm::ivec2 screenSize{ 640,480 };
glm::ivec2 camPosition{ 0,0 }; glm::ivec2 camPosition{ 0,0 };
//DEBUG //DEBUG
int callCounter = 0; int callCounter = 0;
int rendererCounter = 0; int rendererCounter = 0;
}; };
/* /*
Contiene los valores necesarios para realizar el renderizado con SDL_RenderCopy(); Contiene los valores necesarios para realizar el renderizado con SDL_RenderCopy();
Se almacena en la renderQueue y luego son ordenados por las renderLayers. Se almacena en la renderQueue y luego son ordenados por las renderLayers.
*/ */
struct DrawCall struct DrawCall
{ {
DrawCall(int layer, DrawCall(int layer,
SDL_Rect position, SDL_Rect position,
SDL_Texture* texture, SDL_Texture* texture,
SDL_Rect texture_position) SDL_Rect texture_position)
: layer(layer), tx(texture), tx_rect(texture_position), pos_rect(position) : layer(layer), tx(texture), tx_rect(texture_position), pos_rect(position)
{} {}
DrawCall(int layer, DrawCall(int layer,
SDL_Rect position, SDL_Rect position,
SDL_Texture* texture) SDL_Texture* texture)
: layer(layer), tx(texture), pos_rect(position) : layer(layer), tx(texture), pos_rect(position)
{ {
tx_rect = SDL_Rect(); tx_rect = SDL_Rect();
fullTexture = true; fullTexture = true;
} }
int layer; int layer;
bool fullTexture = false; bool fullTexture = false;
SDL_Texture* tx; SDL_Texture* tx;
SDL_Rect tx_rect; SDL_Rect tx_rect;
SDL_Rect pos_rect; SDL_Rect pos_rect;
}; };
} }
+25 -25
View File
@@ -7,41 +7,41 @@
namespace UE namespace UE
{ {
/* /*
Clase que contiene lo necesario para crear un objeto con posici�n en el espacio y modificarlo. Clase que contiene lo necesario para crear un objeto con posici�n en el espacio y modificarlo.
*/ */
class Transformable class Transformable
{ {
public: public:
//----------- //-----------
//- Setters - //- Setters -
//----------- //-----------
//Modifica la posici�n del Objeto. //Modifica la posici�n del Objeto.
inline void SetPosition(float x, float y) { _pos = glm::vec<2, float>(x, y); } inline void SetPosition(float x, float y) { _pos = glm::vec<2, float>(x, y); }
inline void SetPosition(glm::vec<2, float> newPosition) { _pos = newPosition; } inline void SetPosition(glm::vec<2, float> newPosition) { _pos = newPosition; }
//Modifica la escala de Objeto. //Modifica la escala de Objeto.
inline void SetSize(float x, float y) { _size = glm::vec<2, float>(x, y); } inline void SetSize(float x, float y) { _size = glm::vec<2, float>(x, y); }
inline void SetSize(glm::vec<2, float> newSize) { _size = newSize; } inline void SetSize(glm::vec<2, float> newSize) { _size = newSize; }
//----------- //-----------
//- Getters - //- Getters -
//----------- //-----------
inline glm::vec2 GetPosition() { return _pos; } inline glm::vec2 GetPosition() { return _pos; }
inline glm::vec2 GetSize() { return _size; } inline glm::vec2 GetSize() { return _size; }
protected: protected:
//Se almacena la posici�n y el tama�o del objeto. Con esto se puede crear un SDL_Rect. //Se almacena la posici�n y el tama�o del objeto. Con esto se puede crear un SDL_Rect.
glm::vec<2, float> _pos; glm::vec<2, float> _pos;
glm::vec<2, float> _size; glm::vec<2, float> _size;
}; };
} }
+15 -13
View File
@@ -1,23 +1,25 @@
#include "Scene.h" #include "Scene.h"
#include "Logging/Logger.h"
#include <iostream> #include <iostream>
namespace UE namespace UE
{ {
void Scene::SceneInit() void Scene::SceneInit()
{ {
//id = currentID++; UE_LOG_TRACE("Scene {0} has been init!", _sceneName);
std::cout << "Scene has been init!" << std::endl; }
}
void Scene::SceneClean() void Scene::SceneClean()
{ {
std::cout << "Scene has been cleaned!" << std::endl; UE_LOG_TRACE("Scene {0} has been Cleaned!", _sceneName);
if (loaded)
{ if (loaded)
SceneUnload(); {
} SceneUnload();
} }
}
} }
+66 -35
View File
@@ -5,7 +5,6 @@
/// ///
/// TODO: /// TODO:
/// - Scene debería ser serializable y cargable desde archivos, al menos para las clases derivadas. ( o quizás no....)
/// ///
/// ///
union SDL_Event; union SDL_Event;
@@ -13,49 +12,81 @@ union SDL_Event;
namespace UE namespace UE
{ {
/* /*
Estructura básica de una escena. Almacena los datos mínimos. Estructura básica de una escena.
Se utilizará como clase base para las clases Scene específicas. Se utiliza como clase base para las clases Scene específicas del Game.
Esta clase será heredada por las escenas del usuario. Esta clase será heredada por las escenas del usuario.
*/ */
class Scene class Scene
{ {
public: public:
Scene(std::string name) Scene(std::string name)
: _sceneName(name) : _sceneName(name)
{} {
SceneInit();
}
/* Funciones "internas" de la clase para inicialización y cierre. */ ~Scene()
void SceneInit(); //Te calienta y prepara la casa al llegar. {
void SceneClean(); //Te deja todo limpio y reluciente al salir. SceneClean();
}
/* Funciones que habrán de sobrecargar las escenas del usuario. */ /* Funciones "internas" de la clase para inicialización y cierre. */
virtual void SceneLoad() { std::cout << "EMPTY SCENE CREATED" << std::endl; } void SceneInit(); //Te calienta y prepara la casa al llegar.
virtual void SceneRender() {} void SceneClean(); //Te deja todo limpio y reluciente al salir.
virtual void SceneUpdate() {}
virtual void SceneHandleEvents(SDL_Event* event) {}
virtual void SceneUnload() { std::cout << "EMPTY SCENE DESCARGADA" << std::endl; }
// ¿Esto sirve para algo? /*
//void loadDataFromFile(std::string path); Métodos de los estados de la escena.
Habrán de ser sobrecargardos por las escenas del usuario.
*/
//Se crean todos los objetos y se carga todo lo necesario para la escena.
virtual void SceneLoad() = 0;
/*
* Render de los objetos de la escena.
* Se ejecuta en cada frame.
*/
virtual void SceneRender() = 0;
/*
* Update para los objetos de la escena.
* Utilizado para las físicas y otros componentes similares.
* Se ejecuta en cada frame.
*/
virtual void SceneUpdate() = 0;
/*
* Gestor de eventos para la escena.
* Utilizado para capturar los eventos que necesita la escena.
*/
virtual void SceneHandleEvents(SDL_Event* event) = 0;
/*
* Descarga y limpia todos los elementos de la escena.
* Utilizado también para guardado o lo que sea conveniente.
*/
virtual void SceneUnload() = 0;
//Obtener el nombre de la escena.
inline std::string GetName() { return _sceneName; }
/*
* Permite comprobar si la escena está cargada o no.
* TODO: Útil si queremos hacer carga asincrona o similar. Al menos para assets o algo.
*/
inline bool IsLoaded() { return loaded; }
inline std::string GetName() { return _sceneName; } protected:
inline bool IsLoaded() { return loaded; } //Nombre de la escena. Para identificarla en el SceneManager.
std::string _sceneName = "NullScene";
bool loaded = false;
protected: };
//Almacena el ID actual, permitiendo generar un ID nuevo para cada Scene que se instancie.
//static uint16_t currentID;
std::string _sceneName;
//std::vector<Entity> _entidades;
bool loaded = false;
};
} }
-18
View File
@@ -1,18 +0,0 @@
#pragma once
namespace UE
{
class Scene;
/*
Será sobrecargado por el juego, de tal forma que cuando se le pida crear una escena, sepa qué objeto crear.
*/
class SceneBuilder
{
public:
virtual inline Scene* InstanciateScene(int sceneID) { return nullptr; }
};
}
+119 -77
View File
@@ -1,8 +1,5 @@
#include "SceneManager.h" #include "SceneManager.h"
#include "Scene.h"
#include "SceneBuilder.h"
#include "Logging/Logger.h" #include "Logging/Logger.h"
#include <iostream> #include <iostream>
@@ -10,91 +7,136 @@
namespace UE namespace UE
{ {
void SceneManager::InitSceneManager(SceneBuilder* sceneBuilder) void SceneManager::InitSceneManager()
{ {
_sceneBuilder = sceneBuilder; UE_LOG_INFO("Se ha inicializado el SceneManager.");
}
UE_LOG_INFO("Se ha inicializado el SceneManager."); void SceneManager::CleanSceneManager()
} {
for (auto& it : _loadedScenes)
{
Scene* sc = it.second;
sc->SceneClean();
delete sc;
}
void SceneManager::CleanSceneManager() _loadedScenes.clear();
{
if (_currentScene != nullptr)
{
_currentScene->SceneUnload();
delete _currentScene;
}
//for (auto& it : _scenes) if (_currentScene != nullptr)
//{ {
// Scene* sc = it.second; _currentScene = nullptr;
// sc->SceneClean(); }
// delete sc;
//}
//_scenes.clear(); UE_LOG_INFO("El ScenenManager se ha descargado correctamente.");
}
void SceneManager::LoadScene(Scene* sceneToLoad)
{
std::string name = sceneToLoad->GetName();
//Comprobamos si la escena ya está cargada en la lista.
if(IsSceneLoaded(name))
{
//Si lo está, la descargamos para volverla a cargar.
//En caso de no estar activa, claro está.
UnloadScene(name);
}
//Cargamos la escena en cuestión.
sceneToLoad->SceneLoad();
//Añadimos la escena a la lista de escenas cargadas.
_loadedScenes.insert(std::make_pair(name, sceneToLoad));
}
void SceneManager::LoadAndSwitchScene(Scene* sceneToLoad)
{
LoadScene(sceneToLoad);
SwitchScene(sceneToLoad->GetName());
}
void SceneManager::SwitchScene(std::string name)
{
//Comprobamos si existe la escena indicada.
if(!IsSceneLoaded(name))
{
UE_LOG_WARN("SceneManager: Scene {0}, No se puede cambiar de escena. No está cargada.", name);
return;
}
//Cambiamos la escena actual por la indicada.
_currentScene = _loadedScenes.at(name);
}
void SceneManager::SwitchAndUnloadScene(std::string name)
{
//Comprobamos si existe la escena indicada.
if(!IsSceneLoaded(name))
{
UE_LOG_WARN("SceneManager: Scene {0}, No se puede cambiar de escena. No está cargada.", name);
return;
}
//Descargamos la escena anterior en caso de haberla.
if(_currentScene != nullptr && IsSceneLoaded(_currentScene->GetName()))
{
_currentScene->SceneUnload();
}
//Cambiamos la escena activa por la nueva.
_currentScene = _loadedScenes.at(name);
}
} void SceneManager::UnloadScene(std::string name)
{
//Comprobamos si existe la escena indicada.
if(!IsSceneLoaded(name))
{
UE_LOG_WARN("SceneManager: Scene {0}, no se puede descargar. No está cargada.", name);
return;
}
//Comprobamos si se trata de la escena actual.
if(GetCurrentSceneName() == name)
{
//No hacemos nada, no se puede recargar la escena actual así como así.
UE_LOG_WARN("SceneManager: Scene {0}, no se puede descargar. Es la escena actual.", name);
return;
}
//Si todo está correcto.
//Si tenemos campo libre, pista libre, punto rojo.
//Descargamos.
_loadedScenes.at(name)->SceneUnload();
_loadedScenes.erase(name);
}
bool SceneManager::IsSceneLoaded(std::string name)
//void SceneManager::AddScene(Scene* sceneToAdd) {
//{ //Comprobamos si existe la escena indicada.
// _scenes.insert(std::make_pair(sceneToAdd->GetName(), sceneToAdd)); if(_loadedScenes.find(name) != _loadedScenes.end())
// sceneToAdd->SceneInit(); {
//Si la encontramos, existe.
// UE_LOG_INFO("Se ha a�adido la escena {0} al SceneManager.", sceneToAdd->GetName()); return true;
//} }
return false;
}
std::string SceneManager::GetCurrentSceneName()
{
return _currentScene->GetName();
}
//Scene* SceneManager::GetScenePtr(std::string sceneName) Scene* SceneManager::GetCurrentScenePtr()
//{ {
// if (_scenes.find(sceneName) == _scenes.end()) return _currentScene;
// { }
// UE_LOG_ERROR("No se ha encontrado la escena indicada.");
// return nullptr;
// }
// return _scenes.at(sceneName);
//}
void SceneManager::UpdateScene()
{
std::string SceneManager::GetActiveSceneName() _currentScene->SceneUpdate();
{ }
return _currentScene->GetName();
}
//void SceneManager::LoadScene(std::string sceneName)
//{
// if (_currentScene != nullptr)
// {
// _currentScene->SceneUnload();
// delete _currentScene;
// }
// _currentScene = _scenes.at(sceneName);
// _currentScene->SceneLoad();
//}
void SceneManager::NewLoadScene(int sceneID)
{
if (_currentScene != nullptr)
{
_currentScene->SceneUnload();
delete _currentScene;
}
_currentScene = _sceneBuilder->InstanciateScene(sceneID);
_currentScene->SceneLoad();
}
void SceneManager::UpdateScene()
{
_currentScene->SceneUpdate();
}
} }
+90 -51
View File
@@ -1,72 +1,111 @@
#pragma once #pragma once
#include "Scene/Scene.h"
#include <string> #include <string>
#include <vector> #include <vector>
#include <unordered_map> #include <unordered_map>
// //
// Habría que implemetar un sistema para cambiar de escena. // TODO:
// La cuestión sería almecenar el ID actual o algo así. // - Se podría plantear un sistema de carga asincrona para las escenas.
// Las escenas que no están cargadas se pueden mantener construidas en el vector, pues el espacio que ocupan en memoria debería ser mínimo. // - La variable "loaded" de las escenas no tiene mucha utilidad en este momento.
// Cuando cargas una escena, se descarga la anterior mediante Scene.unload y se carga la nueva con Scene.Load. De esta forma,
// si cada escena gestiona bien sus recursos en la carga y descarga, no debería generar ningún problema y no ocupar espacio cuando esté descargada.
// Quizás se puede añadir una opción para mantener cargada una escena o algo.
//
// Quizás es innecesaria la ID interna de la escena....
//
namespace UE namespace UE
{ {
class Scene;
class SceneBuilder;
/* Gestiona todas escenas. Las carga, descargar y ejecuta. */ /* Gestiona todas escenas. Las carga, descargar y ejecuta. */
class SceneManager class SceneManager
{ {
public: public:
/* Constructor */
SceneManager() {}
void InitSceneManager(SceneBuilder* sceneBuilder); /* Constructor */
void CleanSceneManager(); SceneManager()
{
InitSceneManager();
}
//Añade una escena a la lista y retorna su ID. Son Ptrs, por lo que poco importa donde los almacenamos. ~SceneManager()
//void AddScene(Scene* sceneToAdd); {
CleanSceneManager();
//Devuelve un ptr a la escena del ID especificado. }
//Scene* GetScenePtr(std::string sceneName);
std::string GetActiveSceneName();
//Devuelve la escena activa.
inline Scene* GetActiveScenePtr() { return _currentScene; }
//Descarga la escena activa y carga la escena indicada.
//void LoadScene(std::string sceneName);
//Descarga la escena activa y carga la escena indicada. Para ello llama al builder que tiene y este le devuelve un ptr a la nueva escena.
void NewLoadScene(int sceneID);
//Pasa el Update a la escena actual.
//¿Necesita hacer algo más?
void UpdateScene();
// ¿Esto sirve para algo?
//void LoadSceneDataFromFile(std::string filePath);
private: //Inicializa el ScenenManager (En caso de haber algo que iniciar.)
Scene* _currentScene = nullptr; void InitSceneManager();
//Limpia los contenedores de Scenes y descarga las escenas cargadas.
void CleanSceneManager();
SceneBuilder* _sceneBuilder = nullptr; /*
* Carga una nueva escena.
* Se almacena en la lista de escenas cargadas.
* Para cambiar de escena, usar SwitchScene();
* Si la escena ya estuvise cargada, se descargará la anterior y se cargará la nueva.
*/
void LoadScene(Scene* sceneToLoad);
//Almacenamos un ptr a las diferentes escenas disponibles. /*
//Otra opción es trabajar con Templates para instanciar la clase pretinente sin necesidad de almacenar nada. * Cambia la escena activa por la indicada.
//De cualquier forma, son ptr en el Stack y deberían de eliminar todo al hacer scene.Unload(). * Si la indicada no está cargada, no hace nada.
//std::unordered_map<std::string, Scene*> _scenes; */
//std::vector<Scene*> _scenes; void SwitchScene(std::string name);
/*
* Carga la escena indicada.
* Cambia la escena actual por la nueva escena.
*/
void LoadAndSwitchScene(Scene* sceneToLoad);
/*
* Cambia la escena activa por la indicada.
* Descarga completamente la escena activa anterior.
* Si la escena indicada no está cargarda, no hace nada.
* Si no hay una escena activa, no la descarga.
*/
void SwitchAndUnloadScene(std::string name);
}; /*
* Descarga la escena con el nombre indicado.
* Si la escena no está en la lista, no hace nada.
*/
void UnloadScene(std::string name);
/*
* Comprueba si la escena indicada está en la lista de escenas cargadas.
* Retorna true si está cargada, false si no.
*/
bool IsSceneLoaded(std::string name);
/*
* Devuelve el nombre de la escena activa.
*/
std::string GetCurrentSceneName();
/*
* Devuelve el ptr de la escena activa.
*/
Scene* GetCurrentScenePtr();
/*
* Update para la escena activa.
* Se ha de llamar en cada frame para pasar el update a la escena activa.
* TODO: No se usa... O añadimos para las otras fases o quitamos esta.
*/
void UpdateScene();
private:
//Ptr a la escena que está activa en ese momento.
Scene* _currentScene = nullptr;
//Almacenamos un ptr a todas las escenas cargadas en ese momento.
//o, al menos, lo intentamos.
std::unordered_map<std::string, Scene*> _loadedScenes;
};
} }
+18 -18
View File
@@ -8,36 +8,36 @@ uint32_t UE::Time::_startTime;
void UE::Time::StartFrame() void UE::Time::StartFrame()
{ {
_startTime = SDL_GetTicks(); _startTime = SDL_GetTicks();
} }
void UE::Time::EndFrame() void UE::Time::EndFrame()
{ {
// Calculamos el tiempo que llevamos de Frame, para que si nos quedamos cortos, esperemos. // Calculamos el tiempo que llevamos de Frame, para que si nos quedamos cortos, esperemos.
//FrameTime es el tiempo que ha tardado el frame (el deltaTime) en MS. //FrameTime es el tiempo que ha tardado el frame (el deltaTime) en MS.
uint32_t frameTime = SDL_GetTicks() - _startTime; uint32_t frameTime = SDL_GetTicks() - _startTime;
//Frames totales / segundos totales. //Frames totales / segundos totales.
//_avgFPS = countedFrames / (SDL_GetTicks() / 1000.f); //_avgFPS = countedFrames / (SDL_GetTicks() / 1000.f);
//std::cout << "FPS: " << avgFPS << " / " << "dT: " << deltaTime << std::endl; //std::cout << "FPS: " << avgFPS << " / " << "dT: " << deltaTime << std::endl;
//Limitamos los FPS haciendo esperar al programa el tiempo extra que quede. //Limitamos los FPS haciendo esperar al programa el tiempo extra que quede.
//En vez de sólo esperar, se podrían hacer tareas como cargar Assets o realizar cálculos pesados. //En vez de s�lo esperar, se podr�an hacer tareas como cargar Assets o realizar c�lculos pesados.
if (frameTime < MS_PER_FRAME) if (frameTime < MS_PER_FRAME)
{ {
SDL_Delay(MS_PER_FRAME - frameTime); SDL_Delay(MS_PER_FRAME - frameTime);
} }
//Calculamos el deltaTime, que sí será el tiempo real que ha pasado, pues hemos esperado. //Calculamos el deltaTime, que s� ser� el tiempo real que ha pasado, pues hemos esperado.
frameTime = SDL_GetTicks() - _startTime; frameTime = SDL_GetTicks() - _startTime;
//Convertimos deltaTime a segundos pues es lo usado en los cálculos. //Convertimos deltaTime a segundos pues es lo usado en los c�lculos.
deltaTime = frameTime / 1000.0f; deltaTime = frameTime / 1000.0f;
//++countedFrames; //++countedFrames;
} }
+22 -22
View File
@@ -2,42 +2,42 @@
#include <cstdint> #include <cstdint>
/* /*
TODO: TODO:
- Buscar una mejor forma de calcular la media de FPS. - Buscar una mejor forma de calcular la media de FPS.
*/ */
namespace UE namespace UE
{ {
class Time class Time
{ {
public: public:
//------------------- //-------------------
//---- Métodos ------ //---- Métodos ------
//------------------- //-------------------
static void StartFrame(); static void StartFrame();
static void EndFrame(); static void EndFrame();
//------------------- //-------------------
//---- Variables ---- //---- Variables ----
//------------------- //-------------------
static double deltaTime; static double deltaTime;
private: private:
static uint32_t _startTime; static uint32_t _startTime;
//uint16_t countedFrames = 0; //uint16_t countedFrames = 0;
float _avgFPS; float _avgFPS;
static const int FPS = 60; static const int FPS = 60;
//Milisegundos que tiene que tener un frame para poder hacer el número de FPS por segundo. //Milisegundos que tiene que tener un frame para poder hacer el número de FPS por segundo.
static const int MS_PER_FRAME = 1000 / FPS; static const int MS_PER_FRAME = 1000 / FPS;
}; };
} }
-48
View File
@@ -1,48 +0,0 @@
#pragma once
#include "Scene/SceneBuilder.h"
#include "Scene/Scene.h"
#include "Scenes/MainScene.hpp"
#include "Scenes/TestScene2.hpp"
//#include "Logging\Logger.h"
enum LasEscenas
{
mainMenu = 0, nivel1
};
class GameScenes : public UE::SceneBuilder
{
public:
GameScenes()
{
}
UE::Scene* InstanciateScene(int sceneID) override
{
switch (sceneID)
{
case LasEscenas::mainMenu:
{
UE::Scene* sc = new MainScene("Main");
return sc;
break;
}
case LasEscenas::nivel1:
{
UE::Scene* sc = new TestScene2("Test2");
return sc;
break;
}
default:
return nullptr;
break;
}
}
};
+42 -32
View File
@@ -6,9 +6,8 @@
#include <ImGui/imgui_impl_sdl.h> #include <ImGui/imgui_impl_sdl.h>
#include <ImGui/imgui_impl_opengl3.h> #include <ImGui/imgui_impl_opengl3.h>
#include "UberGame1.h"
#include "GameScenes.hpp"
#include "Engine.h"
#include "UberEngine.h" #include "UberEngine.h"
@@ -17,7 +16,7 @@
static bool _quit = false; static bool _quit = false;
void Init(); int Init();
void Load(); void Load();
void Loop(); void Loop();
void Clean(); void Clean();
@@ -25,7 +24,9 @@ void Clean();
int main(int argc, char* args[]) int main(int argc, char* args[])
{ {
Init(); //Si falla la inicialización, terminamos el juego.
if(Init() < 0) { return -1; }
Load(); Load();
Loop(); Loop();
Clean(); Clean();
@@ -33,25 +34,28 @@ int main(int argc, char* args[])
return 0; return 0;
} }
int Init()
void Init()
{ {
UE::Logger::InitLogger(); if(UE::Engine::Init() < 0)
{
Game::InitGame(); GAME_LOG_CRITICAL("No se ha podido cargar el motor.");
return -1;
}
return 0;
} }
void Load() void Load()
{ {
Game::GetAssetManager()->LoadAssetsFromFile("resources/AssetList/MainAssets.json"); UE::Engine::GetAssetManager()->LoadAssetsFromFile("resources/AssetList/MainAssets.json");
Game::GetAssetManager()->ProcessAssetQueue(); UE::Engine::GetAssetManager()->ProcessAssetQueue();
//Cargamos la escena que queramos tras tener todos los Assets pertinentes cargados. //Cargamos la escena que queramos tras tener todos los Assets pertinentes cargados.
//Si la escena contiene su propio AssetManager y los carga ella misma, no ser� necesario. //Si la escena contiene su propio AssetManager y los carga ella misma, no ser� necesario.
//Game::GetSceneManager()->LoadScene("Main"); //Game::GetSceneManager()->LoadScene("Main");
Game::GetSceneManager()->NewLoadScene(LasEscenas::mainMenu); UE::Engine::GetSceneManager()->LoadScene(new MainScene());
UE::Engine::GetSceneManager()->SwitchScene("MainScene");
} }
@@ -83,10 +87,17 @@ void Loop()
#pragma endregion #pragma endregion
//Almacenamos el renderer para ya tenerlo por aquí.
UE::Renderer* UE_Renderer = UE::Engine::GetRenderer();
while (!_quit) while (!_quit)
{ {
UE::Time::StartFrame(); UE::Time::StartFrame();
//Almacenamos la escena actual.
UE::Scene* currentScene = UE::Engine::GetSceneManager()->GetCurrentScenePtr();
//TEMP Event Handler: //TEMP Event Handler:
SDL_Event eventHandler; SDL_Event eventHandler;
while (SDL_PollEvent(&eventHandler) != 0) while (SDL_PollEvent(&eventHandler) != 0)
@@ -98,7 +109,7 @@ void Loop()
if (io.WantCaptureMouse) { continue; } if (io.WantCaptureMouse) { continue; }
Game::GetSceneManager()->GetActiveScenePtr()->SceneHandleEvents(&eventHandler); currentScene->SceneHandleEvents(&eventHandler);
if (eventHandler.type == SDL_QUIT) if (eventHandler.type == SDL_QUIT)
{ {
_quit = true; _quit = true;
@@ -106,17 +117,17 @@ void Loop()
if (eventHandler.type == SDL_WINDOWEVENT && eventHandler.window.event == SDL_WINDOWEVENT_RESIZED) if (eventHandler.type == SDL_WINDOWEVENT && eventHandler.window.event == SDL_WINDOWEVENT_RESIZED)
{ {
//GAME_LOG_CRITICAL("Window Size chaged {0}x{1}", eventHandler.window.data1, eventHandler.window.data2); //GAME_LOG_CRITICAL("Window Size chaged {0}x{1}", eventHandler.window.data1, eventHandler.window.data2);
Game::GetRenderer()->SetScreenSize(eventHandler.window.data1, eventHandler.window.data2); UE_Renderer->SetScreenSize(eventHandler.window.data1, eventHandler.window.data2);
} }
if (eventHandler.type == SDL_KEYDOWN) if (eventHandler.type == SDL_KEYDOWN)
{ {
switch (eventHandler.key.keysym.sym) switch (eventHandler.key.keysym.sym)
{ {
case SDLK_1: case SDLK_1:
Game::GetSceneManager()->NewLoadScene(LasEscenas::mainMenu); UE::Engine::GetSceneManager()->LoadAndSwitchScene(new MainScene());
break; break;
case SDLK_2: case SDLK_2:
Game::GetSceneManager()->NewLoadScene(LasEscenas::nivel1); UE::Engine::GetSceneManager()->LoadAndSwitchScene(new TestScene2());
break; break;
default: default:
break; break;
@@ -134,32 +145,33 @@ void Loop()
GAME_LOG_TRACE("FPS: NULL / dT: {1}", UE::Time::deltaTime); GAME_LOG_TRACE("FPS: NULL / dT: {1}", UE::Time::deltaTime);
} }
if (keyStates[SDL_SCANCODE_W]) if (keyStates[SDL_SCANCODE_W])
{ {
glm::ivec2 camPos = Game::GetRenderer()->GetCamPosition(); glm::ivec2 camPos = UE_Renderer->GetCamPosition();
camPos.y -= 5; camPos.y -= 5;
Game::GetRenderer()->SetCamPosition(camPos.x, camPos.y); UE_Renderer->SetCamPosition(camPos.x, camPos.y);
} }
if (keyStates[SDL_SCANCODE_S]) if (keyStates[SDL_SCANCODE_S])
{ {
glm::ivec2 camPos = Game::GetRenderer()->GetCamPosition(); glm::ivec2 camPos = UE_Renderer->GetCamPosition();
camPos.y += 5; camPos.y += 5;
Game::GetRenderer()->SetCamPosition(camPos.x, camPos.y); UE_Renderer->SetCamPosition(camPos.x, camPos.y);
} }
if (keyStates[SDL_SCANCODE_D]) if (keyStates[SDL_SCANCODE_D])
{ {
glm::ivec2 camPos = Game::GetRenderer()->GetCamPosition(); glm::ivec2 camPos = UE_Renderer->GetCamPosition();
camPos.x += 5; camPos.x += 5;
Game::GetRenderer()->SetCamPosition(camPos.x, camPos.y); UE_Renderer->SetCamPosition(camPos.x, camPos.y);
} }
if (keyStates[SDL_SCANCODE_A]) if (keyStates[SDL_SCANCODE_A])
{ {
glm::ivec2 camPos = Game::GetRenderer()->GetCamPosition(); glm::ivec2 camPos = UE_Renderer->GetCamPosition();
camPos.x -= 5; camPos.x -= 5;
Game::GetRenderer()->SetCamPosition(camPos.x, camPos.y); UE_Renderer->SetCamPosition(camPos.x, camPos.y);
} }
Game::GetSceneManager()->GetActiveScenePtr()->SceneUpdate(); currentScene->SceneUpdate();
//Game::GetRenderer()->QueueDrawCall(4, DestR2, test1); //Game::GetRenderer()->QueueDrawCall(4, DestR2, test1);
//Game::GetRenderer()->QueueDrawCall(1, DestR, background); //Game::GetRenderer()->QueueDrawCall(1, DestR, background);
@@ -170,20 +182,20 @@ void Loop()
// //
//Iniciamos un nuevo Frame. //Iniciamos un nuevo Frame.
Game::GetRenderer()->NewFrame(); UE_Renderer->NewFrame();
//Renderiza la escena. //Renderiza la escena.
Game::GetSceneManager()->GetActiveScenePtr()->SceneRender(); currentScene->SceneRender();
//As� podemos renderizar cosas de ImGui cuando estemos entre NewFrame y EndFrame. //As� podemos renderizar cosas de ImGui cuando estemos entre NewFrame y EndFrame.
bool show = true; bool show = true;
ImGui::ShowDemoWindow(&show); ImGui::ShowDemoWindow(&show);
//Dibuja las cosas del Renderer. //Dibuja las cosas del Renderer.
Game::GetRenderer()->RenderData(); UE_Renderer->RenderData();
//Terminamos el Frame. //Terminamos el Frame.
Game::GetRenderer()->EndFrame(); UE_Renderer->EndFrame();
UE::Time::EndFrame(); UE::Time::EndFrame();
@@ -194,7 +206,5 @@ void Loop()
void Clean() void Clean()
{ {
Game::CleanGame(); UE::Engine::Clean();
SDL_Quit();
} }
+10 -7
View File
@@ -23,21 +23,24 @@ class MainScene : public UE::Scene
{ {
public: public:
MainScene(std::string sceneName) : Scene(sceneName) {} MainScene() : Scene("MainScene")
{
//_sceneName = "MainScene";
}
void SceneLoad() override void SceneLoad() override
{ {
UE_LOG_INFO("Escena {0} ha sido cargada", _sceneName); UE_LOG_INFO("Escena {0} ha sido cargada", _sceneName);
UE::AssetManager* as = Game::GetAssetManager(); UE::AssetManager* as = UE::Engine::GetAssetManager();
UE::Texture* test1Texture = as->getTexture("test1"); UE::Texture* test1Texture = as->getTexture("test1");
UE::Sprite sp1(test1Texture, 0, 2, glm::vec2(55, 60), glm::vec2(100, 100)); UE::Sprite sp1(test1Texture, 0, 2, glm::vec2(55, 60), glm::vec2(100, 100));
UE::Sprite sp2(test1Texture, 0, 1, glm::vec2(50, 45), glm::vec2(145, 145)); UE::Sprite sp2(test1Texture, 0, 1, glm::vec2(50, 45), glm::vec2(145, 145));
UE::Sprite bg(as->getTexture("bg1"), 1, 0, glm::vec2(0, 0), Game::GetRenderer()->GetScreenSize()); UE::Sprite bg(as->getTexture("bg1"), 1, 0, glm::vec2(0, 0), UE::Engine::GetRenderer()->GetScreenSize());
UE::Sprite mapSP(as->getTexture("PruebaMap"), 0, 2, glm::vec2(50, 45), glm::vec2(145, 145)); UE::Sprite mapSP(as->getTexture("PruebaMap"), 0, 2, glm::vec2(50, 45), glm::vec2(145, 145));
@@ -62,9 +65,9 @@ public:
//UE_LOG_INFO("Escena {0} UPDATE", _sceneName); //UE_LOG_INFO("Escena {0} UPDATE", _sceneName);
UE::Renderer* renderer; UE::Renderer* renderer;
renderer = Game::GetRenderer(); renderer = UE::Engine::GetRenderer();
glm::vec2 screenSize = Game::GetRenderer()->GetScreenSize(); glm::vec2 screenSize = UE::Engine::GetRenderer()->GetScreenSize();
UE::Sprite& sp1 = sprites.at(0); UE::Sprite& sp1 = sprites.at(0);
glm::vec2 pos = sp1.GetPosition(); glm::vec2 pos = sp1.GetPosition();
@@ -78,7 +81,7 @@ public:
void SceneRender() override void SceneRender() override
{ {
UE::Renderer* renderer; UE::Renderer* renderer;
renderer = Game::GetRenderer(); renderer = UE::Engine::GetRenderer();
for (UE::Sprite& sp : sprites) for (UE::Sprite& sp : sprites)
{ {
@@ -236,7 +239,7 @@ private:
void AssetMngGUI() void AssetMngGUI()
{ {
UE::AssetManager* asmng = Game::GetAssetManager(); UE::AssetManager* asmng = UE::Engine::GetAssetManager();
ImGui::Begin("Asset Manager Inspector", &assetMngGUI); ImGui::Begin("Asset Manager Inspector", &assetMngGUI);
+7 -4
View File
@@ -18,7 +18,10 @@ class TestScene2 : public UE::Scene
{ {
public: public:
TestScene2(std::string sceneName) : Scene(sceneName) {} TestScene2() : Scene("TestScene")
{
//_sceneName = "TestScene";
}
void SceneLoad() override void SceneLoad() override
{ {
@@ -26,7 +29,7 @@ public:
srand(255); srand(255);
UE::AssetManager* as = Game::GetAssetManager(); UE::AssetManager* as = UE::Engine::GetAssetManager();
UE::Texture* tx = as->getTexture("PruebaMap"); UE::Texture* tx = as->getTexture("PruebaMap");
@@ -55,7 +58,7 @@ public:
void SceneRender() override void SceneRender() override
{ {
UE::Renderer* renderer; UE::Renderer* renderer;
renderer = Game::GetRenderer(); renderer = UE::Engine::GetRenderer();
for (UE::Sprite& sp : sprites) for (UE::Sprite& sp : sprites)
{ {
@@ -85,7 +88,7 @@ public:
} }
if (event->type == SDL_MOUSEBUTTONDOWN) if (event->type == SDL_MOUSEBUTTONDOWN)
{ {
UE::Renderer* rend = Game::GetRenderer(); UE::Renderer* rend = UE::Engine::GetRenderer();
glm::ivec2 mPos(event->button.x, event->button.y); glm::ivec2 mPos(event->button.x, event->button.y);
glm::ivec2 wPos = rend->ScreenToWorldCoords(mPos); glm::ivec2 wPos = rend->ScreenToWorldCoords(mPos);
GAME_LOG_TRACE("Posicion del raton: \n\tPantalla: {0}x{1}, Mundo: {2}x{3}: ", mPos.x, mPos.y, wPos.x, wPos.y); GAME_LOG_TRACE("Posicion del raton: \n\tPantalla: {0}x{1}, Mundo: {2}x{3}: ", mPos.x, mPos.y, wPos.x, wPos.y);
-49
View File
@@ -1,49 +0,0 @@
#include "UberGame1.h"
#include "Logging/Logger.h"
#include "Render/Renderer.h"
#include "Assets/AssetManager.h"
#include "Scene/SceneManager.h"
#include "Scene/SceneBuilder.h"
#include "GameScenes.hpp"
//Sobrecarga de SceneBuilder que devuelve las escenas correctas para este juego.
//#include "GameScenes.hpp"
UE::Renderer* Game::mainRenderer;
UE::AssetManager* Game::asManager;
UE::SceneManager* Game::scManager;
GameScenes Game::_sceneBuilder;
void Game::InitGame()
{
mainRenderer = new UE::Renderer(640, 480, 5);
mainRenderer->InitRenderer();
UE_LOG_INFO("Renderer Created.");
asManager = new UE::AssetManager(mainRenderer->GetSDLRenderer());
asManager->InitAssetManager();
UE_LOG_INFO("AssetManager Created.");
//Creamos el SceneBuilder de este juego.
_sceneBuilder = GameScenes();
scManager = new UE::SceneManager();
scManager->InitSceneManager(&_sceneBuilder);
}
void Game::CleanGame()
{
asManager->CleanAssetManager();
delete asManager;
mainRenderer->CleanRenderer();
delete mainRenderer;
scManager->CleanSceneManager();
delete scManager;
}
-30
View File
@@ -1,30 +0,0 @@
#pragma once
namespace UE
{
class Renderer;
class AssetManager;
class SceneManager;
class SceneBuilder;
}
class GameScenes;
class Game
{
public:
static void InitGame();
static void CleanGame();
inline static UE::Renderer* GetRenderer() { return mainRenderer; }
inline static UE::AssetManager* GetAssetManager() { return asManager; }
inline static UE::SceneManager* GetSceneManager() { return scManager; }
private:
static UE::Renderer* mainRenderer;
static UE::AssetManager* asManager;
static UE::SceneManager* scManager;
static GameScenes _sceneBuilder;
};