2016-05-03 11 views
0

Auf der Screen nähert sich gelbe Kugel dem gelben Bogen und trifft es. Jeder Bogen (schwarz, grün und gelb sind Bögen - verschiedene Objekte). Kollisionserkennung, wenn der Ball gelbe Bögen trifft, zeigt 3 Objekte - 3 Bögen, auch wenn er nur einen gelben Bogen trifft.Kollisionserkennung funktioniert nicht richtig

Code aus Kreisen (Bögen) (er erbt von QGraphicsItem). Die Breite ist eine Stiftbreite, also befindet sich die Kollision am äußeren Rand des Bogens.

Einige Code von Ball (es inheits von QGraphicsObject) und Kollisionserkennung in 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; 
    } 
} 

Ich weiß wohl, wo ist der Fehler: in Kreis :: Form() der Pfad eine Ellipse ist, aber es soll ein Bogen sein. Wie soll ich einen Pfad wie folgt erstellen:

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

Antwort

1

Sind Sie sich sicher über Ihre Bounding Box Berechnung für Bogen?

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

Kann sein, es sein sollte:

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

ich nicht imstande bin, um das Bild zu sehen, so dass ich bin zu raten, hier. Stellen Sie nur sicher, dass Sie die Begrenzungsbox des Bogens NICHT größer berechnen, als tatsächlich benötigt wird.

+0

Es hat nichts geändert, ich habe auch eine Form(), also ist die Bounding Box in Ordnung. Wenn der Ball den Bogen trifft, sagt er mir, dass er 3 Bögen trifft, nicht einen, alle mit pos = pos = 1280.540 (Bildmitte). –