Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment on fait un saut de plateforme en SDL ?

Je suis pas le premier à demander, en effet

    17 avril 2020 à 20:41:34

    Bonjour,

    Je suis maintenant à plus de deux ans de recherches, sans succès (sinon je ne serais pas là :lol:), je viens chercher une quelconques aides dans ce forum. J'avais déjà ouvert un topic à ce sujet il y'à un an et demi si je me souviens bien, mais apparemment ça n'a pas fais effet en totalité. :-°

    Je vais être direct sur ce que je souhaite faire comme saut. Un saut qui se rapproche de celui de Fvirtman tout en gardant un certain réalisme (genre modifier les variables pour avoir un truc pas trop superficiel, quoi).

    Le problème étant que malgré mes tests infructueux, je ne sais toujours pas comment m'y prendre. Alors j'espère que vous pourrez m'aider (je prie pour en tout cas. :lol:).

    Voici mon code : 

    #include <SDL.h>
    
    #define WINDOW_WIDHT 640
    #define WINDOW_HEIGHT 480
    
    #define ON_THE_GROUND 0
    #define IN_THE_AIR 1
    
    
    int main(int argc, char **argv)  {
        int statut = ON_THE_GROUND;
        float fallSpeed = 0.0f;
        float speedX = 0.0f;
        float speedY = 0.0f;
        float impulse = 3.0f;
        const float gravity = 3.0f;
    
        if(SDL_Init(SDL_INIT_VIDEO) < 0)  {
            printf("Error while initializing SDL library : %s", SDL_GetError());
            return 1;
        }
    
        SDL_Surface *screen = SDL_SetVideoMode(WINDOW_WIDHT, WINDOW_HEIGHT, 32, SDL_SWSURFACE | SDL_DOUBLEBUF);
    
        if(!screen)  {
            printf("Error while displaying a %dx%d window : %s", WINDOW_WIDHT, WINDOW_HEIGHT, SDL_GetError());
            return 1;
        }
    
        SDL_Rect perso;
    
        perso.w = 20;
        perso.h = 40;
        perso.x = 50;
        perso.y = WINDOW_HEIGHT - perso.h - 50;
    
        Uint8 *key = SDL_GetKeyState(NULL);
        SDL_EnableKeyRepeat(10, 10);
    
        int fin = 0;
        while(!fin)  {
            SDL_Event event;
            while(SDL_PollEvent(&event))  {
                if(event.type == SDL_QUIT || key[SDLK_ESCAPE])  {
                    fin = 1;
                    return 0;
                }
    
                /// Si on appuie sur la touche "haut", que le personnage est au sol et que sa vitesse de chute est nulle... Je peux sauter.
    
                if(key[SDLK_UP] && statut == ON_THE_GROUND && fallSpeed == 0)  {
                    speedY += -impulse;    /// On ajoute l'impulsion au vecteur vitesse Y.
                }
    
                /// Si le perso est au-dessus du sol...
    
                if(perso.y < WINDOW_HEIGHT - perso.h - 50)  {
                    statut = IN_THE_AIR;    /// Le personnage est dans les airs.
                }
    
                /// Si on n'appuie pas sur la touche "haut" et que le perso est au-dessus du sol (dans les airs)...
    
                if(!key[SDLK_UP] && perso.y < WINDOW_HEIGHT - perso.h - 150 && statut == IN_THE_AIR)  {
                    fallSpeed = gravity;    /// La vitesse de chute est alors égale à la gravité...
                    speedY += fallSpeed;    /// ...que l'on ajoute au vecteur vitesse Y.
                }
    
                /// Si le perso est en-dessous du sol...
    
                if(perso.y > WINDOW_HEIGHT - perso.h - 50)  {
                    perso.y = WINDOW_HEIGHT - perso.h - 50;    /// On le remet à la position du sol...
                    fallSpeed = 0;    /// ... puis sa vitesse de chute devient constante (il ne tombe plus)...
                    statut = ON_THE_GROUND;    /// ... il est alors au sol.
                }
            }
            SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 255, 255));
            SDL_FillRect(screen, &perso, SDL_MapRGB(screen->format, 255, 0, 0));
    
            perso.x += speedX;
            perso.y += speedY;
    
            SDL_Flip(screen);
        }
    
        SDL_FreeSurface(screen);
        SDL_Quit();
        return 0;
    }
    

    C'est assez mal indenté mais normalement ça reste lisible. Le problème de ce programme est que lorsque j'appuie sur la touche haut, le personnage sors de l'écran par le haut tel Flash et ne redescend simplement PAS

    Ce qui m'embête, c'est que même en ayant suivi le recueil C/C++ de Fvirtman, donc en ayant ajouter des vitesses à des positions, cela n'a pas eu l'effet escompter.

    La plupart de mes conditions me semblent logiques (mais ma logique est peut-être cassé, allez savoir).

    J'espère que vous pourrez m'aider. 

    En attente de vos réponses, merci.

    Bonne soirée. 

    • Partager sur Facebook
    • Partager sur Twitter

    La persévérance paye toujours malgré les obstacles.

      19 avril 2020 à 13:28:50

      Bonjour,

      Tu es sûr de maîtriser le C ?

      Premièrement ton code mélange du français (variable fin) et de l'anglais. (même pour un usage personnel il est impossible de s'y retrouver par la suite)

      As-tu repris ce code de quelque part ou bien tu l'as entièrement rédigé ? Il me semble compliqué à comprendre.

      Et cela fait 2 années que tu cherches une réponse ? Deux ans t'aurais pourtant permis de maîtriser le C je pense.

      EDIT: d'où sort le 150 à la ligne 63 ?

      -
      Edité par Filadelphila 19 avril 2020 à 20:29:23

      • Partager sur Facebook
      • Partager sur Twitter
        19 avril 2020 à 23:40:59

        Bonjour Filadelphia 

        Merci de votre réponse. 

        Pour répondre à vos questions : 

        • Tu es sûr de maîtriser le C ?

        Je ne maîtrise pas parfaitement le langage C, en effet. J'essaie d'approfondir un maximum mon apprentissage pour en savoir le plus possible, mais j'ai beaucoup de mal à comprendre et à retenir ce qu'on m'apprend, ce qui me pose parfois de grosses difficultés dans certains domaines dont la programmation. Je pense que je manque de logique.

        • Premièrement ton code mélange du français (variable fin) et de l'anglais. (même pour un usage personnel il est impossible de s'y retrouver par la suite)

        Pour tout vous avouer, je n'ai pas fait attention à comment j'ai nommer mes variables, faute d'habitude j'imagine, mais je vais y remédier. Merci beaucoup.

        • As-tu repris ce code de quelque part ou bien tu l'as entièrement rédigé ? Il me semble compliqué à comprendre.

        Non c'est bien moi qui l'ai rédigé, je me suis néanmoins aidé de de certain code, afin de compléter le mien quand cela était nécessaire. J'ai beaucoup de difficultés à trouver une indentation à utiliser dans mon code, mais je finirais bien par trouver. 

        • Et cela fait 2 années que tu cherches une réponse ? Deux ans t'aurais pourtant permis de maîtriser le C je pense.

        Je ne pense pas que mon problème vienne de ma connaissance du langage C. Comme je vous l'ai dis je n'arrive pas à implémenter un saut de plateforme. Je n'ai pas la logique suffisante pour comprendre le fonctionnement de ce type de programme graphique. J'ai beau essayé je ne comprend simplement pas. Pour ma défense concernant le langage, j'ai suivi le cours de Mathieu Nebra, et je pense l'avoir assez bien assimilé.

        • EDIT: d'où sort le 150 à la ligne 63 ?

        Le 150 à la ligne 63 est la somme de la position du sol et de la hauteur maximale du saut. Je pense m'y être mal pris. Ce ne sont que des tests, donc il est fort probable que la technique utilisée soit tout simplement mauvaise.

        Que me conseillerez-vous pour obtenir un saut ?

        Merci d'avoir pris de votre temps pour me répondre.

        Bonne soirée Filadelphia.

        • Partager sur Facebook
        • Partager sur Twitter

        La persévérance paye toujours malgré les obstacles.

          21 avril 2020 à 21:31:20

          Pour obtenir un saut affichable, il faut déjà "ralentir" le changement de position. Pour m'exprimer correctement, le but d'un programme informatique est de s'exécuter de la manière la plus rapide possible.

          Dans le cas où tu serais arriver à un saut, ce dernier ce serais exécuté de manière si rapide que tu ne l'aurais pas vu.

          Un ordinateur plus puissant aurait effectuer le saut plus rapidement, pour illustrer.

          Tu pourras trouver de la documentation sur cela sur le web, probablement en anglais. 

          En fait, durant le développement de jeu vidéo tu vas être confronté à un tas de problèmes comme celui-ci. Du moins, si tu n'utilises pas de moteur de jeu.

          Je t'aiderai davantage volontier un prochain jour, bonne recherche.

          D'ici là, je te recommande de rendre ton code plus compréhensible pour toi-même.

          • Partager sur Facebook
          • Partager sur Twitter
            23 avril 2020 à 1:17:14

            Entendu ! je vous remercie de vos conseils.

            Bonne journée à vous.

            • Partager sur Facebook
            • Partager sur Twitter

            La persévérance paye toujours malgré les obstacles.

            Comment on fait un saut de plateforme 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