2017-10-17 8 views
0

Bonjour, je suis nouveau sur C++ SFML. Je voudrais demander comment je vais faire un cadre de délimitation sur une boîte en rotation. La façon dont je l'ai fait était de créer un autre rectangle transparent mais avec des contours et de l'obtenir dans getGlobalBounds du rectangle tournant, mais ce n'est pas tout à fait correct car j'utilise setSize pour faire croître le bounding box, ce qui signifie La partie supérieure et gauche de la boîte ne se redimensionne pas. Je me sens comme s'il me manque quelque chose ici Voici mon code:Comment faire pour rendre une boîte de délimitation sur une boîte en rotation

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

Voici une idée, vous pouvez obtenir la position des coins de la boîte en rotation, ou le calculer? si vous le pouvez, vous pouvez calculer la position de la boîte englobante avec eux, mais l'affectation doit être faite dans les deux éléments "en même temps" ou vous verrez toujours un retard dans le mouvement de l'un d'entre eux ... –

+0

sry Im un peu d'un noob mais comment cela pourrait-il être fait s'il y avait un moyen d'obtenir les coins tout en tournant –

+0

Ce que je voulais dire, d'une manière très claire était que vous avez besoin de les mettre à jour en même temps, désolé je le fais plus compliqué que nécessaire. –

Répondre

2

Je l'ai enfin mis au travail. Voici ce que je l'ai fait:

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