Полезное

Мы Вконтакте

Discord канал

#
След.
Аватара пользователя
Пользователь
Сообщения: 1901
скажем есть граф зависимости обьектов иерархический
синими стрелками от родителя к детям
и есть
булевая обьекта говорит о направлении какой-то зависимости.
Изображение
если 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 раз(а).
Аватара пользователя
Пользователь
Сообщения: 1901
Код:
void CalcAllChildes(Obj* ParentObj)
{
   for (int i = 0; i < ParentObj.Childs.Num(); i++)
   {
      if(ParentObj.Childs[i] ->bAffectOnParent )//определяем влияние
      {
         CalcAllChildes(ParentObj.Childs[i]); //рекурсия
      }
   }
   ParentObj.bCalcDone =true;
   for (int i = 0; i < ParentObj.Childs.Num(); i++)
   {
     if(!ParentObj.Childs[i] ->bAffectOnParent )
     {
        CalcAllChildes(ParentObj.Childs[i]); //еще одна рекурсия
     }
   }
}

исправил тупняк был...
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 22
Все я снова чета делаю не так =) Посаны памагите:

Короче тема такая, я делаю драг Widget'а в вьюпорте, и использую локальные координаты виджета из FPointerEvent для оффсета, только вот почему-то не работает так как надо, я так понмиаю там значения не подходят, только во что их конвертировать я не понимаю, может округлить в какую-то сторону? или количество цифр после точки урезать? Или возможно я не учитываю разрешение вьюпорта? я честно сказать не ошен понимаю.

В Виджете
Код:
FReply UInventoryWidget::NativeOnMouseButtonDown(const FGeometry & InGeometry, const FPointerEvent & InMouseEvent)
{
    controller->PanelDrag(this, this->GetCachedGeometry().AbsoluteToLocal(InMouseEvent.GetScreenSpacePosition()));
    return FReply::Handled();
}


Переменные в контроллере
Код:
    UUserWidget* DraggingPanel;
    FVector2D DraggingPanelOffset;
    void PanelDrag(UUserWidget* panel, FVector2D offset) { DraggingPanel = panel; DraggingPanelOffset = offset; }


это фреймтик в контролере
Код:
void AController::Tick(float DeltaTime)
{
    if (DraggingPanel)
    {
        MoveDraggingPanel();
    }
}


это функция перемещения
Код:
void AController::MoveDraggingPanel()
{
    FVector2D mouseposition;
    GetMousePosition(mouseposition.X, mouseposition.Y);
    DraggingPanel->SetPositionInViewport(mouseposition - DraggingPanelOffset);
}


вот видео
Аватара пользователя
Пользователь
Сообщения: 22
И еще вопросик случаем никто не знает переведена ли эта статья на русский где нибудь?
https://wiki.unrealengine.com/GameplayA ... an_Ability


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница