0
Screenでは、黄色のボールが黄色の円弧に近づき、衝突します。各円弧(黒、緑、黄色は円弧 - 異なるオブジェクト)です。ボールが黄色の弧に当たったときの衝突検出は、黄色の弧が1つしかない場合でも、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);
私は形状も持っているので、バウンディングボックスは大丈夫です。ボールが円弧に当たったら、pos = pos = 1280,540(画面の中央)を持つ3つの円弧を打つ。 –