2016-05-03 3 views
0

На Screen желтый шар приближается к желтой дуге и бьет его. Каждая дуга (черный, зеленый и желтый - это дуги - разные объекты). Обнаружение столкновений, когда мяч попадает в желтые дуги, показывает 3 объекта - 3 дуги, даже когда он ударяет только по одной желтой дуге.Обнаружение столкновений не работает должным образом

некоторый код из кругов (дуги) (он наследует от QGraphicsItem). Ширина - это ширина пера, поэтому столкновение находится на внешней границе дуги.

#include ball.h 

QRectF Circle::boundingRect() const 
{ 
    QRectF rect(-radius, -radius, radius*2, radius*2); 
    return rect; 
} 

QPainterPath Circle::shape() const 
{ 
    QPainterPath path; 
    path.addEllipse(QRectF(-radius-width, -radius-width, (radius+width)*2, (radius+width)*2)); 
    return path; 
} 

Некорректный код из шара (он скрыт от QGraphicsObject) и обнаружение столкновения в paint().

QPainterPath Ball::shape() const 
{ 
    QPainterPath path; 
    path.addEllipse(boundingRect()); 
    return path; 
} 

QRectF Ball::boundingRect() const 
{ 
    QRectF rect(-radius, -radius, radius*2, radius*2); 
    return rect; 
} 

void Ball::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    if (!scene()->collidingItems(this).isEmpty()) { 
     for (int y = 0; y<collidingItems().size(); y++) 
      qDebug() << collidingItems().at(y); 
     delete this; 
    } 
} 

Я, наверное, знаю, где ошибка: в Круге :: форма() путь является эллипсом, но она должна быть дугой. Как я должен был сделать такой путь:

painter->drawArc(boundingRect(), startAngle, spanAngle); 

ответ

1

Вы уверены, что ваш расчет квадратной шкалы для дуги?

QRectF Circle::boundingRect() const 
{ 
    QRectF rect(-radius, -radius, radius*2, radius*2); 
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    return rect; 
} 

Может быть, это должно быть:

QRectF(-radius-width, -radius-width, (radius+width)*2, (radius+width)*2)); 

Я не могу просмотреть изображение, поэтому я предполагаю, что здесь. Просто убедитесь, что вы НЕ вычисляете ограничивающий прямоугольник, чем то, что действительно необходимо.

+0

Это не имело никакого отношения, у меня тоже есть форма(), поэтому ограничивающая рамка в порядке. Когда мяч попадает в дугу, он говорит мне, что он попадает в 3 дуги, а не один, все с pos = pos = 1280,540 (в центре экрана). –

Смежные вопросы