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

Auteur Sujet: [Résolul] sf::Rect inverse left et top  (Lu 2599 fois)

0 Membres et 1 Invité sur ce sujet

  • Invité
[Résolul] sf::Rect inverse left et top
« le: Août 24, 2015, 11:33:25 am »
Bonjour,

Je crois avoir trouvé un bug : sf::Rect utilise left comme coordonnée y et top comme coordonnée x.
Pour preuve, si je fais le code suivant (où target est un IntRect) :
if(target.contains(sf::Mouse::getPosition(window)))
{
    std::cout<<"Found it, GG !\n";
    return true;
}
else
    return false;
 
Et que la souris est dans le rectangle, la fonction renvoie false. Par contre si je fais :
sf::Vector2i mousePos(sf::Mouse::getPosition(window).y, sf::Mouse::getPosition(window).x); // on inverse x et y...
if(target.contains(mousePos))
{
    std::cout<<"Found it, GG !\n";
    return true;
}
else
    return false;
Le fonction renvoie true. Alors évidemment c'est contournable comme je viens de le faire mais c'est assez gênant quand même.

Dites-moi si c'est un vrai bug, si je suis le seul à l'avoir ou si je m'y prend juste mal ?
Sachant que j'utilise SFML 2.3.1, soit la dernière version.
« Modifié: Août 24, 2015, 03:28:27 pm par Glân de Brylan »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::Rect inverse left et top
« Réponse #1 le: Août 24, 2015, 11:52:40 am »
Non, je pense que c'est toi qui t'y prend mal. Le code est correct et personne n'a jamais soulevé un tel problème avant toi.

Fournis un exemple avec un rectangle et un point ayant des coordonnées fixes, parce que là... on ne sait pas ce qu'est target, et ta souris pourrait être n'importe où. En clair ce n'est ni reproductible, ni vérifiable rapidement avec des calculs.
Laurent Gomila - SFML developer

Glân de Brylan

  • Invité
Re : sf::Rect inverse left et top
« Réponse #2 le: Août 24, 2015, 12:06:01 pm »
(click to show/hide)
(click to show/hide)

Le jeu tel qu'il est fonctionne.
Quand on lance le jeu, on a une fenêtre qui indique "Appuyez sur ESPACE pour commencer une nouvelle partie" (ce à quoi correspond Lang::L_pressSPACE situé dans Lang.h).
On appuie sur la barre espace, le rectangle est placé quelque part aléatoirement et le timer se lance. En haut à droite on a un disque qui tend vers le vert quand on s'approche du rectangle et vers le rouge quand on s'en éloigne (c'est un jeu de chaud ou froid en fait).
Quand on clique, soit le bout de la souris n'est pas dans le rectangle et le compte d'erreurs est incrémenté, soit elle y est et le timer s'arrête, le message "Appuyez sur ESPACE" est affiché et le disque reste vert pour indiquer qu'on l'a trouvé.
Sinon, si on appuie sur espace, le jeu s'arrête également, mais le disque devient un fondu de vert au rouge pour indiquer qu'on a abandonné.

Si vous voulez le projet complet il est téléchargeable ici :
https://www.mediafire.com/?umbkb9ndm1mi285
Pour l'instant il n'est pas fini, le jeu ne gère pas encore complètement le système de sauvegarde, mais c'est tout ce qui manque.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::Rect inverse left et top
« Réponse #3 le: Août 24, 2015, 02:09:30 pm »
Pas sûr qu'on ait besoin de tout le code de ton jeu pour tester une simple fonction comme ça... Quelques coordonnées bien choisies et 3 lignes de code auraient suffi. Quand tu as un doute sur une fonction aussi simple, teste la hors contexte, avec un cas d'utilisation simple. Ca te permet de voir tout de suite si c'est la fonction ou bien ton utilisation de celle-ci qui contient un bug.

Bref. Comme l'erreur saute aux yeux, la voici :
target.top = rand() % x;
target.left = ( rand() % y ) + 53;
... c'est là que tu as inversé les coordonnées.
Laurent Gomila - SFML developer

Glân de Brylan

  • Invité
Re : sf::Rect inverse left et top
« Réponse #4 le: Août 24, 2015, 03:28:13 pm »
Wow. Je sais pas quand j'ai écrit ça mais je devais être crevé.

Mea culpa.