скажем есть граф зависимости обьектов иерархический
синими стрелками от родителя к детям
и есть
булевая обьекта говорит о направлении какой-то зависимости.

если true то влияет на родителя...
каждый обьект знает о своем родителе и первом поколении детей.
задача перебрать рекурсивно все обьекты следуя иерархической последовательности с учетом зависимости.
и вызвать какое-то событие в порядке зависимостей.
тоесть зависимость имеет высшый приоритет, елси ее нет решает иерархия
тоесть как решается пример обьекта 1 c картинки:
Obj1(Obj2)
так как на 1 влияет только 2
обьект 3:
Obj3(Obj1(Obj2),Obj4)
на него влияют 1 и 4
1ый влияет по иерархии, а 4 по зависимости... %)
ммм...
получаем что-то типа:
Код:
class Obj //класс обьекта
{
bool bAffectOnParent; //влияние на родителя
bool bCalcDone=false; //булевая которую нужно поставить тру
Obj* Parent; //родитель, переменная не учавствует в примере просто есть на всякий случай...
TArray<Obj*> Childs; //дети
//... функции установки родителей и детей не важны
}
//вызываем функцию с самым первым по иерархии обьектом как параметром
// все обьекты должны получить "bCalcDone =true" в порядке зависимости
void CalcAllChildes(Obj* ParentObj)
{
for (int i = 0; i < ParentObj.Childs.Num(); i++)
{
if(ParentObj.Childs[i] ->bAffectOnParent )//определяем влияние
{
CalcAllChildes(ParentObj.Childs[i]); //рекурсия
// рекурсия углубляется до до независимого обьекта
// и считает по порядку все зависимости которые вляияют на текущий обьект
}
else
{
//что делать если не влияет на родителя?
//именно этот обьект на родителя не влияет
//но его дети могут влиять на него
//но считать его сейчас слишком рано, потому что еще текущий обьект не решен...
//см картинку obj-3
// надо както потом его вызвать?
}
}
ParentObj.bCalcDone =true; //отмечаем обьект посчитанным или вызываем нужный ивент - конечная цель
//это работает когда все дети влияют на родителя
// но наджо как-то решать переход с зависимостей на иерархию, когда зависимости нет
//- черная стрелка на картинке
}
предложения?
_________________
we need to go deeperПоследний раз редактировалось
Snake 08 фев 2018, 13:18, всего редактировалось 2 раз(а).