IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Problème de déplacement


Sujet :

SDL

  1. #1
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut Problème de déplacement
    Bonjour à tous !!!

    Je débute en SDL et j'ai donc fais quelques tutoriaux trouvé un peut partout.
    J'aimerais commencer un petit casse brique simple histoire de me lancer un petit defis. Pour cela j'ai crée une fenetre, mis une surface de fond puis crée un palet "rectangle". Je cherche à faire déplacer ce rectangle en appuyant sur la touche "f" du clavier, j'ai donc utilisé des event. Je me suis rendu compte qu'en deplaçant le rectangle, il restais une trace, comme si l'image n'etait pas réactualisé. j'ai donc fais un refresh (SDL_FLIP) mais là, il ne se passe plut rien, le programme tourne, la touche pour quitter (echap) fonctionne mais rien ne se passe quand j'appuis sur la touche qui est censé déplacer le rectangle. Je comprend pas pourquoi il se passe rien

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL.h> 
     
    int main(int argc, char *argv[])
    {
        // declaration de la surface
        SDL_Surface *palet = NULL; 
        int done = 0;
        SDL_Event event;
        SDL_Surface *ecran = NULL;
        SDL_Rect position;
        SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK);
        SDL_WM_SetIcon(SDL_LoadBMP("images/sdl_icone.bmp"), NULL);
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);  
        // mise en mémoire de la surface
        palet = SDL_CreateRGBSurface(SDL_HWSURFACE, 100, 20, 32, 0, 0, 0, 0);
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));        
        // couleur du palet
        SDL_FillRect(palet, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        position.x = 250;
        position.y = 450;
        SDL_BlitSurface(palet, NULL, ecran, &position);
        if (ecran == NULL)
        {
           fprintf(stderr, "impossible de charger le mode vidéo : %s\nq", SDL_GetError());
           exit(EXIT_FAILURE);
        }
        SDL_WM_SetCaption("Casse Brique", NULL);
        while (!done)
        {
              while(SDL_PollEvent(&event))
              {
                switch(event.type)
                {
                  case SDL_QUIT:
                       done = 1;
                       break;
                  case SDL_KEYUP:
                       if(event.key.keysym.sym == SDLK_ESCAPE)
                       {
                       done = 1;
                       }
                       break;
                  case SDL_KEYDOWN:
                       if(event.key.keysym.sym == SDLK_f)
                       {
                        position.x = position.x + 5;
                        SDL_BlitSurface(palet, NULL, ecran, &position);
                        SDL_Flip(palet);
                       }
                       break;                   
                  default:
                          break;
                }                          
              }             
        }
        SDL_FreeSurface(palet);
        SDL_Quit();
        return EXIT_SUCCESS;
    }
    je me permet de mettre ton ce code pour que vous puissiez avoir l'aperçu complet car je doute de la position de mes lignes (meme si je pense que ça devrais etre bon)

    Merci par avance

  2. #2
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    je n'ai pas trop regarder ton programme car je dois partir (à la limite je regarderais en detail ce soir), mais ton SDL_Flip() est mal placé

    Tu dois le placer dan ta boucle principale mais avant la boucle des events :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while (!done) {
      if( SDL_Flip( screen ) == -1 ) { 
        return 1; 
      }
      while(SDL_PollEvent(&event)) {
      ...
      }
    }
    voila, si tu le souhaites ce soir je pourrais te passer aussi le code d'un tetris complet en SDL fait par le magazine Code(R) afin que tu puisses le decortiquer

  3. #3
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    J'ai rajouté le ptit bout de code que tu ma donné et je l'ai mis comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        while (!done)
        {
      if(SDL_Flip(ecran) == -1 ) {
        return 1;
      }
    Toujours rien (logique lol). J'ai essayé de mettre SDL_Flip(ecran) dans la boucle ce qui ma donnée un blocage du programme

    Je voit pas comment faire là

  4. #4
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    Finalement j'ai trouvé la solution par hasard en cherchant sur google

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
              case SDL_KEYDOWN:
                   if(event.key.keysym.sym == SDLK_f)
                   {
                    position.x = position.x + 5;
                    position.y = position.y;
                    // effacement de l'ecran
                    SDL_FillRect(ecran,NULL,0);
                    SDL_BlitSurface(palet, NULL, ecran, &position);
                    SDL_Flip(ecran);
                   }
    Il semblerais qu'il faut faut re-remplir la surface de l'ecran avec ces paramètres (nulles) pour effacer (rafraichir)

    Seul problème, si je change la couleur de fond du depart (en rouge par exemple) ça met du noir après quand j'appuie sur la touche

  5. #5
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    C'est comme ça que ça se passe avec SDL. A chaque tour de boucle il faut tout redessiner, fond y compris.

    Ca veut dire que si tu veux un fond rouche, passe une autre valeur que NULL à SDL_FillRect() et le tour est joué. Sinon dans ton code effectivement tu devrais blitter et flipper l'écran dans la boucle while(!done) et pas dans ta gestion des événements. Si rien ne bouge tout se reactualise quand même.

    Et initialise SDL encore avec le flag SDL_DOUBLEBUF sinon t'auras pas du double buffering donc ton appel à SDL_Flip() ne sert à rien.

  6. #6
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    exactement, tout est dit ^^

  7. #7
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    J'ai suivis vos conseils et j'arrive à faire avancer le personnage sans problème, avec la gestion de la couleur de transparence et meme à poser ma premiere tuile de map

    Maintenant faudras que je trouve une solution pour gerer les cartes car la création manuelle de chaque tuile est un peut embettant à mettre en oeuvre. J'ai trouvé des tutoriaux mais ils me semble assez complexe, va falloir que j'improvise

    Encore merci beaucoup pour vos conseils

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [HTML][Image] Placement de la zone d'option
    Par olivangel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 09/11/2004, 13h28
  2. Réponses: 2
    Dernier message: 05/10/2004, 22h43
  3. Placement aléatoire
    Par Steph82 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 02/09/2003, 12h07
  4. Placement des balises avec DTD
    Par Keul125 dans le forum Valider
    Réponses: 4
    Dernier message: 28/05/2003, 12h08
  5. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo