2016-11-30 88 views
0

我們項目的主題是製作一個模擬Fusion的程序。將複數形式綁定到矩形?

我們遇到了與我們類別融合相撞的問題。我們想爲我們的碰撞做一個複雜的形狀。

printScreenFusionProgramm

我們的形狀接近彼此的兩個圈,我們不希望有一個邊界矩形,但塑造的「複雜」 ......

這是我們的融合類

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)); 
} 

回答

0

您需要重新實現圖形項目的「形狀」方法以返回對象的實際形狀。你可以在QPainterPath中返回你想要的任何形狀,Qt將使用它來進行碰撞檢測。

+0

嗨,謝謝你的幫助!但有了這個,我們是一個屏幕截圖 - > [bugScreen](http://i.imgur.com/P5ib3lL.png)。 Idk如果因爲shape()...對這個bug有任何想法嗎? –

+0

圖片表明您的boundingRect或形狀函數不準確,或者在影響這些方法的結果的某些操作之前未能調用prepareGeometryChange。當發生這種情況時,您會看到繪製工件,因爲舊區域未被正確清除。 – goug