Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [RESOLU] Problème avec les sf::VertexArray (primitive sf::Lines)  (Lu 1598 fois)

0 Membres et 2 Invités sur ce sujet

frcs6

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
[RESOLU] Problème avec les sf::VertexArray (primitive sf::Lines)
« le: Septembre 25, 2013, 10:23:48 pm »
Bonjour,

J'essai d'afficher les polygones représentant la zone de collision d'une entité.
Pour ce faire, j'utilise un sf::VertextArray, avec la primitive sf::Lines.

Sur un polygones simple, un carré, je n'arrive pas a afficher un carré correct.
Tous les vertex ne s'affiche pas à la bonne position.
Est-ce que j'ai écris qqch de travers ?

Merci.

Francis.

Voici un exemple de code source :

#include "Game.h"

#include <sstream>
#include <SFML/Window.hpp>
#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/Text.hpp>

Game::Game(void) :
        fps(0),
        max(0)
{
}

Game::~Game(void)
{
}

void Game::Run()
{
        sf::VertexArray vertices(sf::Lines,8);
        vertices[0].position = sf::Vector2f(100, 100);
        vertices[1].position = sf::Vector2f(340, 100);

        vertices[2].position = sf::Vector2f(340, 100);
        vertices[3].position = sf::Vector2f(340, 340);

        vertices[4].position = sf::Vector2f(340, 340);
        vertices[5].position = sf::Vector2f(100, 340);

        vertices[6].position = sf::Vector2f(100, 340);
        vertices[7].position = sf::Vector2f(100, 100);

        sf::ContextSettings contextSettings;
        contextSettings.depthBits = 32;
        sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window with OpenGL", sf::Style::Close, contextSettings);

        sf::Font font;
        font.loadFromFile("c:/windows/fonts/arial.ttf");

        sf::Text info;
        info.setFont(font);
        info.setCharacterSize(12);
        info.setColor(sf::Color::Yellow);

        fps = 0;
        max = 0;
        sf::Clock clock;

        int fpsCount = 0;
        while (window.isOpen())
        {
                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                window.close();
                }

                fpsCount++;
                if(clock.getElapsedTime().asMilliseconds() >= 1000)
                {
                        fps = fpsCount;
                        if(fps > max) max = fps;
                        clock.restart();
                        fpsCount = 0;
                }

                window.clear();
                std::stringstream stream;
                stream << fps;
                stream << " Fps - ";
                stream << max;
                stream << " Max";
                info.setString(stream.str());
                window.draw(info);
        window.draw(vertices);
                window.display();
        }
}
« Modifié: Septembre 26, 2013, 09:34:05 pm par frcs6 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème avec les sf::VertexArray (primitive sf::Lines)
« Réponse #1 le: Septembre 25, 2013, 10:31:30 pm »
Là tu as presque un code complet minimal directement testable. La prochaine fois pense à le nettoyer, ça me fera gagner 10 précieuses minutes (et à tous les autres qui voudraient aussi t'aider) ;)

Après nettoyage de tout ce qui est sans rapport avec le problème, et en le rendant compilable en l'état :

#include <SFML/Graphics.hpp>

int main()
{
    sf::VertexArray vertices(sf::Lines, 8);
    vertices[0].position = sf::Vector2f(100, 100);
    vertices[1].position = sf::Vector2f(340, 100);

    vertices[2].position = sf::Vector2f(340, 100);
    vertices[3].position = sf::Vector2f(340, 340);

    vertices[4].position = sf::Vector2f(340, 340);
    vertices[5].position = sf::Vector2f(100, 340);

    vertices[6].position = sf::Vector2f(100, 340);
    vertices[7].position = sf::Vector2f(100, 100);

    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(vertices);
        window.display();
    }
}
 

Ca fonctionne impeccablement pour moi.
Laurent Gomila - SFML developer

frcs6

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Problème avec les sf::VertexArray (primitive sf::Lines)
« Réponse #2 le: Septembre 26, 2013, 10:49:35 am »
Merci pour la réponse (désolé pour le code source non nettoyé, je m'appliquerai plus la prochaine fois).

Dans le doute, j'ai refais le test.

Dans ma fenêtre, lorsque le carré s'affiche, je constate que le coin en bas à gauche n'est pas correctement fermé, il manque un pixel.
Le rectangle fait 241 pixel par 241.
Et le dernier vertex est placé à 99 pixel du bord de la fenêtre au lieu de 100.
Le premier vertex est bien à 100 pixel du bord de la fenêtre.

Si j'utilise un RectangleShape, j'obtiens un carré parfait

Ci-joint une impression d'écran.

PS : Au passage, SFML est une librairie génial, je joue principalement avec la version .Net, et j'arrive à faire ce que je veux très facilement.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème avec les sf::VertexArray (primitive sf::Lines)
« Réponse #3 le: Septembre 26, 2013, 07:36:40 pm »
Les lignes ont une épaisseur de 1 pixel, et la coordonnée que tu donnes est la médiane de la ligne (i.e. elle s'étale de 0.5 pixel de part et d'autre de la coordonnée que tu donnes).

Donc... pour que ta ligne occupe une ligne précise, par exemple la colonne à x = 100 pixels, il faut utiliser comme coordonnées 100.5 et non 100 en x.
Laurent Gomila - SFML developer

frcs6

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Problème avec les sf::VertexArray (primitive sf::Lines)
« Réponse #4 le: Septembre 26, 2013, 09:33:51 pm »
Super.

Merci pour la précision, je n'avais pas fais attention à ce détail.

Mes collisions s'affichent parfaitement.