在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);
答案 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));
我无法查看图片,所以我猜这里。只要确保你没有计算出比真正需要的更大的弧形边界框。