Partage
  • Partager sur Facebook
  • Partager sur Twitter

sauter personnage

touche monter

Sujet résolu
    7 août 2007 à 9:54:41

    bonjour,

    J'ai réussi à faire sauter mon personnage mais...pour le faire monter je suis obligé de laisser la touche appuyée jusqu'à ce qu'il atteigne la limite que je lui ai autorisé.
    Ce que j'aurais voulu c'est d'appuyer une fois sur la touche et le personnage monte tout seul.
    J'avais pensé au getTicks mais je l'utilise déjà pour la descente.
    Comment faire? :(

    merci d'avance,

    int main ( int argc, char** argv )
    {
    SDL_Init(SDL_INIT_VIDEO);
    SDL_WM_SetCaption("Mon jeu en 2D !", NULL);
    SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE);
    SDL_Surface *ecran = NULL, *ciel = NULL, *personnage = NULL, *surface = NULL;
    ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    surface = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_DOUBLEBUF, 900, HAUTEUR_FENETRE, 32, 0, 0, 0, 0);
    SDL_Rect positionCiel, positionPersonnage, positionSurface, morceau;
    SDL_Event evenement;
    int continuer = 1;
    int vsaut = 20, vchute =0;
    bool saut = true;
    int tempsPrecedent = 0, tempsActuel = 0, tempsPrecedent2 = 0, tempsActuel2 = 0;
    positionSurface.x = 0;
    positionSurface.y = 0;
    positionPersonnage.x = LARGEUR_FENETRE/4;
    positionPersonnage.y = 512;
    morceau.w = surface->w;
    morceau.h = surface->h;
    morceau.x = 0;
    morceau.y = 0;

    surface = IMG_Load ("herbe.gif");
    personnage = IMG_Load ("personnage.gif");


                // MISE EN PAUSE DU PROGRAMME

    while (continuer)
    {

    SDL_PollEvent(&evenement); // Récupération de l'évènement dans evenement
    switch(evenement.type) // Test du type d'évènement
        {
            case SDL_QUIT: // Si c'est un évènement de type "Quitter"
            continuer = 0;
            break;


    case SDL_KEYDOWN: // Si appui d'une touche
    switch (evenement.key.keysym.sym)
    {

                // EN PARTANT DE LA DROITE DE L'ECRAN...SI...

    case SDLK_LEFT:
    if (positionPersonnage.x >= LARGEUR_FENETRE/2)
    {
    positionPersonnage.x -= 10;
    break;
    }
    if (positionPersonnage.x < LARGEUR_FENETRE/2)
    {
    morceau.x -= 10;
    break;
    }

                  // EN PARTANT DE LA GAUCHE DE L'ECRAN...SI...

    case SDLK_RIGHT:
    if (positionPersonnage.x < LARGEUR_FENETRE/2)
    {
    positionPersonnage.x += 10;
    break;
    }
    if (positionPersonnage.x >= LARGEUR_FENETRE/2)
    {
    morceau.x +=10;
    break;
    }
    case SDLK_UP:
    if (saut == true)
    {
    vsaut = 20;
    positionPersonnage.y -= vsaut;
    break;
    }

    }// FIN DU SWITCH EVENEMENT.SYM
    }// FIN DU SWITCH "EVENEMENT.TYPE"

          switch(evenement.type)
            {
                case SDL_QUIT:
                continuer = 0;
                break;

    case SDL_KEYUP: // relache d'une touche
    switch (evenement.key.keysym.sym)
    {
    case SDLK_UP:
    saut = false;
    if (positionPersonnage.y == 512)
    {
    saut = true;
    break;
    }
    }//FIN DU IF
    break;
    }

    vchute = 8;
    tempsActuel = SDL_GetTicks();


     if (tempsActuel - tempsPrecedent > 15) /* Si 30 ms se sont écoulées */
    {

        positionPersonnage.y += vchute; /* On bouge Zozor */
        tempsPrecedent = tempsActuel;
    }

    if (positionPersonnage.y > 512)
    {
    positionPersonnage.y = 512;
    }

    if (positionPersonnage.y <= 250)
    {
    saut = false;
    }

               // MORCEAU NE PEUT PAS DEPASSER L'ECRAN GAUCHE
               // PERSONNAGE CONTINUE

    if (morceau.x < 0)
    {
    morceau.x = 0;
    positionPersonnage.x -= 10;
    }

                // MORCEAU NE PEUT PAS DEPASSER L'ECRAN DROITE
                // PERSONNAGE CONTINUE

    if (morceau.x > 900)
    {
    morceau.x = 900;
    positionPersonnage.x += 10;
    }

                 // PERSONNAGE NE PEUT PAS DEPASSER L'ECRAN DROITE

    if (positionPersonnage.x > 725)
    {
    positionPersonnage.x = 725;
    }

                 // PERSONNAGE NE PEUT PAS DEPASSER L'ECRAN GAUCHE

    if (positionPersonnage.x < 0)
    {
    positionPersonnage.x = 0;
    }


    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
    SDL_BlitSurface(surface, &morceau, ecran, &positionSurface);
    SDL_BlitSurface(personnage, NULL, ecran, &positionPersonnage);
    SDL_Flip(ecran) ;
    }// FIN WHILE


    SDL_FreeSurface(surface);
    SDL_FreeSurface(personnage);
    SDL_Quit ();
    return 0;
    }
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      7 août 2007 à 10:43:36

      salut

      J'ai qu'un conseil : jette ce code à la poubelle. :-°

      Pourquoi ?
      Car
      1 . Tu n'indente rien de la même manière (arrives-tu à t'y retrouver?? o_O )
      2 . Tu fais deux fois un switch (switch(evenement.type)). Quelle utilité? (surtout si tu mets deux fois "case SDL_QUIT:").
      3 . Ton algorithme est faut. Recommence sur une feuille. (Quand on appuis sur la touche "saut", tu ne fais pas sauter les perso, mais tu le téléporte!)

      case SDL_KEYUP: // relache d'une touche
      switch (evenement.key.keysym.sym)
      {
      case SDLK_UP:
      saut = false;
      if (positionPersonnage.y == 512) // CA SIGNIFIE QUOI?
      {
      saut = true;
      break;
      }
      }//FIN DU IF  // NON CA C'EST LA FIN DU SWITCH.
      break;
      }


      Courage ;)
      • Partager sur Facebook
      • Partager sur Twitter
        7 août 2007 à 10:45:44

        Moi, je ne ferais pas comme ça.

        Une méthode est de considérer, pour ton perso, une vitesse : vx et vy.
        A chaque seconde, typiquement, la position x subit x+=vx, et y+=vy
        vx et vy peuvent etre négatifs pour un déplacement a gauche, a droite, en haut ou en bas.
        Lachons le mot : c'est un vecteur vitesse.

        A partir de la, quand tu sautes, tu modifies vy d'un coup : c'est l'impulsion du saut.
        Ainsi, l'impulsion n'est donnée qu'une fois : le reste du temps, le sprite subit une évolution normale.
        A chaque nouvelle image, tu calcules, en fonction du temps passé, l'évolution du vecteur vitesse, dans un champ de pensateur : la chute libre.

        Regarde mon tuto (cf ma carte) §2.B.1 pour voir un exemple sur la chute libre.
        • Partager sur Facebook
        • Partager sur Twitter

        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          7 août 2007 à 15:06:14

          C'est bon j'ai réussi à faire.
          ce n'est peut être pas la bonne méthode mais le résultat me convient parfaitement.Je le met quand même si ça peut aider de futurs programmeurs en détresse :D
          je vous remercie à tous les deux!
          Hiura je tiendrais compte de tes remarques concernant mon code "brouillon" ^^ , je rectifierais sous peu.
          Fvirtman je note ton site, merci :)

          int saut = 0, decalage = 8;
           



          case SDLK_UP:
          if (!saut)
          {
          saut = 1;
          decalage = 17;
          break;
          }

          case SDL_KEYUP: // relache d'une touche
          switch (evenement.key.keysym.sym)
          {
          case SDLK_UP:
          break;
          }
           



          // On teste si le joueur effectue un saut
                if( saut )
                 {
                    // on fait bouger le joueur selon le décalage
                    positionPersonnage.y -= decalage;

                   // On teste si le joueur a retouché le sol
                   if (positionPersonnage.y >= 512)
                   {
                      positionPersonnage.y = 512;

                      // on arrête le saut
                      saut = 0;
                   }

                   // on fait ralentir la montée, voire accélérer la descente
                   decalage -= 1;

                }
          • Partager sur Facebook
          • Partager sur Twitter

          sauter personnage

          × 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