Bonjour,
Je développe un jeu 2D avec un vaisseau qui lance une boule de feu quand le joueur clique sur le bouton gauche de la souris.
La solution de facilité est :
while (TANT QUE MA BOULE DE FEU N'ATTEINT PAS LE BORD DE L'ECRAN)
{
J'AFFICHE A LECRAN MA BOULE DE FEU
}
en faisait ça je rentre dans une boucle, le problème c'est que tant que ma boule de feu n'a pas finit ça trajectoire, tout le reste est paralysé ! ce qui est tout à fait normal en fait.
Je recherche une solution pour y remédier, voila ce à quoi j'ai pensé :
quand le joueur clique sur le bouton gauche de la souris, j'active un booleen à true, ensuite je fais un
if (monBooleen == true)
{
je fais avancer ma boule de feu de 1 pixel
j'affiche ma boule de feu à l'écran
if (ma boule de feu à atteint la fin de l'écran)
{
monBooleen = false;
}
}
cependant en faisait ça, ma boule de feu ne s'affiche jamais, je ne vois pas ou est le problème ?
Il y a peut-être un algorithme spécifique à adopter pour ce problème ?
Merci d'avance, @+
non, il n'y a pas de problème évident avec cette méthode. Tu a du faire une erreur en l'implémentant. Mais one ne peut pas t'aider sans voir ton code source (http://rafb.net/paste)
C'est bien ce que je pensais...
en fait, ma boule de feu ne veut pas bouger, enfin c'est très bizarre.
boucle principale :
http://rafb.net/p/3AHpgp13.html
class FireBall :
http://rafb.net/p/v2joSk91.html
class FireBallManager :
http://rafb.net/p/py1xuy47.html
moi, j'avais le même problème avec une gestion d'effets sonores, et j'ai contourné le problème avec un fork()
ben oui, tu fais gérer ta boule de feu par un processus différent ![]()
j'y avais pensé, mais je trouve ça vraiment hard core d'y aller à coup de multi thread....
d'autre propositions ?
En SDL il y avait la fonction PollEvent qui attendait un évènement de la part de l'utilisateur et, tant qu'il n'avait pas été généré, continuait la boucle principale.
En gros, si mes souvenirs sont bons (ça fait un petit moment que j'ai pas codé avec SDL), ça donnait un truc comme :
while(continue)
{
SDL.PollEvent(&event);
switch(event.type);
{
... }
BlitSurface();
TrucMachin();... }
Il doit y avoir un équivalent en SFML non ?
________________________________________
Ma vidéo du moment :
http://www.dailymotion.com/related/x2jxz3_ce-soir-je-vais-prendre-reponse-a-m_fun/video/x1bg4c_diamsla-honte-europe-2-tv?from=rss
GetEvent de SFML ne bloque pas les events comme SDL_WaitEvent, en théorie....
Donc je vois pas où est le problème de mon implémentation.
![]()
Je pense savoir pourquoi elle ne s'affiche jammais ,
tu fais:
if (RunFireBall)
{
fireball.Update(bouleFeu, RunFireBall, J1);
app.Draw(bouleFeu); // j'affiche ma boule de feu à l'écran
}
app.Draw(map); // j'affiche la map
app.Draw(J1); // j'affiche mon vaisseau
le porblème selon moi est qu'il affiche bien ta boule de feu , mais que ensuite il affiche ta map par dessus , ce qui cache la boule de feu .
pas besoin du multithread, tu fais une fonction qui exécute un fork; le processus principal quitterait immédiatement la fonction et continuerait de faire marcher le jeu, tandis que son fils ferait la fonction et se ferait abattre à la fin ![]()
caeIacanthe : ça ne vas pas. Même si un processus séparé peut gérer la musique de ton jeu (et encore, ce n'est pas beau, il vaut mieux utiliser un thread pour pouvoir lancer et arréter facilement la musique), pour les graphisme, ce n'est pas du tout possible.Outre l'énorme perte de performance qu'il y aurait à lancer un processus par objet à dessiner, la plupart des bibliothèque graphique sont faites de telle sorte que seule un processus (voire un seul thread parfois) peut accéder à l'écran à un moment donné.
Je n'ai pas regardé le code, mais je pensais bien qu'un truc comme ce que pointe Fant-asmatique devait être à l'origine du problème.
comment fait-on pour faire un thread, dnob700
ma fonction, c'était un truc comme:
pid=fork();
if(pid==0){
//fais le son
exit(0)
}
![]()
ça, ça crée un processus. Pour créer un thread, il n'y a pas de méthode unique. Le plus courant est, je pense, d'utiliser la bibliothèque pthread (regarde les fonction du type pthread_* dans tes pages de man, à commencer par pthread_create).
Mais pour ce qui est du son, je suis sûr que ces détails sont géré normalement par la lib que tu utilise. À un moment, tu lui dit : "démarre le son", et tu ne t'occuper plus de rien.Donc il n'y a pas besoin ni de processus, ni de thread.
Ca ne sert ABSOLUMENT a rien de créer un processus pour gérer ça. Et si tu en viens à ça, c'est que tu as un énorme problème de conception.
Voici un solution toute simple:
Chaque élement va dans un gestionaire de ressources. (en gros un tableau contenant toutes tes animations...)
Chaque élement prends en compte: son point de départ, son vecteur vitesse, son animation (frame etc..)
A chaque unité de temps de ton jeu, tu parcours ton tableau et tu réactualise la position de tes objets, puis il te suffit de les afficher.
Dans tous les cas, il faut se tenir à cette ocnception informatique:
Entrée-> traitement-> sortie
S'il y a une sortie (affichage par exemple) dans ton traitement, ton code n'est pas "bien". (il est p-e bon ou juste, mais pas forcément "bien")
Fant-asmatique je t'aime
effectivement le problème était que la map cachait ma boule de feu.
nepser -->
on m'avais conseillé cette méthode, je l'implementerai avec un std::vector, mais pour l'instant je n'ai qu'une seul boule de feu à gérer
merci à tous, problème résolu ![]()
tu prendra conscience de l'importance de la remarque de nepser quand tu auras des boules de feu dans tout les sens, pleins de vaisseaux ennemis, des animations partout ect...
Sans ça, l'affichage devient completement cahotique ![]()
effectivement, tu dois gérer la chose de la manière suivante :
1) init
2) boucle :
-récup des entrée
-CALCUL des position des objets
-AFFICHAGE de tous tes objets
fin de la boucle
Ainsi, à chaque frame (dessin à l'écran), tu ne dessines pas un objet, mais tous tes objets qui ont tous avancés un peu.
Na jamais fait une boucle sur un objet précis pour ce genre de chose là, sinon bien sur tu bloques le reste qui ne peut plus avancer.
Il faut grouper par étapes et mettre tous tes objets dans chaque étape.
Bon courage
merci de vos conseils
J'ai l'honneur de vous annoncé que j'ai totalement réussi !
Je met tout mes sprites dans une std::list
je fais une itération et je met à jour l'affichage et les positions.
pour ceux qui veulent voir le code :
http://404past-it.fr/4
merci à tous ![]()