Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon premier jeu en SDL

Des questions durant ma progression

    10 août 2006 à 11:27:18

    Salut tous le monde,

    Je viens de terminer mon pendu et je passe maintenant à quelque chose de plus fun:
    la programmation de jeu en SDL! ^^
    J'ai donc débuté un plutot commun: le grand classique du vaisseau vu de profil
    qui progresse en poutrant les ennemis qui arrivent par la droite.

    Plus fun...soit, mais certainement pas plus simple!
    N'étant pas encore le Rocko Ci Fredy de la programmation ( o_O ) , j'aurais certainement encore besoin de votre aide par la suite.

    Bref venons en aux faits:

    J'ai fini la première partie de mon jeu : le déplacement du vaisseau (avec le clavier en l'occurence) sur un magnifique fond enneigé.

    J'avais tout d'abbord opté pour l'utilisation du switch/case présentée dans le tuto (merci M@teo) qui permet de prendre en charge une touche à la fois.
    J'obtenais donc : un déplacement par palier! Comment? :euh: Oui bon d'accord ça craint...
    Ca donnait ce petit coté injouable qui nous rapellent ces bons vieux moment passés à détruire nos amiga (ou amstrad dans mon cas) à coup
    de...eurm je m'égare.

    J'ai donc utilisé le :
    Uint8 *keystate = SDL_GetKeyState(NULL);
    if(keystate[SDLK_UP]) {....}

    Ce qui m'a permis d'obtenir des mouvements agréablement fluides.
    Seulement voilà, un problème est apparu quand j'ai essayé d'imbriquer la gestion des tirs dans la boucle. Pour vous aidez à visualiser la situation je vous met l'extrait concerné:


    while(continuer)
        {
            SDL_PollEvent (&MvtChataigne);
            switch (MvtChataigne.type)
            {


                case SDL_QUIT:
                 continuer = 0;
                 break;
               
            }

                if(keystate[SDLK_UP]) posChataigne.y-=7;
                if(keystate[SDLK_RIGHT]) posChataigne.x+=7;
                if(keystate[SDLK_LEFT]) posChataigne.x-=7;
                if(keystate[SDLK_DOWN]) posChataigne.y+=7;
                if(keystate[SDLK_SPACE])
                {
                    int i=0;
                    posMissile.x=posChataigne.x;
                    posMissile.y = posChataigne.y;
                    for(i=0; i<10;i++)
                    {
                        SDL_BlitSurface(missile, NULL, ecran,&posMissile);
                        SDL_Flip(ecran);
                        posMissile.x+=15;

                        SDL_BlitSurface(imageFond, NULL, ecran,&posFond);
                        SDL_BlitSurface(chataigne, NULL, ecran,&posChataigne);
                        SDL_BlitSurface(missile, NULL, ecran,&posMissile);
                        SDL_Flip(ecran);

                    }
                }

                SDL_BlitSurface(imageFond, NULL, ecran,&posFond);
                SDL_BlitSurface(chataigne, NULL, ecran,&posChataigne);
                SDL_Flip(ecran);

        }

    Eurm étant donné la vestusté de mes ressources, j'ai du créer moi même mon vaisseau qui est en fait (certains l'auront compris)...une chataigne...mon coté Ardechois surement.

    Le problème est le suivant:
    Quand je tire, la boucle de gestion des tirs se lance et monopolise tous les déplacements. En gros quand je tire, je n'avance pas...
    Je ne vois pas comment désolidariser la gestion des tirs du déplacement...


    Un autre problème à résoudre est celui de l'organisation du programme.
    Je le vois bien venir, si je continu comme ça mon programme va devenir un foutoir imbitable...
    J'ai bien essayé de faire des fonctions accompagnées de headers pour rendre le tout plus lisible mais je n'y suis pas arrivé.
    Si quelqu'un avait des propositons à me faire sur ce point ça serait sympa :) .

    Voilà merci d'avance à ceux qui feront un petit effort pour m'apporter des réponses.




    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      10 août 2006 à 11:39:11

      Salut :) ,

      Pour ton problème de tirs et de déplacements, je ne voit pas vraiment comment faire, à moins d'utilisés "La technique :lol: ", personnellement je fait comme cela : ( ça éviteles keystate et au passage tu pourras faire une fonction pour les mouvements et tirs ;) ).



      int haut = 0, bas = 0, gauche = 0, droite = 0; // Tu crée des booléen qui valent 1 si la touche est appuyée, 0 si elle est relachée

      while(continuerAventure)
          {
              SDL_WaitEvent(&event);
              switch(event.type)
              {
                  case SDL_QUIT:
                  continuerAventure = 0;
                  break;
                  case SDL_KEYDOWN: //Appuis d'une/des touches
                  switch(event.key.keysym.sym)
                  {
                      case SDLK_UP:
                      haut = 1;
                      break;
                      case SDLK_DOWN:
                      bas = 1;
                      break;
                      case SDLK_LEFT:
                      gauche = 1;
                      break;
                      case SDLK_RIGHT:
                      droite = 1;
                      break;
                  }
                  break;
                  case SDL_KEYUP: // relachement des touches
                  switch(event.key.keysym.sym)
                  {
                      case SDLK_UP:
                      haut = 0;
                      break;
                      case SDLK_DOWN:
                      bas = 0;
                      break;
                      case SDLK_LEFT:
                      gauche = 0;
                      break;
                      case SDLK_RIGHT:
                      droite = 0;
                      break;
                  }
                  break;
              }
          }

      // Quand tu sais si la touche est appuyée ou relachée tu peut opérée (moi je met sa dans une fonction a part ;) )
      deplacements(haut, bas, gauche, droite, &positionVaisseau);


      Enfaite tu envoie l'etat des touche dans la fonctions, ça permet l'appuis sur plusieurs touches (donc tirs et directions au passage )


      void deplacements( int haut, int bas, int gauche, int droite, SDL_Rect *positionVaisseau)
      {
           if(haut) //Si la touche haut est appuyée
           {
               positionVaisseau->y--;
           }
           if(droite)
           {
               positionVaisseau->x++;
           }

           // Etc ...
      }


      C'est facile et rapide à mettre en place, et normalement tout devrait marché correctement ^^ .
      • Partager sur Facebook
      • Partager sur Twitter
        10 août 2006 à 11:53:54


        Merci !

        Padawan Ardetcho avait sous-estimé la "Technique" du switch/case de maitre M@teo :lol: .

        Je vais faire ça, merci encre une fois de ton aide :) .

        PS: je garderais ce topic ouvert je pense pour y ajouter de nouvelles questions.
        • Partager sur Facebook
        • Partager sur Twitter
          10 août 2006 à 12:56:18

          Je suis tout à fait d'accord avec ta réponse mais le tir n'est toujours pas résolu, et pour celà il faudrait utiliser le temps(mais je ne sait pas comment faire:mais l'idée est là) et mettre ça dans la boucle principale.

          /*Pour ce bout de code il nous faut des variables:
              - int continuer = 1;
              - SDL_Event event;
              - SDL_Rect positionChataigne, positionMissile;
              - int missile = 0;
              - SDL_Surface *chataigne = NULL, *missileIMG = NULL, *ecran = NULL;
          */

          while(continuer)
          {
              SDL_WaitEvent(&event);
              switch(event.type)
              {
                  //On quitte si l'utilisateur veut fermer la fenêtre
                  case SDL_QUIT:
                      continuer = 0;
                      break;

                  case SDL_KEYDOWN:
                      switch(event.key.keysym.sym)
                      {

                          //Déplacement de la chataigne. Il faudra faire attention pour que la chataigne ne sorte pas de l'écran.
                          case SDLK_UP:
                              positionChataigne.y--;
                              break;

                          case SDLK_DOWN:
                              positionChataigne.y++;
                              break;

                          case SDLK_LEFT:
                              positionChataigne.x--;
                              break;

                          case SDLK_RIGHT:
                              positionChataigne.x++;
                              break;

                          case SDLK_SPACE:
                              if (!missile)
                                  missile = 1;
                              break;
                      }
                      break;
              }

              /*Affiche et déplace le missile de 1 a chaque fois que l'on rentre dans la boucle : c'est là qu'il faudrait mettre un sysème de temps pour empêcher les utilisateurs d'ordinateurs rapides d'avoir un missile rapide comme l'éclair. Il faudrait mettre ça après le &&
              */

              if (missile == 1 && temps)
              {
                  missileIMG = IMG_Load("missile.jpg");//Je ne connais pas le nom de l'image
                  positionMissile.x = positionChataigne.x;
                  positionMissile.y = positionChataigne.y;

                  positionMissile.x++;
                  if (positionMissile.x > ...)//Il faudra remplacer ... par la portée du tir
                  {
                      missileIMG = NULL;
                      missile = 0;
                  }

                  if (missile)
                      SDL_BlitSurface(missileIMG, NULL, ecran, &positionMissile);
              }

              SDL_FillRect(ecran, NUL, SDL_MapRGB(ecran->format, 255, 0, 255));

              SDL_BlitSurface(chataigne, NULL, ecran, &positionChataigne);

              SDL_Flip(ecran);
          }


          Voilà j'espère que mon code est clair et que ça t'aidera pour ton programme.

          Je ne programme pas depuis lontemps et il est possible qu'il y est des erreurs de syntaxe donc s'il y en a je confirme que ce n'est pas volontaire.
          • Partager sur Facebook
          • Partager sur Twitter
            10 août 2006 à 13:10:20

            Hmmm oui je prend note, je viens de revenir là, il faut déja que j'applique les modifications qu'on m'a proposées au dessus.

            Merci pour ton conseil. :)
            • Partager sur Facebook
            • Partager sur Twitter

            Mon premier 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