-
Salut tout le monde ! :D
Je me suis mis tranquillement au C++ et la sfml et je fais un petit rpg rapido pour me faire la main, et là je bloque au niveau de la collision et des thread :o
en gros je voudrais dédier un thread pour la collision pour tout le jeu, ce qui allégerais le programme en gros, sauf que lorsque je tape ce qu'il faut pour la collision il veut que je crée la classe avant ._. sachant qu'elle est créer dans le main
void detectionThread()
{
if (joueur.getCollision().intersects(monstreDebug.getCollision()))
{
cout << "collision" << endl;
}
}
Après moulte recherche je n'ai pas trouvé :'(
Donc j'ai tous foutus dans le main et ça marche mais je voudrais bien savoir sur quoi je butes siouplé :)
-
lorsque je tape ce qu'il faut pour la collision il veut que je crée la classe avant
Avec une description de ton problème aussi précise, on va bien pouvoir t'aider... ;D
-
Broaf désoler j'étais un peu dans les vapes en tapant ça ^^"
En gros dans le main thread je "déclare/crée" tranquillement mes classes et je lance mon thread juste après pour la détection des collisions.
Sauf que lorsque je tape du code dans le thread de collision il veut pas que j'accède au attribut de celui-ci il veut que je déclare dans le thread de la collision les classes pour les utiliser
j'arrives pas à mettre ça
void detectionThread()
{
if (joueur.getCollision().intersects(monstreDebug.getCollision()))
{
cout << "collision" << endl;
}
}
il voudrait en gros :
joueur joueur(window.getSize().x, window.getSize().y);
MonstreDebug monstreDebug(window.getSize().x, window.getSize().y);
if (joueur.getCollision().intersects(monstreDebug.getCollision()))
{
cout << "collision" << endl;
}
sauf que window est pas définie dans le second thread il voudrait que je redéclare etc..
j'arrive a accéder a aucune variable du thread principal alors que lorsque je regarde la doc (http://www.sfml-dev.org/tutorials/2.3/system-thread-fr.php ça évite de vous recherchez le lien :p) "Tous les threads d'un programme partagent la même mémoire, ils peuvent accéder à toutes les variables du programme. C'est très pratique mais aussi dangereux [...]"
je comprend plus :'(
-
Ton thread est une fonction, et comme n'importe quelle fonction, elle n'a accès au'aux variables globales et aux variables locales à celle-ci. Le fait que tout ceci tourne dans un thread n'y change rien. En gros, si tu appelais detectionThread() directement, sans passer par un thread, tu aurais exactement la même erreur.
Ce que veut dire le tutoriel c'est que les threads partagent le même espace mémoire (au niveau de l'OS), pas que les règles de portée du C++ sont gentiment violées ;)
Si tu veux utiliser des variables déclarées ailleurs il faudra trouver un moyen de les passer à ta fonction threadée.
-
Ouai ! J'avais remarquer que cela marchait comme une fonction et j'avais essayer de passer ne paramètre la box de collision un peu comme l'exemple de la doc
void func(int x)
{
}
sf::Thread thread(&func, 5);
donc ce qui me donnait ça pour mes deux box de collisions
sf::Thread thread(&detectionThread, sf::FloatRect collisionMonstre);
//Lancement du thread de détection
thread.launch(monstreDebug.getCollision());
sauf qu'il n'accepte pas ce paramètre alors que pour la création de classe il accepte bien pour une méthode un truc de ce style
sf::FloatRect getCollision();
j'ai peur de ne pas être assez clair et je suis assez perdu dessus tu aurais des pistes (pas le code direct juste des piste) ? :D. (bien que ça ne me bloque pas vu que je fous les détections dans le main mais bon je voudrais bien test de mettre ça dans le thread)
et merci déjà pour tes réponses rapide Laurent :D
-
Si j'étais toi j'oublierais cette histoire de thread. Ca te complique immensément la vie, pour pas grand chose comme gain. Si tu veux vraiment découpler collisions et affichage, il y a d'autres techniques plus adaptées (Google devrait pouvoir t'aider).
Maintenant en ce qui concerne ce problème de passer des paramètres au point d'entrée du thread, compare bien l'exemple de la doc et ton code... ils n'ont rien à voir, en gros tu as écris n'importe quoi ;) En plus ça ne marchera pas, il faudrait passer les entités à la fonction, pas leur rectangle de collision, car celui-ci va (j'imagine) évoluer au cours du temps.