碰撞检测无法正常工作

时间:2016-05-03 10:30:23

标签: c++ qt

Screen上,黄色球接近黄色圆弧并击中它。每个弧(黑色,绿色和黄色是弧 - 不同的对象)。球击中黄色弧时的碰撞检测显示3个物体 - 3个弧,即使它只击中一个黄色弧。

Circles(arcs)中的一些代码(它继承自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;
}

来自ball的一些代码(来自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;
    }
}

我可能知道错误在哪里:在Circle :: shape()中,路径是一个椭圆,但它应该是一个弧形。我怎么能做这样的道路:

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

1 个答案:

答案 0 :(得分: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));

我无法查看图片,所以我猜这里。只要确保你没有计算出比真正需要的更大的弧形边界框。