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

  1. #1
    Candidat au Club
    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
    Points : 2
    Points
    2
    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 éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    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
    Candidat au Club
    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
    Points : 2
    Points
    2
    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 éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    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 éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    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
    Candidat au Club
    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
    Points : 2
    Points
    2
    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.

  7. #7
    Expert éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par libellule_eternelle
    donc si j'ai bien compris pour les valeurs du blit(image,taille de cette image,ecran,l'endroit sur l'ecran).
    Non :

    image source, zone qu'on va copier, image destination, zone destination

    Remarque : pour la zone destination, seule la position est prise en compte...

    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.
    En effet,

    c'est a dire que je creer une sturcture depposbal2 ?
    ou je donne les valeurs x et y a depplsbal2 ?
    ou les deux.
    Les deux, la variable depposbal2 sert de position de base par rapport au fond qui bouge. posbal2 sera mise à jour en fonction de la position du fond et de la position depposbal2...

    Le mieux serait de l'avoir en .zip parce que sous Linux .... (je suis chiant je le sais)

    ps :desole de mettre autant de temps mais fini les vacances pour moi.
    [/quote]

    Pas de problème, les forums sont là pour que chacun avance à son rythme...

    Par rapport à la solution que tu as mise, quels sont encore les problèmes ?

    Jc

  8. #8
    Candidat au Club
    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
    Points : 2
    Points
    2
    Par défaut
    zip

    en fait je n'ai jamais developpe de la 2d mais de la 3d (en dark basic pro)
    et le probleme vient aussi peut etre de ma facon d'aborder la 2d.
    ce programme me sert a comprendre comment faire defiler un background,placer mon sprite.et placer un ennemi.
    merci pour l'explication du blit.

    LE PROBLEME:
    la premiere planete se deplace nickel.
    le fond se deplace nickel.
    la seconde planete se deplace (on dirait que posbal2=xposbal+100) et
    donc le planete 2 precede la planete 1 mais bouge comme elle.
    moi je voudrais que xposbal2=posfond+400.
    c'est a dire que la planete soit situe a par exemple x=400 par rappor au x=0 de posfond et que quand le fond bouge la planete 2 apparaisse un peu comme un decor de l'image de fond et qu'elle se deplace comme le fond
    mais a la position donne en l'occurence la a x=400

  9. #9
    Expert éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ok, je viens d'atterrir (le terme semble judicieux vu ton fond.... )

    Ce que tu veux faire c'est définir la position globale de ta balle en utilisant une variable comme depposbal2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SDL_Rect posbal2,depposbal2;
      depposbal2.x=400;
      depposbal2.y=10;
    Ensuite, lors du calcul de la position de la balle2 tu dois utiliser la position du fond...

    Si le fond est callé sur la gauche, alors posfond.x == 0 donc on voudra que posbal2.x soit égal à 400 (par exemple)

    Par contre, si le fond est décallé sur la droite, par exemple posfond.x == 100, alors on voudra que la position de la balle2 soit décalé sur la gauche de 100...
    Donc posbal2.x==300....

    Ceci donnera l'impression que la balle2 reste immobile et bouge avec ton fond. Par rapport à la position de la balle1 qui bouge avec le fond.

    Pour faire ce calcul, il suffit de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    posbal2.x = depposbal2.x - posfond.x;
    posbal2.y = depposbal2.y - posfond.y;
    SDL_BlitSurface(balle2,NULL,screen,&posbal2);
    Par contre, arrête de mettre du code de rendu avant la boucle événementielle, cela ne fait qu'allourdir ton code... Laisse le code dans la boucle uniquement ou dans une fonction aff par exemple... Cela suffit amplement...

    Jc

  10. #10
    Candidat au Club
    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
    Points : 2
    Points
    2
    Par défaut
    merci,beaucoup,fearyourself.

  11. #11
    Expert éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par libellule_eternelle
    merci,beaucoup,fearyourself.
    De rien, c'était un plaisir

    Jc

+ 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