Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - MrMahus

Pages: [1]
1
Graphique / Re: Problème de Bounding Box
« le: Août 23, 2017, 10:22:25 am »
Merci pour tes infos Laurent, mais je n'aime pas vraiment recopié bêtement du code qui fait peut être le café depuis des années, mais qui n'a pas été écris par moi même. J'essaye de comprendre et d'apprendre donc si il faut réinventer LA roue pour MON code , je préfère le faire plutôt que piocher les idées des autres.

Mais à titre informatif j'irais lire avec plaisir comment font les autres, merci :)

2
Graphique / Re: Problème de Bounding Box
« le: Août 23, 2017, 09:12:10 am »
Biensur que je peux montrer ça , voilà comment j'ai procédé :

J'ai une fonction qui n'est appelée qu'une seule fois et qui me permet de dessiner ma " scène " :


int xCursor = 0;
int yCursor = 0;
bool terminated = false;
int time = 0;

while (terminated == false) {

    ConvexShape shape;
    shape.setPointCount(4);

    shape.setPoint(0, Vector2f(0, 16));
    shape.setPoint(1, Vector2f(32, 0));
    shape.setPoint(2, Vector2f(63, 16));
    shape.setPoint(3, Vector2f(32, 32));

    shape.setFillColor(Color::Transparent);
    shape.setOutlineThickness(1);
    shape.setOutlineColor(Color::White);

    shape.setPosition(Vector2f(xCursor, yCursor));

    tabConvex.push_back(shape);
    arrayCollision.push_back(false);
    xCursor += 63;

    if (xCursor >= 756) {
        int rest = time % 2;

        if (rest == 0) {
            yCursor += 17;
            xCursor = 32;
            time++;
        }
        else if (rest != 0) {
            xCursor = 0;
            yCursor += 17;
            time++;
        }
    }

    if (time == 34) {
        terminated = true;
    }
}

 

Puis à chaque tour de boucle j’appelle cette fonction qui me permet de mettre la case que je survole en "surbrillance", la premiere boucle for me permet simplement de remettre à zéro la "surbrillance" :


int mouseX = (int)sf::Mouse::getPosition(p_window).x;
int mouseY = (int)sf::Mouse::getPosition(p_window).y;

for (int i = 0; i < tabConvex.size(); i++) {

    tabConvex[i].setFillColor(Color::Transparent);
}

for (int i = 0; i < tabConvex.size(); i++) {
    FloatRect boundBox = tabConvex[i].getGlobalBounds();

    if (boundBox.contains(mouseX, mouseY)) {
        tabConvex[i].setFillColor(Color::Red);
    }
}


 


Ne connaissant pas du tout la SFML il y a encore 3 semaines je me suis posé la question de si ces fameuses bounding box étaient du pixel-perfect collision .. Apparemment vous semblez m'indiquer que non et c'est ce que je craignais.
Je suppose qu'il vaudrait donc mieux reconsidérer les collisions OO ? Qui testerait des vecteurs entre deux points de mes formes  et par le calcul de déterminant on essaye de trouver si les coordonnées de la souris sont comprise dans le polygone ?

J'essaye de tous mettre à plat il faut donc, vous me corrigerez si je me trompe :

  • Récupérer le bon polygone à tester composé de 4 points ABCD, dans le vector où il est stocké
  • Supposons notre souris en M(X ; Y ) quelconque et notre polygone A( xA; yA ) , B(xB; yB ) , C(xC ; yC) et D(xD ; yD)
  • On va étudier les vecteur AB , BC , CD et DA par rapport au vecteur AM , BM  , CM , DM
    Avec comme exemple pour AB ---> T( xB - xA ; yB - yA ) et  AM ----> P( X - xA  ; Y - yA )
  • On a donc nos deux vecteur T et P , on calcul le déterminant des deux : d = (Tx * Py) - (Ty * Px )
    en fonction du résultat on aura un résultat r = 0 ou > 0 ou encore < à 0
  • Si r > 0 alors notre point sera bien vers l'intérieur du polygone, il ne reste plus qu'a tester la même chose avec les 3 autres vecteurs et si pour les 4 vecteur r > 0 les coordonnées de la souris seront toujours vers l'intéreur du polygone et donc bien à l'intérieur de la "case"
  • Une fois tout ça validé on peut donc déclencher la surbrillance de la case




Je vais essayer de coder ça et je le posterais histoire d'avoir vos retours :)

3
Graphique / Problème de Bounding Box
« le: Août 20, 2017, 07:17:32 pm »
Hello tout le monde :)

Je me suis mis à apprendre la SFML depuis quelque semaine, le fait est que je prend vraiment mon temps donc je ne suis pas très loin encore mais j'ai voulu afficher une grille isométrique et ensuite surligner la case sous laquelle est ma souris.

Pour se faire j'ai utilisé la fonction getGlobalBounds, je parcours mon tableau de ConvexShape en testant chaque case si les GlobalBounds de celle ci contiennent deux points : sourisX et sourisY .


Tout marche très bien mais seulement à certain endroit, en effet je vous laisse voir l'image jointe mais même si mon curseur est très bien placé à l'intérieur d'une seule case j'en ai pourtant 2 autres qui "pensent" contenir les coordonnées de ma souris.





Si quelqu'un saurait me dire pourquoi je suis preneur et je le remercie d'avance :)

Cordialement, un jeune apprentis en SFML :)

Pages: [1]