2016-05-03 14 views
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); 

答えて

1

円のバウンディングボックスの計算は本当にできますか?

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

私は画像を表示することができませんので、私はここに推測しています:

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

はそれがあるべきように。実際に必要なものよりも大きい円弧の境界ボックスを計算していないことを確認してください。

+0

私は形状も持っているので、バウンディングボックスは大丈夫です。ボールが円弧に当たったら、pos = pos = 1280,540(画面の中央)を持つ3つの円弧を打つ。 –