Hallo zusammen
Ich habe da eine Frage ...
Ich habe für die UNI in C++ einen Graphen Entwickeln müssen und habe mir gedacht ich nehme den Code und baller ihn mal in mein UE4 Projekt rein.
Und zwar brauche ich einen Skill-Tree, wo jeder Knoten mehr als ein Vater haben kann (daher kein Baum).
Der Grund ist, ein Skilltree der auch wirklich optisch vor einem ist (in Blueprints), ist auch übersichtlicher, Wartbarer und es wäre leichter Sachen zu ändern als das alles in C++ Code.
Hier mal meinen Code:
/*
* Graph.h
*
* Created on: 22.04.2018
* Author: evd
*/
#include <iostream>
#include <list>
template<class T>
class Graph
{
public:
T element;
std::list<Graph<T>*> childs;
std::list<Graph<T>*> parents;
Graph(T);
~Graph();
Graph<T>* makeNewChild(T);
bool pushChildtoParent(Graph<T>*);
Graph<T>* makeNewChild(Graph<T>*);
bool deleteChild(Graph<T>*);
bool makeParent(Graph<T>*);
T getElement();
bool leaf;
};
template<class T>
Graph<T>::Graph(T element) : element(element)
{
leaf = true;
}
template<class T>
Graph<T>::~Graph()
{
if(!leaf)
{
for (auto it = childs.begin(); it != childs.end();)
{
// wenn das kind nicht mehrere Väter hat, denen ich es nicht weg nehmen will
if ((**it).parents.size()<2)
{
delete *it ++;
}
else{
(**it).parents.remove(this);
it ++;
}
}
}
if (!(*this).parents.empty())
{
for (auto it = parents.begin(); it != parents.end(); it++)
{
//alle Väter vergessen dieses Kind, damit es ohne folgen beseitigt werden kann
(**it).deleteChild(this);
}
}
}
template<class T>
T Graph<T>::getElement()
{
return (*this).element;
}
template<class T>
bool Graph<T>::deleteChild(Graph<T>* tokill)
{
for (auto it = childs.begin(); it != childs.end(); it++)
{
if( (*it)==tokill){
childs.erase(it);
return true;
}
}
// Error code hier einfügen
std::cout<<"Leider dieses Kind nicht gefunden. Error main2.h at line 61"<<std::endl;
return false;
}
//eingane der zu setzende Vater. Wenn setzen des Vaters gelingt, wird er in die Liste der Väter aufgenommen
template<class T>
bool Graph<T>::makeParent (Graph<T>* newParent){
if ((*newParent).pushChildtoParent(this)){
parents.push_back(newParent);
return true;
}
else{
//Error code hier einfügen
std::cout<<"das Erzeugen dieses Kindes bei dem Vater war nicht möglich. Error main2.h at line 76"<<std::endl;
return false;
}
}
template<class T>
bool Graph<T>::pushChildtoParent(Graph<T>* inTree){
childs.push_back(inTree);
leaf = false;
return true;
}
template<class T>
Graph<T>* Graph<T>::makeNewChild(T inValue)
{
Graph<T>* contain = new Graph<T>(inValue);
childs.push_back(contain);
(*contain).parents.push_back(this);
leaf = false;
return contain;
}
template<class T>
Graph<T>* Graph<T>::makeNewChild(Graph<T>* inTree)
{
childs.push_back(inTree);
(*inTree).parents.push_back(this);
leaf = false;
return inTree;
}
Alles anzeigen
Jetzt die Frage... wie bekomme ich das zu einer UCLASS(Blueprintable) bei der ich eine UFUNCTION definieren kann ...
ich habe ja schon gehört das ich das std::list mal getrost vergessen kann unter UE4, das wehre dann so was wie eine TList oder so ...
und dann vielleicht noch eine etwas gröbere Frage...
Ich habe mal das ganze Geschlontz in eine Actour Class rein kopiert ... drüber UCLASS(Blueprintable) geschrieben und über z.b. getParent UFUNCTION(BlueprintCallable, Category=Graph) geschrieben.
Sollte ich dann nicht auch get Parent finden?
Oder wo ist denn eine ganz nette Deutsche Seite bei der ich mich da mal schlau lesen kann?
Liebe grüße
EvD
EDIT: da ich noch blutiger Anfänger bin, bin ich über jede noch so kleine Hilfe erfreut und hoffe das ihr über meine Unwissenheit hinweg sehen könnt
EDIT(29.04.18): wie ich gerade gelesen habe, kann ich anscheinend vermutlich (man sieht, ich bin mir da ganz sicher ;D ) keine Templates in UE4 benutzen, wenn man auch gleichzeitig eine UCLASS() daraus machen will xD