Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeux, gestions des niveaux.

    30 mars 2008 à 15:53:26

    Bonjour,

    Je réalise actuellement un jeu en C++ ( on doit s'en douter vu la rubrique ) avec .. Qt ( ne dites rien, c'était surtout pour apprendre la librairie, utiliser les SLOTS/SIGNAUX et découvrir le C++ par la meme occasion.

    Je réalise un petit jeu spatial de shoot avec vue latérale. Actuellement le vaisseau se déplace sur la map, il tire, et je n'aurai aucun probleme à gerer les différentes armes. Cependant une petite chose coince, j'en suis à devoir générer des ennemis, ca induit donc, leurs positions, leurs déplacements, leurs actions, leur nombre, leur fréquence d'apparition. Je pensais fonctionner par vague. Cependant c'est plus au niveau de la reflexion de fond que je bloque.

    J'aimerais pouvoir éditer un fichier externe mettons niveau1.nv, niveau2.nv etc, et instancier une classe du type ( admettons, j'ai pas pensé les noms encore ) LevelManager() qui aurait pour mission de charger le fichier niveau.nv ( qui contient tout ce qui est cité plus haut ) et de transmettre les données au reste du programme pour gerer tout ça. Alors j'avais pensé à faire du ligne par ligne, on lit une ligne toutes les 2secondes, chaque ligne contient plusieurs actions, instancier un ennemi, le faire bouger, tirer, etc .. Mais ca comporterait pas mal de problemes, car le temps d'un niveau n'est pas quelque chose de figé, ca peut varier.

    Sinon, l'autre solution à laquelle j'ai pensé, c'était de faire une classe Niveau qui contient l'essentiel d'un niveau, puis y aller à coup d'héritage : NiveauUn.cpp NiveauDeux.cpp etc .. Au début du niveau je l'instancie, à la fin du niveau je le delete et j'instancie le niveau suivant. Avec une condition genre:
    1. if(bossIsKilled())
    2.     nextLevel();


    Enfin voilà, gerer les ennemis et les niveaux ça va être un gros bout je pense, donc si quelqu'un ( qui a par exemple déjà réalisé un petit jeu ou autre ) pouvait m'aiguiller et me donner quelques trucs, me dire laquelle des deux methodes est la plus correcte ( si c'est la premiere, me dire comment la mettre en oeuvre, car elle me semble mieux, mais beaucoup plus dur à mettre en oeuvre ).

    En attendant une réponse, je vous souhaite tout de même un bon dimanches ( sans s d'ailleur ).

    Askerat.
    • Partager sur Facebook
    • Partager sur Twitter
      30 mars 2008 à 23:31:32

      Salut,
      Ce qui est bien avec QT, c'est que c'est super complet.
      Il faut donc en profiter.
      Déjà, je te conseil d'utiliser la première méthode mais adaptée, tu devrais utiliser les fichiers XML, c'est bien plus simple à lire et à créer.
      Deuxièmement, je te conseil aussi de faire un système permettant de créer et des gérer les ennemis un à un, cela te permettrait d'être plus précis mais l'inconvénient c'est que c'est beaucoup plus long à mettre en place.
      Admettons que tu aies un fichier XML de ce style:
      1. <Ennemis>
      2.   <ennemi type="fantasin" vies="40" apparition="20" deplacement="static"/>
      3.   <ennemi type="fantasin" vies="40" apparition="60" deplacement="static"/>
      4.   <ennemi type="fantasin" vies="40" apparition="55" deplacement="static"/>
      5.   <potion effet="+45" apparition="50"/>
      6.   <ennemi type="boss" vies="100" apparition="300" deplacement="Gauche"/>
      7. </Ennemis>

      Donc, la fonction de lecture et d'interprétation est plutôt simple :
      1. //Lecture du noeud
      2. if (type == "fantasin")
      3. {
      4.   //Dessine fantasin quand temps = apparition
      5. }
      6. else if (type == "potion")
      7. {
      8.   //Placement potion
      9. }
      10. else if (type == "boss")
      11. {
      12.   //boss
      13. }

      Enfin, en théorie c'est simple mais je pense que c'est plus compliqué que ca en code.

      Je t'ai donné l'idée, il ne manque plus que la concrétisation. ;)

      Bien amicalement.

      Gp2mv3
      • Partager sur Facebook
      • Partager sur Twitter
        31 mars 2008 à 23:26:54

        Oui, merci, j'ai eu le temps de pas mal y penser entre temps, je vais bientot me consacrer à la réalisation. Donc je fais tourner un QTimer à la seconde, et j'incrémente une variable time qui me donne le nombre de secondes écoulées depuis le début du niveau via un slot relié au signal timeout() du QTimer. Apres il reste juste à verifier si la seconde en cours correspond à un evenement spécial durant l'évolution du niveau.

        Je vais regarder de plus pres la gestion des xml avec Qt. Autre chose, comment dois je les lire ? Je lis le xml ligne par ligne ? Ou bien je le lis d'un coup tout le xml que je stocke dans des variables de travail qui seront exploitées ensuite ?

        • Partager sur Facebook
        • Partager sur Twitter
          1 avril 2008 à 6:15:56

          a mon avis ligme par ligne a partir de <Ennemis> tant que tu n'a pas trouver </Ennemis>
          • Partager sur Facebook
          • Partager sur Twitter
            1 avril 2008 à 11:27:07

            Mais non, ce qui est vraiment bien avec le XML, c'est la simplicité de lecture.
            Tien, voici quelques tutoriels trouvés sur internet:

            Voilà, j'ai essayé avec Dom, c'est vraiment super simple et super pratique.
            Tu ne dois juste pas oublier de mettre
            1. QT += xml

            dans le fichier .pro.

            Voilà, en espérant que ça t'aide.

            Gp2mv3
            • Partager sur Facebook
            • Partager sur Twitter

            Jeux, gestions des niveaux.

            × 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