碰撞检测无法正常工作

Collision detection does not work properly

本文关键字:工作 常工作 碰撞检测      更新时间:2023-10-16

在屏幕上,黄色的球正在靠近黄色的弧线并击中它。每个弧线(黑色、绿色和黄色是弧线-不同的对象)。当球碰到黄色弧线时,碰撞检测显示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);

您确定要计算圆弧的边界框吗?

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));

我无法查看图像,所以我在这里猜测。只需确保您计算的弧的边界框不会比实际需要的更大。