2017-10-17 64 views
0

Hello Im C++ SFML新增功能。我想问一下如何在旋转的盒子上渲染边界框。我这样做的方式是制作另一个透明的矩形,但带轮廓,并将它移动到旋转矩形的GlobalBounds中,但它不能正确渲染,因为我一直在使用setSize来使边界框增长,这意味着框的左上部分不会调整大小。我觉得我在这里失去了一些东西,所以这里是我的代码:如何渲染旋转框上的边界框

sf::RectangleShape Rect[RECT]; 
sf::RectangleShape AABB[RECT]; 
Rect[0].setSize(sf::Vector2f(50.0f, 50.0f)); 
Rect[1].setSize(sf::Vector2f(50.0f, 100.0f)); 
Rect[2].setSize(sf::Vector2f(60.0f, 80.0f)); 
Rect[3].setSize(sf::Vector2f(100.0f, 60.0f)); 
Rect[4].setSize(sf::Vector2f(30.0f, 250.0f)); 

AABB[0].setSize(sf::Vector2f(50.0f, 50.0f)); 
AABB[1].setSize(sf::Vector2f(50.0f, 100.0f)); 
AABB[2].setSize(sf::Vector2f(60.0f, 80.0f)); 
AABB[3].setSize(sf::Vector2f(100.0f, 60.0f)); 
AABB[4].setSize(sf::Vector2f(30.0f, 250.0f)); 

for (int x = 0; x < RECT; x++) 
{ 
    //Starting Position 
    Rect[x].setOrigin(Rect[x].getSize().x/2, Rect[x].getSize().y/2); 
    AABB[x].setOrigin(AABB[x].getSize().x/2, AABB[x].getSize().y/2); 
    xpos += 150; 
    Rect[x].setPosition(xpos, ypos); 
    AABB[x].setPosition(xpos, ypos); 
    colcount++; 
    if (colcount == 3) 
    { 
     xpos = 0; 
     ypos += 200; 
     colcount = 0; 
    } 

    Rect[x].setFillColor(sf::Color::Red); 
    AABB[x].setFillColor(sf::Color::Transparent); 
    AABB[x].setOutlineThickness(1); 
} 

while (window.isOpen()) 
{ 

    window.clear(sf::Color::Black); 
    //Drawing Shapes 
    for (int x = 0; x < RECT; x++) 
    { 
     window.draw(Rect[x]); 
     window.draw(AABB[x]); 
    } 

     Rect[0].rotate(90 * 3.14/180); 
     Rect[1].rotate(45 * 3.14/180); 
     Rect[2].rotate(10 * 3.14/180); 
     Rect[3].rotate(180 * 3.14/180); 
     Rect[4].rotate(22.5); 

    for (int i = 0; i < RECT; i++) 
    { 
     MinPoint[i].x = Rect[i].getPosition().x - (Rect[i].getSize().x/2); 
     MaxPoint[i].x = Rect[i].getPosition().x + (Rect[i].getSize().x/2); 
     MinPoint[i].y = Rect[i].getPosition().y - (Rect[i].getSize().y/2); 
     MaxPoint[i].y = Rect[i].getPosition().y + (Rect[i].getSize().y/2); 
     AABB[i].setSize(sf::Vector2f(Rect[i].getGlobalBounds().width, Rect[i].getGlobalBounds().height)); 
    } 
+0

这是一个想法,你可以得到旋转盒角落的位置,或计算它?如果可以的话,你可以用它们来计算边界框的位置,但是应该在“同一时间”这两个元素中完成分配,否则你总会看到其中一个元素的移动有一些延迟... –

+0

sry即时通讯有点noob,但如何能做到这一点,如果有一种方法来旋转的角落 –

+0

我的意思是,在一个非常不清楚的方式是,你需要同时更新它们,对不起,我做到了比它需要的更复杂。 –

回答

2

我终于得到它的工作。这是我做的:

sf::RectangleShape Rect[RECT]; 
sf::RectangleShape AABB[RECT]; 
Rect[0].setSize(sf::Vector2f(50.0f, 50.0f)); 
Rect[1].setSize(sf::Vector2f(50.0f, 100.0f)); 
Rect[2].setSize(sf::Vector2f(60.0f, 80.0f)); 
Rect[3].setSize(sf::Vector2f(100.0f, 60.0f)); 
Rect[4].setSize(sf::Vector2f(30.0f, 250.0f)); 

for (int x = 0; x < RECT; x++) 
{ 
    //Starting Position 
    Rect[x].setOrigin(Rect[x].getSize().x/2, Rect[x].getSize().y/2); 
    AABB[x].setOrigin(AABB[x].getSize().x/2, AABB[x].getSize().y/2); 
    xpos += 150; 
    Rect[x].setPosition(xpos, ypos); 
    AABB[x].setSize(sf::Vector2f(Rect[x].getGlobalBounds().width, Rect[x].getGlobalBounds().height)); 
    AABB[x].setPosition(Rect[x].getPosition().x, Rect[x].getPosition().y); 
    colcount++; 
    if (colcount == 3) 
    { 
     xpos = 0; 
     ypos += 200; 
     colcount = 0; 
    } 

    Rect[x].setFillColor(sf::Color::Red); 
    AABB[x].setFillColor(sf::Color::Transparent); 
    AABB[x].setOutlineThickness(1); 
    AABB[x].setOutlineColor(sf::Color::White); 
} 

while (window.isOpen()) 
{ 

    window.clear(sf::Color::Black); 
    //Drawing Shapes 
    for (int x = 0; x < RECT; x++) 
    { 
     window.draw(Rect[x]); 
     window.draw(AABB[x]); 
    } 

    //Rotation 
    Rect[0].rotate(1); 
    Rect[1].rotate(45); 
    Rect[2].rotate(11.25); 
    Rect[3].rotate(5.625); 
    Rect[4].rotate(22.5); 

    for (int i = 0; i < RECT; i++) 
    { 
     MinPoint[i].x = AABB[i].getPosition().x - (AABB[i].getSize().x/2); 
     MaxPoint[i].x = AABB[i].getPosition().x + (AABB[i].getSize().x/2); 
     MinPoint[i].y = AABB[i].getPosition().y - (AABB[i].getSize().y/2); 
     MaxPoint[i].y = AABB[i].getPosition().y + (AABB[i].getSize().y/2); 

     AABB[i].setOrigin(AABB[i].getSize().x/2, AABB[i].getSize().y/2); 
     AABB[i].setSize(sf::Vector2f(Rect[i].getGlobalBounds().width, Rect[i].getGlobalBounds().height)); 
     AABB[i].setPosition(Rect[i].getPosition().x, Rect[i].getPosition().y); 
    }