Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Space Invaders en C] Problème de vélocité

    22 novembre 2017 à 14:17:22

    Bonjour à tous !

    Je suis en école informatique et nous sommes débutants . Pour un projet , on nous a demandé de programmer un Space Invaders en C.

    On a donc fait le choix d'utiliser une bibliothèque SDL .

    On en a fini avec le déplacement de notre personnage de gauche à droite , seulement nous avons remarqué que notre personnage arrêtait de bouger quand on appuie sur une autre touche que les flèches de déplacement .

    Un ami de la classe nous a parlé d'un système de vélocité que nous n'avons pas tellement compris .

    Voici le code pour l'instant:

    Si quelqu'un veut bien nous éclairer , Merci d'avance !

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    void pause()
    {
        int continuer = 1;
        SDL_Event event;
    
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
            }
        }
    }
    
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *imageDeFond = NULL, *flic = NULL, *perso = NULL; // Le pointeur qui va stocker la surface de l'écran
        SDL_Event event;//Variable pour gestion des évenements
        SDL_Rect positionFond, positionflic[55], positionperso;
        int continuer = 1,i,j;
        float x=10, y=40;
    
        positionFond.x = 0;
        positionFond.y = 0;
        /*positionflic.x = 10;
        positionflic.y = 0;*/
        positionperso.x = (640-64)/2;
        positionperso.y = (480-43);
    
    
        SDL_Init(SDL_INIT_VIDEO);//Je démarre ma SDL avec paramètres vidéo
        SDL_WM_SetIcon(SDL_LoadBMP("icone.bmp"), NULL);
    
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Space Runaway", NULL);
    
        //SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));//On remplit l'écran en blanc
        imageDeFond = SDL_LoadBMP("fond_espace.bmp");
        SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond); /* Mise à jour de l'écran avec sa nouvelle couleur */
        flic = SDL_LoadBMP("flic.bmp");
        SDL_SetColorKey(flic, SDL_SRCCOLORKEY, SDL_MapRGB(flic->format, 0, 255, 0));
        //SDL_BlitSurface(flic, NULL, ecran, &positionflic);
        perso = SDL_LoadBMP("perso.bmp");
        SDL_SetColorKey(perso, SDL_SRCCOLORKEY, SDL_MapRGB(perso->format, 0, 255, 0));
        SDL_BlitSurface(perso, NULL, ecran, &positionperso);
        SDL_EnableKeyRepeat(1, 1); /* Activation de la répétition des touches */
    
        while (continuer)
        {
            SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);
            for (j=0;j<5;j++)
            {
                for (i=0;i<11;i++)
                {
                    positionflic[i+j].x = x +i*56;
                    positionflic[i+j].y = y + j*39;
                    SDL_BlitSurface(flic, NULL, ecran, &positionflic[i+j]);
                }
            }
    
            SDL_PollEvent(&event);
            {
                switch(event.type)
                {
                    case SDL_QUIT:
                        continuer = 0;
                        break;
                    case SDL_KEYDOWN:
                        switch(event.key.keysym.sym)
                        {
                            case SDLK_RIGHT: // Flèche droite
                                positionperso.x++;
    
                                break;
                            case SDLK_LEFT: // Flèche gauche
                                positionperso.x--;
    
                                break;
                        }
                        break;
                 // case SDL_KEYUP:
    
                }
                if (positionperso.x >= 640-60)
                    positionperso.x = 579;
            }
    
        SDL_BlitSurface(perso, NULL, ecran, &positionperso);//Nouvelle position du perso
        SDL_Flip(ecran);
        x=x+0.1;
            }
        SDL_FreeSurface(imageDeFond);//On libère la surface
        SDL_FreeSurface(flic);
        SDL_FreeSurface(perso);
    
        SDL_Quit();//J'arrête ma SDL proprement en libérant la mémoire
    
        return EXIT_SUCCESS;
    }
    

    -
    Edité par Boulbix13 22 novembre 2017 à 14:41:24

    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2017 à 14:29:59

      C'est surtout un problème d’indentation du code qu'il a !

      Utilise le bouton </> du forum pour poster ton code.

      • Partager sur Facebook
      • Partager sur Twitter
        22 novembre 2017 à 14:41:52

        rouloude a écrit:

        C'est surtout un problème d’indentation du code qu'il a !

        Utilise le bouton </> du forum pour poster ton code.

        C'est réglé ! 



        • Partager sur Facebook
        • Partager sur Twitter
          22 novembre 2017 à 15:44:36

          C'est votre gestion d'évènement qui est à revoir. (vous avez pris sur le tuto SDL d'ici malheureusement)
          Mais il existe des tutos pour creuser le problème.

          Ce sera plus simple par la suite pour gérer toute sorte de choses dont la vélocité.

          https://openclassrooms.com/courses/simplifier-les-events-avec-sdl

          Le code est en C++, mais si vous comprenez ce qui est dit, il n'est pas plus complexe de le refaire en C ;) 

          • Partager sur Facebook
          • Partager sur Twitter
            22 novembre 2017 à 18:31:39

            Bonjour,

            Pour une gestion correcte des évènements il faut tester le retour de PollEvent (ligne 66). Cela se fait classiquement en mettant le switch{ } dans une boucle while{ } :

            while (SDL_PollEvent(&event))
            {
                 switch(event.type)  // Traitement des évènements
                 {
                      // ..
            
                 }
            
            }
            

            Ensuite pour les questions de vélocité cela dépend si l’on veut que le personnage avance à chaque transition de la touche ou si l’on veut qu’il avance tant que la touche est enfoncée : dans le premier cas on réagit à un événement (la touche passe de « relachée » à « enfoncée »), dans le deuxième cas on réagit en fonction de l’état de la touche (la touche est enfoncée).

            La structure ci-dessus permet de gérer les évènements.

            Pour les états du clavier il y a une fonction spécifique SDL ; on peut aussi gérer soi-même un booléen que l’on set sur l’évènement KEYDOWN et que l’on reset sur l’évènement KEYUP.



            • Partager sur Facebook
            • Partager sur Twitter
            Architecture SDL                     Multithreading         

            [Space Invaders en C] Problème de vélocité

            × 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