Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme de vitesse

Probleme d'incrémentation ?

Sujet résolu
Anonyme
    8 mai 2006 à 17:31:26

    (Re)Bonjour ! Bon et bien voila j'ai un probleme (on avait pas deviné :D ). J'essaye de faire un p'tit truc pour que quand j'appuie sur la fleche bas, la vitesse de Zozor augmente et inversement avec la touche haut. Sauf que..ça bug ! Et oui impossible de faire un programme sans faire un cota d'erreur :-° Ou alors il est super simple (ou le mec est un dieu en quel cas je voudrais le voir ^^ ). En fait, le rallentissement marche impec', mais l'inverse c'est pas trop ça :-° Quand j'augmente trop la vitesse, Zozor ne bouge plus et le prog plante o_O Pas cool ça ! Voila le code merci de me donner la ou les erreurs.

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *zozor = NULL;
        SDL_Rect positionZozor;
        SDL_Event event;
        int continuer = 1, direction = 1, tempsPrecedent = 0, tempsActuel = 0, temps = 50, condition = 1;

        SDL_Init(SDL_INIT_VIDEO);

        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Gestion du temps en SDL", NULL);

        zozor = SDL_LoadBMP("zozor.bmp");
        SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

        positionZozor.x = ecran->w / 2 - zozor->w / 2;
        positionZozor.y = ecran->h / 2 - zozor->h / 2;

        SDL_EnableKeyRepeat(10, 10);

        while (continuer)
        {
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_UP:
                            temps++;
                            break;
                        case SDLK_DOWN:
                            if (condition == 1)
                            {
                                temps--;
                            }
                            break;
                    }
            }

        if (temps == 1)
        {
            condition == 0;
        }

    tempsActuel = SDL_GetTicks();
            if (tempsActuel - tempsPrecedent > temps && direction == 1)
            {
                positionZozor.x++;
                positionZozor.y++;
                tempsPrecedent = tempsActuel;

            if (positionZozor.x + zozor->w == ecran->w)
            {
                direction = 3;
            }
            if (positionZozor.y + zozor->h == ecran->h)
            {
                direction = 2;
            }
            if (positionZozor.x + zozor->w == ecran->w && positionZozor.y + zozor->h == ecran->h)
            {
                direction = 4;
            }
            }

            if (tempsActuel - tempsPrecedent > temps && direction == 2)
            {
                positionZozor.x++;
                positionZozor.y--;
                tempsPrecedent = tempsActuel;

            if (positionZozor.x + zozor->w == ecran->w)
            {
                direction = 4;
            }
            if (positionZozor.y == 0)
            {
                direction = 1;
            }
            }

            if (tempsActuel - tempsPrecedent > temps && direction == 3)
            {
                positionZozor.x--;
                positionZozor.y++;
                tempsPrecedent = tempsActuel;

            if (positionZozor.x == 0)
            {
                direction = 1;
            }
            if (positionZozor.y + zozor->h == ecran->h)
            {
                direction = 4;
            }
            }

            if (tempsActuel - tempsPrecedent > temps && direction == 4)
            {
                positionZozor.x--;
                positionZozor.y--;
                tempsPrecedent = tempsActuel;

            if (positionZozor.x == 0)
            {
                direction = 2;
            }
            if (positionZozor.y == 0)
            {
                direction = 3;
            }
            }

            else
            {
                SDL_Delay(temps - (tempsActuel - tempsPrecedent));
            }


            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
            SDL_Flip(ecran);
        }

        SDL_FreeSurface(zozor);
        SDL_Quit();

        return EXIT_SUCCESS;
    }


    PS : Je ne sais pas s'il est possible de faire
    case SDLK_DOWN:
         if (condition == 1)
         {
         temps--;
         }

    donc c'est peut etre cela l'erreur mais en ce cas je ne sais pas comment faire pour que la vitesse reste bloquée a 1. J'ai pensé au début que le prog plantait parceque la vitesse atteignait 0. Enfin ça c'est a vous de me le dire ^^ Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      8 mai 2006 à 19:06:27

      vérifie que tu n'envois pas une valeur négative a SDL_Delay

      else
      {
          if(temps - (tempsActuel - tempsPrecedent) > 0)//on n'evoye pas de valeur négative à SDL_Delay
          {
               SDL_Delay(temps - (tempsActuel - tempsPrecedent));
          }
      }
      • Partager sur Facebook
      • Partager sur Twitter
        9 mai 2006 à 12:03:58

        if (temps == 1)
        {
        condition == 0;
        }

        Tu as une erreur de syntaxe ici, c'est condition=0, et non pas ==0 qu'il faut mettre.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme

        Probleme de vitesse

        × 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