Partage
  • Partager sur Facebook
  • Partager sur Twitter

Thread dans un jeu en SDL

    22 janvier 2020 à 16:04:46

    Bonjour, 

    Je suis en train de faire un petit jeu très basique en C avec la SDL 1.2. Je précise que je débute en langage C donc je n'ai pas des connaissances de ouf.

    Pour faire simple on déplace un personnage et on doit ramasser des bouteilles dans une salle. Un ennemi est également présent. J'aimerais que quand on a un certain nombre de bouteilles, l'ennemi attaque en balançant des boules de feu, qui se déplacent sur mon niveau. 

    J'ai au départ fait la fonction des boules de feu en utilisant SDL_Delay, ça fonctionne, mais le jeu est bloqué durant l’exécution de la fonction ( je ne peux plus déplacer mon perso par exemple). Du coup c'est pas top. 

    En ce moment je regarde comment faire ça avec un thread, je me dit qu'un thread pourrait gérer l'affichage des boules de feu, en même temps que l'on joue. 
    J'ai lu qu'un thread crée dans le thread principal ne pouvait accéder aux élément graphiques du thread principal (ma SDL_Surface *ecran dans ce cas là j'imagine). J'ai essayé de le faire mais au moment ou je suis censé crée le thread, le jeu plante et se ferme. Comme je suis débutant, je ne sais pas vraiment si le code que j'ai fait est pourri, ou si effectivement ce n'est pas possible. 

    Je n'ai pas le code sous la main tout de suite mais pouvez vous m'éclaircir sur le problème que je rencontre. Est ce que la création d'un thread pour gérer l'affichage et le déplacement de mes boules de feu est judicieux ? Un autre moyen de faire ça sans bloquer le jeu ? J'ai aussi lu des choses sur l'utilisation des ticks mais je ne sais pas si cela peut m'aider. 

    Merci bonne journée !

    • Partager sur Facebook
    • Partager sur Twitter
      22 janvier 2020 à 16:37:09

      Si tu débutes, je te conseille de partir sur la SDL2.
      Cela te sera potentiellement plus utile.

      Ensuite, un thread n'est pas la meilleur solution ici.
      Si tu souhaite tout de même voir ce que donne un thread : https://wiki.libsdl.org/SDL_CreateThread

      Mais comment faire deux actions en parallèle sans faire de thread ?
      en faisant des actions entre chaque frame.

      Par exemple :
      Je souhaite que Alice bouge de gauche à droite , et en même temps que Bob avance de droite à gauche.

      Si je fais un code ainsi :

      tant que Alice n'est pas à sa position finale
      {
       déplacer Alice de 1 pixel sur la droite.
      }
      
      tant que Bob n'est pas à sa position finale
      {
       déplacer Bob de 1 pixel sur la gauche
      }

      D'abord je déplace Alice, puis Bob. Les deux actions ne sont pas "en même temps" et l'application sera bloqué tant que les déplacement ne seront pas terminé (pas de blit et pas d'évènement traité entre :( )

      Ou bien je le fais ainsi.

      tant que l'application doit continuer
      {
       si alice pas encore arrivé
       alors boiger Alice d'1 pixel sur la droite
       
       si Bob pas encore arrivé
       alors déplacer Bob d'1 pixel sur la gauche
      
       gestion event
       blit
       ...
      }
       

      Pas de thread, mais les déplacement seront fait en même temps.
      Je te laisse un peu réflechir avec cet exemple.



      -
      Edité par neuneutrinos 22 janvier 2020 à 16:42:44

      • Partager sur Facebook
      • Partager sur Twitter
        22 janvier 2020 à 16:47:24

        Merci pour ta réponse. 

        Mon jeu est déjà bien avancé ça m’embêterait beaucoup de tout refaire avec SDL2 mais j'y penserai pour mes prochains projets :) 

         Je vois, je vais tenter ça en rentrant. Mais est il possible de déplacer Bob toute les x secondes (avec SDL_Delay ou en utlisant les Ticks) sans que cela ne viennent retarder le déplacement d'Alice ? 

        • Partager sur Facebook
        • Partager sur Twitter
          22 janvier 2020 à 17:15:18

          Hello,

          Il y a la fonction SDL_AddTimer() qui permet d'appeler une fonction toutes les x millisecondes.

          -
          Edité par edgarjacobs 22 janvier 2020 à 17:15:37

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            22 janvier 2020 à 23:52:44

            Salut,

            Il est plus simple d'utiliser les ticks. Pour avoir fait quelques jeux, il assez facile de se passer des threads avec un peu d'ingéniosité. Le seul usage que j'en ai fait a été pour charger des fichiers à la volée pour ne pas interrompre le programme.

            Le souci est que lorsque l'on commence, le programme n'est pas assez bien structuré pour répondre à ce genre de problème.

            La solution est d'instancier (une structure de gestion) tous les objets / persos de ton jeu. Chaque objet doit avoir une structure propre et son jeu de fonctions.

            Pour gérer toute sorte de contrôle temporel, j'utilise des tempos que tu peux trouver dans ma signature. Un repeat fera l'affaire.

            Bonne continuation.

            • Partager sur Facebook
            • Partager sur Twitter

            Bonhomme !! | Jeu de plateforme : Prototype.

            Thread dans un jeu en SDL

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown