2016-11-30 3 views
0

Das Thema unseres Projekts ist die Erstellung eines Programms, das eine Fusion simuliert.Begrenzt rect zur komplexen Form?

Wir haben ein Problem mit der Kollision mit unserer Klasse Fusion. Wir wollen eine komplexe Form für unsere Kollision machen.

printScreenFusionProgramm

Unsere Form ist zwei Kreis nahe beieinander, und wir wollen nicht eine begrenzende rect haben, aber „komplexe“ Form ...

dies unsere Fusion-Klasse ist

Fusion::Fusion(int x, int y) 
{ 
this->setPos(x, y); 
} 

void Fusion::shape(){ 
//... 
} 

void Fusion::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
    { 

    //set the color 
    QBrush brushColor(QColor(Qt::blue)); 
    painter->setBrush(brushColor); 
    painter->setPen(QColor(Qt::blue)); 
    painter->drawEllipse(0,0,40,40); 
    painter->drawEllipse(-20,-20,40,40); 
    } 

    void Fusion::doCollision() 
    { 
    // get a new position 

    // change the angle with randomness 
    if(qrand() %1) 
    { 
     setRotation(rotation() + (180 + (qrand() % 10))); 
    } 
    else 
    { 
     setRotation(rotation() + (180 + (qrand() % -10))); 
    } 

    // check if the new position is in bounds 
    QPointF newPoint = mapToParent(-(boundingRect().width()), -(boundingRect().width() + 2)); 

    if(!scene()->sceneRect().contains((newPoint))) 
    { 
     // move back in bounds 
     newPoint = mapToParent(0,0); 
    } 
    else 
    { 
     // set the new position 
     setPos(newPoint); 
    } 
} 

void Fusion::advance(int step) 
{ 
    if(!step) return; 

    if(!scene()->collidingItems(this).isEmpty()) 
    { 
    doCollision(); 
    } 

setPos(mapToParent(0, -1)); 
} 

Antwort

0

Sie müssen die "Form" -Methode für Ihre Grafikelemente neu implementieren, um die tatsächliche Form Ihres Objekts zurückzugeben. Sie können eine beliebige Form in einem QPainterPath zurückgeben, und Qt wird diese für die Kollisionserkennung verwenden.

+0

Hallo, vielen Dank für Ihre Hilfe !!! Aber damit sind wir ein Screenbug-Look -> [Bugscreen] (http://i.imgur.com/P5ib3lL.png). Idk wenn es weil die Form() ... eine Idee für diesen Fehler haben? –

+0

Das Bild zeigt an, dass entweder Ihre boundingRect- oder Ihre Shape-Funktion nicht korrekt ist oder Sie prepareGeometryChange vor einigen Vorgängen, die sich auf die Ergebnisse dieser Methoden auswirken, nicht aufrufen konnten. Wenn das passiert, sehen Sie Zeichenartefakte, weil die alte Region nicht richtig gelöscht wird. – goug