CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Algo] boule de feu qui paralyse le jeu

sangohan55
sangohan55
Niveau 10
16 mars 2008 à 12:15:45

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, @+

dnob700
dnob700
Niveau 10
16 mars 2008 à 12:19:26

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)

sangohan55
sangohan55
Niveau 10
16 mars 2008 à 13:11:24

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

caelacanthe
caelacanthe
Niveau 10
16 mars 2008 à 15:05:00

moi, j'avais le même problème avec une gestion d'effets sonores, et j'ai contourné le problème avec un fork() :oui:

ben oui, tu fais gérer ta boule de feu par un processus différent :ok:

sangohan55
sangohan55
Niveau 10
16 mars 2008 à 18:23:08

j'y avais pensé, mais je trouve ça vraiment hard core d'y aller à coup de multi thread....

d'autre propositions ?

Chaos_Clad
Chaos_Clad
Niveau 10
16 mars 2008 à 19:47:15

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

sangohan55
sangohan55
Niveau 10
16 mars 2008 à 19:51:20

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.

:(

Fant-asmatique
Fant-asmatique
Niveau 9
16 mars 2008 à 21:12:52

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 .

caeIacanthe
caeIacanthe
Niveau 10
16 mars 2008 à 22:26:09

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 :oui:

dnob700
dnob700
Niveau 10
16 mars 2008 à 22:32:51

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.

caeIacanthe
caeIacanthe
Niveau 10
17 mars 2008 à 00:30:21

comment fait-on pour faire un thread, dnob700 :question:

ma fonction, c'était un truc comme:

pid=fork();
if(pid==0){
//fais le son
exit(0)
}

:oui:

dnob700
dnob700
Niveau 10
17 mars 2008 à 01:18:42

ç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.

Nepser
Nepser
Niveau 5
17 mars 2008 à 02:03:05

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")

sangohan55
sangohan55
Niveau 10
17 mars 2008 à 13:40:15

Fant-asmatique je t'aime :bave:

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 :)

guyver2
guyver2
Niveau 10
17 mars 2008 à 18:16:00

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 :)

saleGauss
saleGauss
Niveau 9
23 mars 2008 à 01:16:57

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

sangohan55
sangohan55
Niveau 10
23 mars 2008 à 11:27:29

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 :)

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment