Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] image clignotante

petit problème avec mes images

    17 août 2006 à 16:11:09

    Bonjour je viens d'essayer d'écrire le programm d'un jeu et je doit pour cela faire déplacer mon personnage et mes ennemis lorsque je n'avais que mon personnage tout marcher correctement mais depuis que j'essaye de faire descendre un ennemis les 2 images peuvent bouger mais elles clignotent je vous montre mon code qui est un peu mal ranger je sait mais bon ...
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <SDL/SDL.h>

    #include "pause_probleme.h"


    int main(int argc, char *argv[])
    {

        const long MAX = 600, MIN = 40;
        SDL_Event event;
        int continuer = 1;
        SDL_Surface *ecran = NULL ,*image_perso = NULL ,*image_enemis = NULL;
        SDL_Rect position_perso ,position_enemis;
        int tempsPrecedent = 0, tempsActuel = 0;


        srand(time(NULL));
        position_perso.x = 275;
        position_perso.y = 400;
        position_enemis.x = (rand() % (MAX - MIN + 1)) + MIN;
        position_enemis.y = 0;



        SDL_Init(SDL_INIT_VIDEO); // Initialisation de la SDL

        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        probleme_init_SDL();
        SDL_WM_SetCaption("jeu", NULL);
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0,255, 255));
        SDL_Flip(ecran); // Mise à jour de l'écran




        image_enemis = SDL_LoadBMP("enemis.bmp");
        SDL_BlitSurface(image_enemis, NULL, ecran, &position_enemis);
        SDL_Flip(ecran);

        image_perso = SDL_LoadBMP("perso.bmp");
        SDL_BlitSurface(image_perso, NULL, ecran, &position_perso);
        SDL_Flip(ecran);

        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_RIGHT: // Flèche droite
                            position_perso.x++;
                            break;
                        case SDLK_LEFT: // Flèche gauche
                            position_perso.x--;
                            break;
                    }
                    break;
            }

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

                tempsActuel = SDL_GetTicks();
                if (tempsActuel - tempsPrecedent > 30)
                {
                    position_enemis.y++;
                    tempsPrecedent = tempsActuel;
                }


            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 255, 255));
            SDL_BlitSurface(image_enemis, NULL, ecran, &position_enemis);
            SDL_Flip(ecran);

            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 255, 255)); /* On efface l'écran */
            SDL_BlitSurface(image_perso, NULL, ecran, &position_perso); /* On place zozor à sa nouvelle position */
            SDL_Flip(ecran); /* On met à jour l'affichage */
        }

        SDL_FreeSurface(image_perso);
        SDL_FreeSurface(image_enemis);

                        /*fin gestion des déplacement du personnage et ennemis*/




        pause();

        SDL_Quit();
        return EXIT_SUCCESS;

        return 0;
    }


    je voudrait aussi savoir si ma fonction position_enemis.x = (rand() % (MAX - MIN + 1)) + MIN; était bonne pour les faire apparaitre au hasard sinon vous me conseillerais quoi ? merci d'avance au revoir
    • Partager sur Facebook
    • Partager sur Twitter
      17 août 2006 à 16:36:05

      Je ne comprend pas pourquoi tu actualises l'écran avant la boucle while. o_O

      Et en plus de ça 2 fois...

      Bah sinon je ne vois pas de quoi peut venir le clignotement vu que tu utilises bien le double buff

      Bonne chance ^^
      • Partager sur Facebook
      • Partager sur Twitter
        17 août 2006 à 16:50:22

        ben j'actualise l'écran avant ma boucle while parce que ...ben je croyait qu'il fallait le faire je vais essayer de l'enlever ben mercui quan même
        • Partager sur Facebook
        • Partager sur Twitter
          17 août 2006 à 16:53:12

          A la rigueur tu en aura peut-être besoin d'un et j'ai bien dit un avant la boucle :p
          • Partager sur Facebook
          • Partager sur Twitter
            17 août 2006 à 18:30:13

            Beaucoup de choses très douteuses dans ton code.
            • 1: Tu fais des Blits et des Flip avant la boucle principale, inutile.
            • 2: Dans ta boucle d'evenements, tu fais 2 switch(event.type), ca ne sert à rien.
            • 3: Tu efface ton ecran une deuxieme fois après avoir blitté quelque chose à la fin de la boucle.
            • 4: Tu as deux return ????

            #include <stdlib.h>
            #include <stdio.h>
            #include <time.h>
            #include <SDL/SDL.h>

            #include "pause_probleme.h"


            int main(int argc, char *argv[])
            {
                const long MAX = 600, MIN = 40;
                SDL_Event event;
                int continuer = 1;
                SDL_Surface *ecran = NULL ,*image_perso = NULL ,*image_enemis = NULL;
                SDL_Rect position_perso ,position_enemis;
                int tempsPrecedent = 0, tempsActuel = 0;

                srand(time(NULL));
                position_perso.x = 275;
                position_perso.y = 400;
                position_enemis.x = (rand() % (MAX - MIN + 1)) + MIN;
                position_enemis.y = 0;

                SDL_Init(SDL_INIT_VIDEO); // Initialisation de la SDL
                ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
                probleme_init_SDL();
                SDL_WM_SetCaption("jeu", NULL);
                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0,255, 255));

                image_enemis = SDL_LoadBMP("enemis.bmp");
                image_perso  = SDL_LoadBMP("perso.bmp");


                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_RIGHT: // Flèche droite
                                    position_perso.x++;
                                    break;
                                case SDLK_LEFT: // Flèche gauche
                                    position_perso.x--;
                                    break;
                            }
                            break;
                    }

                    tempsActuel = SDL_GetTicks();
                    if (tempsActuel - tempsPrecedent > 30)
                    {
                        position_enemis.y++;
                        tempsPrecedent = tempsActuel;
                    }

                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 255, 255));
                    SDL_BlitSurface(image_enemis, NULL, ecran, &position_enemis);
                    // Probleme, tu effacais un DEUXIEME FOIS
                    SDL_BlitSurface(image_perso, NULL, ecran, &position_perso); /* On place zozor à sa nouvelle position */
                    SDL_Flip(ecran); /* On met à jour l'affichage */
                    /*fin gestion des déplacement du personnage et ennemis*/
                }

                SDL_FreeSurface(image_perso);
                SDL_FreeSurface(image_enemis);     

                pause();

                SDL_Quit();
                return EXIT_SUCCESS;
            }

            Ca devrait deja aller beaucoup mieux comme ça !!! ^^
            • Partager sur Facebook
            • Partager sur Twitter
              17 août 2006 à 18:45:26

              Ouais j'avais pas vu les 2 return ! :)

              Bien looké guimers ;)

              Et je suis content de savoir que j'avais raison pour l'actualisation de l'écran avant la boucle principale.

              Bon allez moi je vais lire un nouveau chapitre. Bye ^^
              • Partager sur Facebook
              • Partager sur Twitter
                17 août 2006 à 20:39:56

                :oo_O et ben merci beaucoup j'avais pas vu mon erreur pour les 2 retourn et pour le reste merci beaucoup sa marche maintenant a bientot et encore merci
                • Partager sur Facebook
                • Partager sur Twitter
                  17 août 2006 à 22:42:57

                  De rien, de rien !! ;)
                  (Pense à mettre le sujet en résolu)

                  A++
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [SDL] image clignotante

                  × 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