Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Sozary le Septembre 12, 2017, 10:48:26 am

Titre: Transformations non appliquées
Posté par: Sozary le Septembre 12, 2017, 10:48:26 am
Bonjour.
Je sais que au vu du nom du topic, vous allez me dire que cela a déjà été traité maintes et maintes fois, mais voilà, avec moi ça marche pas  >:(

Voici ma configuration:
J'ai une classe Car contenant des Catpors. Ces captors sont hérités des classes Drawable et Transformable.
Donc tout va pour le mieux, je fais des rotations à mes capteurs, toujours OK.

Seulement, j'ai voulu détecter la collision entre un des ces capteurs et un RectangleShape.

Du coup, j'ai du aller dans ma class Captor afin de créer une fonction pour gérer les collisions.
Dans celle-ci, j'y ai mis en gros:

if(captor.getGlobalBounds().intersect(obstacle.getGlobalBounds())){
cout<<"An obstacle hits a captor"<<endl;"
}

Je me suis apperçu que celà ne marchait pas vis à vis des transformations que j'avais appliqué à mon capteur.

Je teste donc:

if(captor.getTransform().transformRect(captor.getGlobalBounds()).intersect(obstacle.getGlobalBounds())){
cout<<"An obstacle hits a captor"<<endl;"
}

Comme j'ai vu sur de nombreux topics, pour affecter à mon capteur les transformations, mais celà ne marche toujours pas. Enfin plutôt, ça détecte des collisions, mais plus loin!  :-[

Merci pour toute aide que vous pourrez me fournir!

P-S: Mon captor est un CircleShape dans le code que je vous ai donné.
Titre: Re: Transformations non appliquées
Posté par: Laurent le Septembre 12, 2017, 11:09:16 am
Il manque une chose importante pour pouvoir t'aider : la fonction qui dessine les "captors" (dans Car et dans Captor).

PS : "captor" signifie "ravisseur" en anglais, si tu veux parler de capteurs, alors la traduction est "sensors".
Titre: Re: Transformations non appliquées
Posté par: Sozary le Septembre 12, 2017, 11:42:54 am
Tout d'abord merci pour votre réponse rapide.

Citer
PS : "captor" signifie "ravisseur" en anglais, si tu veux parler de capteurs, alors la traduction est "sensors".
:-[

Car.cpp:
void Car::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
        states.transform *= getTransform();

        target.draw(m_shape, states);// the car's shape
        for (int i = 0; i < 5; ++i)
                target.draw(*m_sensors[i],states);

}

Sensor.cpp:
void Sensor::draw(sf::RenderTarget & target, sf::RenderStates states) const
{
        states.transform *= getTransform();

        target.draw(m_target, states); // the range of the sensor

        target.draw(m_shape, states); // the sensor

}
 
Titre: Re: Transformations non appliquées
Posté par: Laurent le Septembre 12, 2017, 11:47:16 am
Problème classique : lorsque tu dessines ton capteur, tu fais intervenir une transformation tierce (celle de l'instance de Car parent, héritée via les RenderStates), que tu ignores lorsque tu fais tes calculs de collision. Il faut la prendre en compte pour que tes collisions soient synchro avec ton affichage.
Titre: Re: Transformations non appliquées
Posté par: Sozary le Septembre 12, 2017, 11:58:15 am
Hum je vois ce que tu veux dire.
Donc dans ma fonction de collision (qui est dans captor sensor), je dois prendre en paramètre le sf::Transform de ma voiture, c'est ça ?
Titre: Re: Transformations non appliquées
Posté par: Laurent le Septembre 12, 2017, 12:27:02 pm
Par exemple, oui.
Titre: Re: Transformations non appliquées
Posté par: Sozary le Septembre 12, 2017, 12:39:20 pm
Très bien je verrais ça
Merci de ton aide!