Russian Qt Forum
Ноябрь 22, 2024, 23:38
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
(РЕШЕНО) QGraphicsItem::collidingItems() что-то не то выдает
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: (РЕШЕНО) QGraphicsItem::collidingItems() что-то не то выдает (Прочитано 5100 раз)
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
(РЕШЕНО) QGraphicsItem::collidingItems() что-то не то выдает
«
:
Февраль 18, 2015, 19:23 »
Описал шейп у графического айтема в виде прямоугольника размером больше, чем boundingRect, ну так надо. Проверяю как работает - кидаю такой айтем рядом с другим точно таким же айтемом на сцене. Далее под "падающим" я подразумеваю тот айтем, метод collidingItems() которого вызывается чтобы получить список тех, на кого он упал. Наблюдаю странное поведение - подлежащие айтемы появляются в списке только когда под шейп падающего попадает
описывающий прямоугольник
подлежащего, но не его шейп. Флаг по умолчанию mode = Qt::IntersectsItemShape. В доке написано:
Цитировать
The way collisions are detected is determined by applying mode to items that are compared to this item, i.e., each item's
shape or bounding rectangle
is checked
against this item's shape
.
(выделено мной)
На всякий случай явно указал параметром collidingItems( Qt::IntersectsItemShape ) - та же фигня.
Так эта... Что указывает параметр - использование шейп у падающего или подлежащих? Что должно использоваться у
подлежащих
айтемов? shape
или
boundingRect? Я вижу, что используется boundingRect - а как сделать, чтобы у них тоже shape использовался? Рыл, рыл... не нарыл...
Или это баг? Кто-нибудь еще сталкивался с таким?
«
Последнее редактирование: Февраль 23, 2015, 22:54 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: QGraphicsItem::collidingItems() что-то не то выдает
«
Ответ #1 :
Февраль 18, 2015, 19:35 »
Ну так шейп должен находиться внутри bouningRect.
Вначале идёт проверка на область, потом на фигуру.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: QGraphicsItem::collidingItems() что-то не то выдает
«
Ответ #2 :
Февраль 18, 2015, 20:06 »
оба-на... а нигде ведь не сказано, что обязательно внутри прямоугольника, и самое смешное, что работает шейп больше прямоугольника, но только для того айтема, проверка которого вызывается
и не вполне ясно, с чего бы не работало во всех случаях - координаты то qreal, ну и что, что они отрицательные
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: QGraphicsItem::collidingItems() что-то не то выдает
«
Ответ #3 :
Февраль 18, 2015, 20:11 »
Проверки идут в два этапа: сначала на бокс, а потом для тонкой проверки - на фигуру.
Если проверка показывает, что в бокс не попали, то проверка на фигуру даже не будет выполненна.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: QGraphicsItem::collidingItems() что-то не то выдает
«
Ответ #4 :
Февраль 18, 2015, 20:17 »
Вот блин...
А мне надо проверять на некотором расстоянии от фигуры. Получается, надо перед вызовом проверки пересчитывать boundingBox, потом возвращать обратно.
Причем, если бы при флаге Qt::IntersectsItemShape проверка делалась только на шейп, игнорируя бокс - то всё бы без проблем работало.
PS: а блин, нихрена не получится с подменой - надо ведь менять boundingBox для всех айтемов соответствующего типа на сцене
Выходит, единственный вариант - самому искать с кем увеличенный шейп пересекается.
«
Последнее редактирование: Февраль 18, 2015, 20:38 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: QGraphicsItem::collidingItems() что-то не то выдает
«
Ответ #5 :
Февраль 18, 2015, 20:44 »
Напрасно вы делаете бокс меньше, чем сам элемент занимает. Вы ещё сможете получить артефакты при отрисовке, от которых просто так уже не избавится.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: QGraphicsItem::collidingItems() что-то не то выдает
«
Ответ #6 :
Февраль 18, 2015, 20:53 »
Нет, я так не делаю. Бокс ровно такой, как элемент. Но мне нужно проверять при движении элементов, чтобы они не подходили к друг другу ближе определенного расстояния (в моем случае 2 шага сетки). Чтобы между ними всегда было некоторое расстояние. Например, если роняют один объект слишком близко к другому, чтобы он отскакивал на минимальное допустимое расстояние. Делать бокс с учетом этого расстояния не имеет никакого смысла - снаружи своего настоящего бокса сам айтем ничего никогда рисовать не будет. Проверка на расстояние чисто
внешняя
для айтема.
«
Последнее редактирование: Февраль 23, 2015, 22:51 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...