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 y Example_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*/
{}

2. Actualizar Components.h

  • 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 ficero ComponentsConstructors.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 a parse(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*/
};

4. Actualizar DataManager.cpp

  • 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;
    ...
    }
}

5. Actualizar ObjectsFactory.cpp

  • 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;
}