2014-12-03 65 views
3

我想爲我的第一個SFML項目編寫一個非常基礎的遊戲。它的機器人有一個鉸接的手臂,只能用手彈出氣球。我遇到的問題是,當檢查鉗形精靈是否與氣球精靈相交時,無論氣球或機器人鉗子的位置如何,它都會始終返回真。我正在使用變換來放置機器人手臂的各個部分,這就是我想的問題,但我不知道爲什麼。我曾嘗試在單獨的程序中使用包圍盒碰撞,其中未使用變換,並且工作完美。轉換和檢測代碼如下。如果有人能夠向我解釋這一點,我將不勝感激。我是SFML全新的,因此對我的無知在此表示歉意!SFML包圍盒碰撞檢測

sf::Transform trBody; 
    trBody.translate(sBodyPos); 
    ///////////////////////////////////////////////// 

    sf::Transform trArm1; 
    trArm1.translate(sArm1Pos); 

    sf::Transform rotArm1; 
    rotArm1.rotate(sArm1Rot); 

    sf::Transform TR1 = trBody*trArm1*rotArm1; 
    ///////////////////////////////////////////////// 

    sf::Transform trArm2; 
    trArm2.translate(sArm2Pos); 

    sf::Transform rotArm2; 
    rotArm2.rotate(sArm2Rot); 

    sf::Transform TR2 = TR1*trArm2*rotArm2; 
    ///////////////////////////////////////////////// 

    sf::Transform trPincer1; 
    trPincer1.translate(sPincer1Pos); 

    sf::Transform TR3 = TR2*trPincer1; 
    ///////////////////////////////////////////////// 

    sf::Transform trPincer2; 
    trPincer2.translate(sPincer2Pos); 

    sf::Transform TR4 = TR2*trPincer2; 
    ///////////////////////////////////////////////// 
    sf::Transform trBalloon1; 
    trBalloon1.translate(sBalloon1Pos); 

    if (sPincer1.getGlobalBounds().intersects(sBalloon1.getGlobalBounds())){ 

     cout << "Bang" << endl; 
     ballOneHit = true; 

    } 

    // Clear screen 
    app.clear(); 
    app.draw(sArm2, TR2); 
    app.draw(sPincer1, TR3); 
    app.draw(sPincer2, TR4); 
    app.draw(sArm1, TR1); 
    app.draw(sBody, trBody); 

    if (ballOneHit == false){ 

     app.draw(sBalloon1, trBalloon1); 

    } 

    // Update the window 
    app.display(); 

回答

4

Hazarding猜測,我會說對象的旋轉是罪魁禍首,因爲旋轉具有擴大的對象的範圍的不良後果。旋轉後的邊界矩形仍然位於由屏幕確定的x-y平面中,但包含旋轉後的對象。作爲例證,放眼全球邊框上的文本在這張照片:

bounding box rotation

注意,箱包圍的對象,但是,這不是你所期望得到的原始邊框的旋轉版本。用the tutorial on graphics transforms表示:

SFML實體可以給你它們的邊界框。邊界框是包含實體的最小矩形,其邊在X和Y軸上對齊。

要解決此問題,您可以嘗試創建一個矩形,該矩形將始終完全包含在對象的可見部分內,然後將其用於命中檢測而不是對象的邊界框。

+0

作爲一個實驗,我創建了一個單獨的程序,其中我使用setPosition()定位了一個氣球,並使用transform將另一個氣球放置到位。結果是邊界框停留在0,0處,以便被轉換的氣球。在這種情況下發生碰撞時,我必須將setPosition()定位的氣球移動到其他氣球在屏幕上的位置,而不是它從0,0轉換到的位置。非常沮喪! – 2014-12-03 21:45:56

+0

@RobEatsEverythingDelaney通常你應該堅持使用'sf :: Transformable'類在處理對象轉換時提供的函數 - 從長遠來看,它更加乾淨!請記住,實現'sf :: Transformable'和'sf :: Drawable'(例如'sf :: Sprite')的類將跟蹤由'sf :: Transformable'中的函數創建的變換,並且不需要指定一個(你可以只是'window.draw(sprite);' – Conduit 2014-12-03 21:50:40

+0

*內置類實現'sf :: Transformable'和'sf :: Drawable' – Conduit 2014-12-03 21:56:11