Cómo crear un nuevo Componente - SeriousGamesStudio/Serious-Train-2-3D GitHub Wiki
1. Crear el nuevo componente
- Crea los ficheros
.h
y.cpp
con el sufijo_c
por ejemplo:Example_c.h
yExample_c.cpp
. - Añade
Component.h
y crea la nueva clase de la siguiente manera: En el.h
class Example_c: public Component
{
Example_c(/*args*/);
};
Y en el .cpp
Example_c::Example_c(/*args*/):
Component(ComponentType::EXAMPLE)/*atributos propios*/
{}
Components.h
2. Actualizar - Añade el enumerado que has puesto antes a
enum ComponentType
.
enum ComponentType
{
EXAMPLE,
size
}
Nota: Es muy importante que el elemento size
siempre sea el último elemento
- Añade una nueva entrada a
std::map<ComponentType, const std::string> getComponentString
con el siguiente formato:
std::map<ComponentType, const std::string> getComponentString =
{
{ComponentType::EXAMPLE, "Example"},
...
}
- Añade el
.h
del nuevo componente. Ejemplo:#include "Example_c.h"
3. Actualizar ComponentsContructors
- Crear una nueva clase dentro del
namespace ComponentConstructors
en el ficeroComponentsConstructors.h
. - Esta nueva clase debe heredar de
ComponentConstructor
. Ejemplo:class Example: public ComponentConstructor{};
- Crea la constructora. Si el componente necesita parámetros añade como parámetro
rapidxml::xml_node<>* src
y llama aparse(src)
. Si no necesita parámetros simplemente déjala vacía. Ejemplos:
/*Componente con parámetros*/
class Example:
public ComponentConstructor
{
public:
Example(rapidxml::xml_node<>* src): ComponentConstructor(){ parse(src); }
~Example(){}
/*attibutos*/
private:
void parse (rapidxml::xml_node<>* src)
{
/*Inicializar los atributos a partir de src*/
}
};
/*Componente **sin** parámetros*/
class Example:
public ComponentConstructor
{
public:
Example(): ComponentConstructor(){}
~Example(){}
/*attibutos*/
};
DataManager.cpp
4. Actualizar - Añadir un nuevo caso en el método
ComponentConstructors::ComponentConstructor* getComponentConstructor(ComponentType type, rapidxml::xml_node<>* node)
de la siguiente manera:
ComponentConstructors::ComponentConstructor* getComponentConstructor(ComponentType type, rapidxml::xml_node<>* node)
{
ComponentConstructors::ComponentConstructor* componentConstructor = nullptr;
switch(type)
{
...
case ComponentType::EXAMPLE:
//Si el componente NO recibe parámetros//////////
componentConstructor = new ComponentConstructors::Example();
//Si el componente SI recibe parámetros/////////
componentConstructor = new ComponentConstructors::Example(node);
////
break;
...
}
}
ObjectsFactory.cpp
5. Actualizar - Añadir un nuevo caso en
Component * ObjectsFactory::buildComponent(ComponentType componentType, ComponentConstructors::ComponentConstructor* info)
de la siguiente manera:
Component * ObjectsFactory::buildComponent(ComponentType componentType, ComponentConstructors::ComponentConstructor* info)
{
Component* newComponent = nullptr;
switch (componentType)
{
//Si el componente NO recibe parámetros
case ComponentType::EXAMPLE:
newComponente = new Example_c();
break;
//Si el componente SI recibe parámetros
case ComponentType::EXAMPLE:
{//Estas llaves son importante para poder crear una variable que contenga la info casteada
auto* c = static_cast<ComponentConstructors::Example*>(info);
newComponente = new Example_c(c->param1, c->param2, ...);
break;
}
default: break;
}
return newComponent;
}