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 :

probleme de blit ?


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut probleme de blit ?
    salut,
    etant nouveau,sur le forum,je me presente je me nomme libellule_eternelle,
    je suis chef de rayon et je programme en amateur,jusqu'a maintenant je m'amusais avec DARK BASIC pro,je suis connu sur leur forum en tant que lulu.
    j'ai developpe 5 jeux complets en 3d avec DBPRO,mais on se retrouve vite limite au niveaux du fps,vous pouvez les tester sur mon site.
    je voudrais apprendre le c/c+ :sdl
    ,j'ai lu deux ou trois bouquins,suivi deux trois tutos sur ce forum et sur d'autres,.
    sur ce forum j'ai lu plusieurs tutos,mais les plus interressant ne sont pas termines.


    j'ai refais un prog,ou une balle traverse l'ecran aller/retour et ou le fond bouge en aller/retour aussi,jusque la aucun probleme
    ensuite j'ai rajoute une seconde balle un peu plus loin qui se decouvre l'orsque la deuxieme balle arrive vers sa position,mais encore un probleme de blit ?;la seconde balle s'efface.
    j'ai blitter la seconde balle sur la map mais si je blit la map en dernier,je ne vois pas les balles.

    J' AI REMIS LE NOUVEAU CODE DANS LE DERNIER POST

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    A mon avis c'est dû à un problème de compréhension de la fonction SDL_BlitSurface...

    En effet, tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        SDL_BlitSurface(fond,&posfond,screen,NULL);
        SDL_BlitSurface(balle2,&posfond,screen,&posbal2);
        SDL_BlitSurface(balle,NULL,screen,&posbal);
    Or :

    1) L'image de fond devrait être de la même taille que la fenêtre et le Blit devrait plutôt être comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        SDL_BlitSurface(fond,NULL,screen,NULL);
    Bien que personnelement, je préfére définir un SDL_Rect avec la position (0,0)...

    Ensuite la deuxième balle, je ne comprends pas pourquoi le deuxième paramétre vaut &posfond.... Cela devrait être NULL, non?

    Voici deux liens qui expliquent un peu le fonctionnement de la fonction SDL_BlitSurface :

    http://fearyourself.developpez.com/t...rt2/#L2.2.b.iv
    http://loka.developpez.com/tutoriel/sdl/sprites/


    Enfin, sans les images utilisés par le programme ou une image montrant le problème, il est difficile de vraiment comprendre le problème...

    Jc

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    le probleme est que le fond bouge aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_BlitSurface(fond,NULL,screen,NULL);
    si je fais ca le fond ne bouge plus .

    le deuxième paramétre vaut &posfond,c'est pour que la balle 2 reste a une position fixe,en fait quand le fond deroule,la balle deux bouge en meme temps que le fond.


  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Merci pour l'image je comprends mieux.

    1) Ton image de fond n'est pas assez grande par rapport à la taille de la fenêtre, cela ne semble pas te déranger. Mais si ton fond bouge, il faudrait quand même remettre la surface ecran à zéro, non ?

    2)
    Citation Envoyé par libellule_eternelle
    le probleme est que le fond bouge aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_BlitSurface(fond,NULL,screen,NULL);
    si je fais ca le fond ne bouge plus .

    le deuxième paramétre vaut &posfond,c'est pour que la balle 2 reste a une position fixe,en fait quand le fond deroule,la balle deux bouge en meme temps que le fond.
    Ok, c'est une erreur de compréhension de ce 2ème paramétre. Ce paramétre représente le rectangle qui sera copié à partir de la source. Donc quelle partie de la source SERA copiée. Le 4ème paramétre disant où est-ce qu'on copie dans la destination...

    Ce que tu voudrais serait plutôt la somme de la position dans posbal2 et posfond alors, non ?

    Deux dernières remarques :

    1) Il n'est pas nécessaire de charger deux fois l'image si c'est la même, tu aurais pu faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      balle=SDL_LoadBMP("balle.bmp");
      SDL_Rect posbal;
      posbal.x=0;
      posbal.y=200;
      SDL_SetColorKey(balle,SDL_SRCCOLORKEY,SDL_MapRGB(balle->format,255,0,255));
     
      balle2=balle;
    2) Serait-ce possible de joindre les images balle.bmp et fond.bmp pour que je puisse faire tourner l'application (j'ai la flemme d'en faire moi-même ) ?

    Jc

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Vu que je suis trop fatigué pour faire autre chose... Je vais regarder un peu plus le code proposé...

    Première remarque:

    Toujours mettre le cas default dans un switch même si cela donne :

    Car un compilateur bien réglé va faire la remarque que certains cas ne sont pas traités...

    Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_Init(SDL_INIT_VIDEO);
    Il faut toujours capturé le résultat d'une fonction ! (enfin dans 99% des cas)... Donc ceci donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if (SDL_Init(SDL_INIT_VIDEO) == -1)
        {
            fprintf(stderr, "Erreur lors de l'initialisation de la SDL : %s\n", SDL_GetError());
            return EXIT_FAILURE;
        }
    Même remarque pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	screen = SDL_SetVideoMode(600, 400, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
    Devrait avoir après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(screen==NULL)
      {
            fprintf(stderr, "Erreur lors de la creation de la surface screen : %s\n", SDL_GetError());
            return EXIT_FAILURE;
      }
    Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	fond=SDL_LoadBMP("image.bmp");
    	SDL_Rect posfond;
    	posfond.x=0;
    	posfond.y=0;
    	posfond.w=500;
    	posfond.h=400;
    	SDL_BlitSurface(fond,NULL,screen,&posfond);
    	SDL_Flip(screen);
    Il manque le test sur le chargement de l'image et
    que faites-vous si vous changer d'image? Vous allez mettre à jour posfond.w et posfond.h ??

    Ce serait mieux comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	SDL_Rect posfond;
    	fond=SDL_LoadBMP("image.bmp");
            if(fond==NULL) 
               {
               fprintf(stderr,"Erreur dans le chargement de image.bmp\n");
               return EXIT_FAILURE;
               }
    	posfond.x=0;
    	posfond.y=0;
    	posfond.w=fond->w;
    	posfond.h=fond->h;
    	SDL_BlitSurface(fond,NULL,screen,&posfond);
    	SDL_Flip(screen);
    Après je vois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	posbal2.x=500;
    	posbal2.y=-400;
    Attention, ceci (l'utilisation du -400) fonctionne sous la SDL mais pas forcément sous toutes les API. Ce n'est donc pas forcément une bonne idée mais c'est relatif (si on utilise la SDL cela fonctionne).

    Enfin, j'aurais mis ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    		/*On veut que la balle 2 soit toujours au meme endroit par
    		rapport au fond...*/
    		posbal2.x = posfond.x+depposbal2.x;
    		posbal2.y = depposbal2.y;
     
    		/*On met l'ecran en noir*/
    		SDL_FillRect(screen,NULL,0);
    		/*On dessine le fond*/
    		SDL_BlitSurface(fond,&posfond,screen,NULL);
    		SDL_BlitSurface(balle2,NULL,screen,&posbal2);
    		SDL_BlitSurface(balle,NULL,screen,&posbal);
    		SDL_Flip(screen);
    Avec depposbal2 initialisé comme tu as initialisé la structure posbal2...

    Jc

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    merci ,de prendre du temps pour eclairer ma lanterne ,fearyourself.
    donc si j'ai bien compris pour les valeurs du blit(image,taille de cette image,ecran,l'endroit sur l'ecran).
    pour les remarques la valeur defaut du switch,et le resultat des fonctions,je le sais ,mais tu as raisons,il faut que je garde de bonnes habitudes.

    par contre :
    Avec depposbal2 initialisé comme tu as initialisé la structure posbal2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    balle2=SDL_LoadBMP("balle.bmp");
      SDL_Rect posbal2;
      posbal2.x=500;
      posbal2.y=0;
    c'est a dire que je creer une sturcture depposbal2 ?
    ou je donne les valeurs x et y a depplsbal2 ?
    ou les deux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SDL_Rect depposbal2;
    depposbal2.x=500;
    depposbal2.y=0;
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    #include <SDL/SDL.h>
     
     
     
    int main(int argc ,char **argv)
    {
       SDL_Surface *screen;
       SDL_Surface *fond;
       SDL_Surface *balle;
       SDL_Surface *balle2;
       SDL_Event event;   
     
     int continuer = 1,aller=0;
     
     
      SDL_Init(SDL_INIT_VIDEO);
      if (SDL_Init(SDL_INIT_VIDEO) == -1)
        {
            fprintf(stderr, "Erreur lors de l'initialisation de la SDL : %s\n", SDL_GetError());
            return EXIT_FAILURE;
        }
     
      SDL_WM_SetCaption("Toujours des tests...",NULL);
      screen = SDL_SetVideoMode(600, 300, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
      if(screen==NULL)
      {
            fprintf(stderr, "Erreur lors de la creation de la surface screen : %s\n", SDL_GetError());
            return EXIT_FAILURE;
      }
     
      SDL_Rect posfond;
      fond=SDL_LoadBMP("image.bmp");
      if(fond==NULL) 
               {
               fprintf(stderr,"Erreur dans le chargement de image.bmp\n");
               return EXIT_FAILURE;
               }
        posfond.x=0;
    	posfond.y=0;
    	posfond.w=fond->w;
    	posfond.h=fond->h;
    	SDL_BlitSurface(fond,NULL,screen,&posfond);
    	SDL_Flip(screen);
     
      SDL_ShowCursor(0);
     
      balle=SDL_LoadBMP("balle.bmp");
      if(balle==NULL) 
               {
               fprintf(stderr,"Erreur dans le chargement de image.bmp\n");
               return EXIT_FAILURE;
               }
     
      SDL_Rect posbal;
      posbal.x=0;
      posbal.y=100;
      SDL_SetColorKey(balle,SDL_SRCCOLORKEY,SDL_MapRGB(balle->format,255,0,255));
     
     
     
      balle2=balle;
      SDL_Rect posbal2;
      posbal2.x=100;
     posbal2.y=200;
      SDL_SetColorKey(balle2,SDL_SRCCOLORKEY,SDL_MapRGB(balle2->format,255,0,255));
      SDL_BlitSurface(balle2,&posfond,screen,&posbal2);
      SDL_Flip(screen);
     
      SDL_Rect depposbal2;  //je crois pas que ce soit ca
      depposbal2.x=500;
      depposbal2.y=0;
     
     
        while (continuer)
    {    
     
        SDL_PollEvent(&event);                            
        switch(event.type)
        {
     
            case SDL_QUIT:
                continuer = 0;
            break;
     
            case SDL_KEYDOWN:
            switch (event.key.keysym.sym)
            {
                  case SDLK_ESCAPE:
            continuer = 0;
            break;  
     
              default:
            break; 
     
            }
            break;
        }
     
                    posbal.x+=aller;    
                    posfond.x+=aller;
                    if (posbal.x<10) aller=1;
                    if (posbal.x>400) aller=-1;
     
           /*On veut que la balle 2 soit toujours au meme endroit par
    		rapport au fond...*/
    		posbal2.x = posfond.x+depposbal2.x;
    		posbal2.y = depposbal2.y;
     
    		/*On met l'ecran en noir*/
    		SDL_FillRect(screen,NULL,0);
    		/*On dessine le fond*/
    		SDL_BlitSurface(fond,&posfond,screen,NULL);
    		SDL_BlitSurface(balle2,NULL,screen,&posbal2);
    		SDL_BlitSurface(balle,NULL,screen,&posbal);
    		SDL_Flip(screen);
    }
        SDL_ShowCursor(1);		// reactive la souris
        SDL_FreeSurface(fond); //on efface tout
        SDL_FreeSurface(balle);//     "
        SDL_FreeSurface(balle2);//     "
        SDL_Quit();				// quitte SDL
    	return EXIT_SUCCESS;				// quitte le programme
    }
    images et codes source

    ps :desole de mettre autant de temps mais fini les vacances pour moi.

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

Discussions similaires

  1. Probleme de blit
    Par sorry60 dans le forum SDL
    Réponses: 4
    Dernier message: 02/02/2006, 23h38
  2. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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