Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Гурман от Февраль 18, 2015, 19:23



Название: (РЕШЕНО) 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 использовался? Рыл, рыл... не нарыл...

Или это баг? Кто-нибудь еще сталкивался с таким?


Название: Re: QGraphicsItem::collidingItems() что-то не то выдает
Отправлено: Old от Февраль 18, 2015, 19:35
Ну так шейп должен находиться внутри bouningRect.
Вначале идёт проверка на область, потом на фигуру.


Название: Re: QGraphicsItem::collidingItems() что-то не то выдает
Отправлено: Гурман от Февраль 18, 2015, 20:06
оба-на... а нигде ведь не сказано, что обязательно внутри прямоугольника, и самое смешное, что работает шейп больше прямоугольника, но только для того айтема, проверка которого вызывается

и не вполне ясно, с чего бы не работало во всех случаях - координаты то qreal, ну и что, что они отрицательные


Название: Re: QGraphicsItem::collidingItems() что-то не то выдает
Отправлено: Old от Февраль 18, 2015, 20:11
Проверки идут в два этапа: сначала на бокс, а потом для тонкой проверки - на фигуру.
Если проверка показывает, что в бокс не попали, то проверка на фигуру даже не будет выполненна.


Название: Re: QGraphicsItem::collidingItems() что-то не то выдает
Отправлено: Гурман от Февраль 18, 2015, 20:17
Вот блин...  :-[ А мне надо проверять на некотором расстоянии от фигуры. Получается, надо перед вызовом проверки пересчитывать boundingBox, потом возвращать обратно.

Причем, если бы при флаге Qt::IntersectsItemShape проверка делалась только на шейп, игнорируя бокс - то всё бы без проблем работало.  :-\

PS: а блин, нихрена не получится с подменой - надо ведь менять boundingBox для всех айтемов соответствующего типа на сцене  >:(

Выходит, единственный вариант - самому искать с кем увеличенный шейп пересекается.  :-\


Название: Re: QGraphicsItem::collidingItems() что-то не то выдает
Отправлено: Old от Февраль 18, 2015, 20:44
Напрасно вы делаете бокс меньше, чем сам элемент занимает. Вы ещё сможете получить артефакты при отрисовке, от которых просто так уже не избавится.


Название: Re: QGraphicsItem::collidingItems() что-то не то выдает
Отправлено: Гурман от Февраль 18, 2015, 20:53
Нет, я так не делаю. Бокс ровно такой, как элемент. Но мне нужно проверять при движении элементов, чтобы они не подходили к друг другу ближе определенного расстояния (в моем случае 2 шага сетки). Чтобы между ними всегда было некоторое расстояние. Например, если роняют один объект слишком близко к другому, чтобы он отскакивал на минимальное допустимое расстояние. Делать бокс с учетом этого расстояния не имеет никакого смысла - снаружи своего настоящего бокса сам айтем ничего никогда рисовать не будет. Проверка на расстояние чисто внешняя для айтема.