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

Auteur Sujet: sf::RectangleShape::getGlobalBound, bug ou incompréhension?  (Lu 7719 fois)

0 Membres et 1 Invité sur ce sujet

lepiaff

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
    • E-mail
Salut :).

Voilà j'ai un petit soucis et je me demande si je passe à côté de quelque chose ou si il y a un petit bug dans le module graphique.

Voici mon code :

classe entity :
protected:
    sf::RectangleShape m_boundingRect;
    sf::Rect<float> m_rect;
...
...
sf::Rect<float>* Map_entity::getBoundingRect()
{
    return &(m_boundingRect.getGlobalBounds());
}
 

classe map:
...
if(m_entity->getBoundingRect()->contains(static_cast<sf::Vector2<float> >(clic)))
...

Cela ne fonctionne pas! J'ai un comportement aléatoire.

Par contre si je remplace ma méthode getBoundingRect par :

sf::Rect<float>* Map_entity::getBoundingRect()
{
    m_rect = m_boundingRect.getGlobalBounds();

    return &m_rect;
}

 

Alors j'ai le comportement souhaité...

Une petite idée?

Merci les gens ;)
« Modifié: Mai 06, 2013, 02:05:23 am par lepiaff »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::RectangleShape::getGlobalBound, bug ou incompréhension?
« Réponse #1 le: Mai 06, 2013, 07:56:58 am »
getGlobalBounds() renvoie par valeur, donc si tu ne stockes pas le résultat, il est détruit immédiatement (ça s'appelle une variable temporaire non nommée). Or toi tu prends son adresse... adresse qui ne pointe plus vers quoi que ce soit de valide après que ta fonction getBoundingRect se soit terminée.

Tu n'as pas besoin de pointeur ici, renvoie juste le rectangle par valeur.
Laurent Gomila - SFML developer

lepiaff

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
    • E-mail
Re : sf::RectangleShape::getGlobalBound, bug ou incompréhension?
« Réponse #2 le: Mai 06, 2013, 10:04:00 am »
Erf, je m'en doutais...

J'ai essayé de vérifier dans les sources mais je suis un peu trop noob. Je m'y suis perdu.
D'ailleurs, je n'ai pas trouvé l'implémentation de la classe sf::rect, elle est où?

Merci beaucoup, je peux effacer un attribut inutile maintenant lol.
« Modifié: Mai 06, 2013, 10:14:14 am par lepiaff »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::RectangleShape::getGlobalBound, bug ou incompréhension?
« Réponse #3 le: Mai 06, 2013, 10:07:14 am »
Citer
D'ailleurs, je n'ai pas trouvé l'implémentation de la classe sf::rect, elle est où?
include/Graphics/Rect.inl (tout est inliné donc ce n'est pas dans un .cpp)
Laurent Gomila - SFML developer

lepiaff

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
    • E-mail
Re : sf::RectangleShape::getGlobalBound, bug ou incompréhension?
« Réponse #4 le: Mai 06, 2013, 10:15:44 am »
Ok merci, je connaissais pas cette extension, j'ai encore beaucoup à apprendre  ;D.


J'en profite pour te remercier du boulot que tu as déjà accomplis. Je m'éclate à coder le "moteur graphique"(si je peux appeler ça comme ça) de mon jeu que je réutilise sous Qt pour faire l'éditeur de map. Ça ce fait bien grâce à toi.

Juste dommage de ne pas pouvoir utiliser Qt 5 à cause d'un problème avec winid, en tout cas je n'ai pas réussi. A priori cela vient de la mise à jour Qt, tu penses qu'il y a quand même un moyen? Le type renvoyé par winid est différents dans la v5 si j'ai bien compris...
Comme je n'arrive pas à compiler Qt 4 pour la dernière version de mingw, je ne peux pas profiter du c++ new gen lol.
« Modifié: Mai 06, 2013, 10:28:38 am par lepiaff »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::RectangleShape::getGlobalBound, bug ou incompréhension?
« Réponse #5 le: Mai 06, 2013, 10:29:24 am »
Le problème de Qt 5 c'est qu'il change toute l'architecture interne de dessin. Il y a deux changements fondamentaux :

- le module QPA (Qt Platform Abstraction) fournit une couche uniforme entre l'API Qt et les fonctions spécifiques à chaque OS, mais du coup il abstrait l'accès aux fenêtres et aux surfaces de dessin

- le dessin utilise maintenant un scenegraph basé sur OpenGL 2, il n'y a normalement plus de widgets natifs autre que la fenêtre principale (QWindow)

Du coup il faut fouiller un peu, mais avec Google tu trouves plein de réponses qui ont l'air pertinentes. Avec "qt 5 wid" comme mots-clé on tombe directement sur stackoverflow, où plusieurs solutions sont données.

Après, n'ayant pas testé ça personnellement, je ne peux pas t'en dire plus.
Laurent Gomila - SFML developer