Russian Qt Forum
Апрель 19, 2024, 14:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Цепочка boolean для юзверя  (Прочитано 4013 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июнь 20, 2016, 13:33 »

Добрый день

Есть/рисуется "схема" из пр-ков (ноды). Каждый нод имеет входную и выходную бубочки (триггера).  При нажатии на бубочку она выделяется (красная) и в др панели появляются тип и опции триггера, которые можно менять. Опций немного, обычно триггер - простое условие, напр "время истекло", "расстояние до цели меньше заданного" и.т.п. Однако вариантов (типов) триггеров много, и это число будет расти.

Хотелось бы дать юзеру возможность создавать "составные" триггера, напр триггер срабатывает если "время истекло" ИЛИ "расстояние меньше". Понятно что это можно сделать в виде еще одного графа - но нет ли более компактных (или менее развесистых) решений?

Спасибо
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Июнь 29, 2016, 19:01 »

Ну, разве что блоки размещать друг в друге и объединять условиями И или ИЛИ.
Как матрешку.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 30, 2016, 09:20 »

Ну, разве что блоки размещать друг в друге и объединять условиями И или ИЛИ.
Как матрешку.
А как это выглядит? (можно грубый эскиз в дызайнере или просто словами)
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Июнь 30, 2016, 10:37 »

Ну допустим есть комбобокс, в котором можно выбирать доступные триггеры.
И есть кнопки "добавить условие" и "добавить блок".
Когда выбирается "блок", на месте комбобокса появляется групбокс, в котором расположен комбобокс с триггерами и снова те же 2 кнопки.
Когда выбирается "добавить условие", то ниже добавляется еще один комбик с вариантами "И", "ИЛИ", и пр. А под ним еще один комбик с триггерами.

Примерно так:

1. [Тут триггеры] [+условие] [+блок][-удалить]
[И/ИЛИ]
2. [Тут триггеры] [+условие] [+блок][-удалить]
[И/ИЛИ]
3. (а тут блок:)
.......................................................[-удалить]
| 1. [Тут триггеры] [+условие] [+блок][-удалить]|
| [И/ИЛИ]                                         |
| 2. [Тут триггеры] [+условие] [+блок][-удалить]|
.......................................................
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июль 02, 2016, 15:32 »

Когда выбирается "блок", на месте комбобокса появляется групбокс, в котором расположен комбобокс с триггерами и снова те же 2 кнопки.
"Ни асилил"  Улыбающийся. Ладно, поговорим о другом чтобы не плодить темы (тем более картинка подходит)

Тут вообще с архитектурой(?) испытываю трудности. Как всегда, сначала все казалось простым. Есть "нод" (какое-то действие) которое имеет 2 триггера, входной и выходной. Пример

Нод 1 - char кивает головой.
Нод 2 - char идет

Вроде все хорошо. Юзер может соединить ноды параллельно (сразу идет и кивает) или последовательно (сначала кивает, потом идет, или наоборот). И вот тут начинают выползать всякие мелкие но противные детали. Действия (выполняемые нодами) разные. "Идет" имеет неопределенную продолжительность, да, все как задумывалось, нужен выходной триггер чтобы его завершить. А вот "Кивает головой" - нет, это действие разовое и длится лишь некоторое время. Для него выходной триггер обычно ни пришей-ни пристегни, только мешает. Ну ладно, добавил новый тип триггера "auto" который автоматом возвращает true если действие закончилось. Заметим что с "академической" точки зрения такое решение не очень хорошо - триггер уже зависит от нода.

Но тут выясняется что часто нужно объединить разовые действия в группы. Напр char может кивать головой неск раз, причем это может обыгрываться всяко-разно. Напр выполнить последовательность из нескольких разных кивков: каждый по разу или случайным образом выбирая новый. И тут я маленько растерялся - куда же поселить этот ф-ционал группы (набора неск действий)? В сам нод - вполне реально, ну просто табличка. Но как-то не нравится. Вариантов "как выполнять группу" явно много, получается нод загроможден подробностями которые могут быть и не нужны (если просто 1 действие). В триггер - ну явно "не туда". Городить еще какую-то сущность (напр "оператор") - ну может быть, но я не представляю как.

Что посоветуете?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Июль 02, 2016, 16:02 »

Node - это базовый класс действий, от которого наследуются остальные.
Первый наследник это, например, Action - это одиночное действие (кивнуть, шагнуть, моргнуть).
Другой наследник это Group - набор нод. В зависимости от выбранной стратегии выполняет последовательность действий. Стратегии можно менять в наследниках Group, но лучше выделить это в отдельный класс, объекты которого будут выбирать последовательность действий.
Действие "идти" можно получить поместив в группу два одиночных действия шаг левой и шаг правой ногой, со стратегией циклического их выполнения.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 22.