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 :

Tableau de sprites


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Tableau de sprites
    Salut O programmeurs et programmeuses. Allons droit au but. Comme l'indique le nom du sujet j'aimerais savoir comment faire apparaitre plusieurs sprites identiques ("./arbre.bmp"), un sorte de tableau de sprites pour etre plus precis. J'ai essayé ce code que voici mais il n'affiche qu'un arbre à l'ecran :

    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
    #include <SDL/SDL.h>
    #include <stdlib.h>
     
    SDL_Surface  *Screen, *objet;
     
    int main&#40;int argc, char *argv&#91;&#93;&#41;
    &#123;
       char *szMap&#91;5&#93;&#91;5&#93;=&#123;'\0'&#125;;
       int i, j;
     
       if &#40;SDL_Init &#40;SDL_INIT_VIDEO&#41; < 0&#41; 
       &#123;
          fprintf &#40;stderr, "Impossible d'initialiser SDL &#58; %s\n", SDL_GetError &#40;&#41;&#41;;
          exit &#40;1&#41;;
       &#125;
       atexit &#40;SDL_Quit&#41;;
     
       Screen = SDL_SetVideoMode &#40;640, 480, 16, SDL_SWSURFACE | SDL_DOUBLEBUF&#41;;
       if &#40;Screen == NULL&#41; 
       &#123;
          fprintf &#40;stderr, "Impossible d'initialiser le mode video &#58; %s\n", SDL_GetError &#40;&#41;&#41;;
          exit &#40;2&#41;;
       &#125;
     
       for&#40; i =0 ; i < 5 ; i++&#41;
       &#123;
          for&#40; j = 0 ; j < 5 ; j++&#41;
          &#123;
             szMap &#91;i&#93;&#91;j&#93; = "./arbre.bmp";
          &#125;
       &#125;
     
       for&#40; i =0 ; i < 5 ; i++&#41;
       &#123;
          for&#40; j = 0 ; j < 5 ; j++&#41;
          &#123;
             objet = SDL_LoadBMP &#40;szMap &#91;i&#93;&#91;j&#93;&#41;;
          &#125;
       &#125;
     
       while &#40;1&#41;
       &#123;
          SDL_Event event;
          if &#40;SDL_PollEvent &#40;&event&#41; && event.type==SDL_QUIT&#41;
             break;
          SDL_FillRect&#40;Screen,NULL,SDL_MapRGB&#40;Screen->format,255,0,255&#41;&#41;;
          SDL_BlitSurface&#40;objet,NULL,Screen,NULL&#41;;
          SDL_Flip&#40;Screen&#41;;
       &#125;
     
       SDL_FreeSurface&#40;Screen&#41;;
       SDL_FreeSurface&#40;objet&#41;; 
     
       return 0;
    &#125;
    je vous serais reconnaissant de m'aider SVP. Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     char *szMap[5][5]={'\0'}; 
    <...>
    for( i =0 ; i < 5 ; i++)
    {
    for( j = 0 ; j < 5 ; j++)
    {
    szMap [i][j] = "./arbre.bmp";
    }
    }
    Ce n'est pas comme ça qu'on met du texte dans une chaine. On utilise la fonction strcpy(dest,source). T'as pas d'erreur à la compilation ?
    Par ailleurs, je ne connais pas la SDL mais tu peux certainement tester le retour de la fonction SDL_LoadBMP(). Tu verrais qu'il y a certainement une erreur lors du chargement de tes bitmap.

    Par ailleurs, ton élément 'objet' perd son adresse à chaque passage.
    Faudrait faire un tableau pour 'objet' .

    Nas'

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Salut,

    Pour ton tableau, tu peut procéder de cette maniere:

    Tu créé une structure avec ce dont tu as besoin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct st_sprite
    &#123;
       SDL_Surface  * image;
       double x;
       double y;
    &#125;st_sprites;
    Ensuite, tu peut créer une fonction qui renvoie un element vers cette structure pour créer un sprites en remplissant les champs (on peut en mettre plusieurs dans un tableau de pointeurs vers cette structure )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct st_sprites * create_sprites &#40;SDL_Surface * source&#41;
    &#123;
        /* Allocation dynamique de la stucture pour les balles */
        struct st_sprites * one_sprite;
        one_sprite = malloc &#40;sizeof &#40;struct st_sprite&#41;&#41;;
     
        one_sprite -> image = source;
        one_sprite -> x = /* une valeur */
        one_sprite -> y = /* une valeur */
     
        return one_sprite;
    &#125;
    Par la suite, dans une boucle for, tu peut faire afficher les images de ce tableaux de structure de sprite en créant une fonction qui va Blitter les elements à chaque itération de ta boucle for:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void sdl_draw_sprites &#40;SDL_Surface * screen, struct st_sprite * one_sprite&#41;
    &#123;
        /* On recopie le rectangle du sprite dans le buffer d'affichage */
     
        SDL_BlitSurface &#40;one_sprite->source, ..., screen, ...&#41;;
    &#125;
    J'espère que ces infos te seront utiles, je pense que c'est le meilleur moyen de procéder, c'est d'ailleurs cette technique que j'utilise pour mes tableau de sprites
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    si tu debutes, je te conseille allegro pour tout ce qui est graphique, elle est tres ludique et parfaite pour la 2d

    si tu veux plus d infos dis le moi je te filerai les liens
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Si tu veux afficher plusieurs arbres sur un meme ecran je te conseil:
    -créer un tableau[x][y] qui a pour valeur 0 ou 1(=arbres)

    -tu crées deux boucles for imbriquées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     for&#40;y=0;y>100;y++&#41;
               &#123;
                    for&#40;x=0,x>100;x++&#41;
                      &#123;
                            tadestination.x=x*&#40;taille x de l'image&#41;;
                            tadestination.y=y*&#40;taille yde l'image&#41;;
                            objet=tableau&#91;x&#93;&#91;y&#93;;
                              if &#40;objet==1&#41;
                                SDL_BlitSurface&#40;arbre,NULL,screen,&tadestination&#41;;
     
                        &#125;
                 &#125;

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par CSoldier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct st_sprites * create_sprites &#40;SDL_Surface * source&#41;
    &#123;
        /* Allocation dynamique de la stucture pour les balles */
        struct st_sprites * one_sprite;
        one_sprite = malloc &#40;sizeof &#40;struct st_sprite&#41;&#41;;
     
        one_sprite -> image = source;
        one_sprite -> x = /* une valeur */
        one_sprite -> y = /* une valeur */
     
        return one_sprite;
    &#125;
    Tu as oublié de vérifier la valeur de retour de malloc()... Si one_sprite vaut NULL, l'accès en écriture à one_sprite->image peut faire un joli segfault...

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Moi personnellement, je trouve que le fait de créer une structure avec toutes les données relatives au sprite et d'en faire un tableau de structure serais une bonne solution mais bon, cela n'engage que moi
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par alveric
    Citation Envoyé par CSoldier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct st_sprites * create_sprites &#40;SDL_Surface * source&#41;
    &#123;
        /* Allocation dynamique de la stucture pour les balles */
        struct st_sprites * one_sprite;
        one_sprite = malloc &#40;sizeof &#40;struct st_sprite&#41;&#41;;
     
        one_sprite -> image = source;
        one_sprite -> x = /* une valeur */
        one_sprite -> y = /* une valeur */
     
        return one_sprite;
    &#125;
    Tu as oublié de vérifier la valeur de retour de malloc()... Si one_sprite vaut NULL, l'accès en écriture à one_sprite->image peut faire un joli segfault...
    Heu oui désolé, mais j'ai fait du vite fait à titre d'exemple c'est tout
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Membre régulier Avatar de kaisse
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 100
    Points : 117
    Points
    117
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      while &#40;1&#41; 
       &#123; 
          SDL_Event event; 
          if &#40;SDL_PollEvent &#40;&event&#41; && event.type==SDL_QUIT&#41; 
             break; 
          SDL_FillRect&#40;Screen,NULL,SDL_MapRGB&#40;Screen->format,255,0,255&#41;&#41;; 
          SDL_BlitSurface&#40;objet,NULL,Screen,NULL&#41;; 
          SDL_Flip&#40;Screen&#41;; 
       &#125;
    Fait comme CSoldier a dit, parce que avec le code ci-dessus, tu dessines une infinité de fois l'arbre mais ... toujours au même endroit: donc forcément, tu n'en vois qu'un apparaitre (pas sur déjà, vu que ca boucle à l'infini, ca peut ne pas mettre à jour la fenetre).

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    j'ai réussi!!!!!
    voila 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
    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
     
    #include <SDL/SDL.h>
    #include <stdlib.h>
    #include "st_sprite.h"
     
     
    int main&#40;int argc, char *argv&#91;&#93;&#41;
    &#123;
     
          SDL_Rect rect&#91;12&#93;&#91;20&#93;;
          SDL_Surface  *ecran;
          st_sprite *sprite&#91;12&#93;&#91;20&#93;;
          int i,j,s,a;
     
          if &#40;SDL_Init &#40;SDL_INIT_VIDEO&#41; < 0&#41; &#123;
            fprintf &#40;stderr, "Impossible d'initialiser SDL &#58; %s\n", SDL_GetError &#40;&#41;&#41;;
            exit &#40;1&#41;;
          &#125;
          atexit &#40;SDL_Quit&#41;;
     
     
          ecran = SDL_SetVideoMode &#40;640, 480, 16, SDL_SWSURFACE | SDL_DOUBLEBUF /*| SDL_FULLSCREEN*/&#41;;
          if &#40;ecran == NULL&#41; &#123;
            fprintf &#40;stderr, "Impossible d'initialiser le mode video &#58; %s\n", SDL_GetError &#40;&#41;&#41;;
            exit &#40;2&#41;;
          &#125;
     
     
          for&#40;i=0;i<12;i=i+1&#41;  
          &#123;   
             for&#40;j=0;j<20;j=j+1&#41;  
             &#123;     
              sprite&#91;i&#93;&#91;j&#93;=&#40;st_sprite*&#41;malloc&#40;sizeof&#40;st_sprite&#41;&#41;;
              if&#40;sprite&#91;i&#93;&#91;j&#93;==NULL&#41;
              exit &#40;3&#41;; 
     
              sprite&#91;i&#93;&#91;j&#93;->image=SDL_LoadBMP&#40;"./herbe.bmp"&#41;;
             &#125;    
          &#125;
          a = 0;    
          s = 0;
          for&#40;i=0;i<12;i=i+1&#41;
          &#123; 
            for&#40;j=0;j<20;j=j+1&#41;  
             &#123;       
              rect&#91;i&#93;&#91;j&#93;.x = s;
              rect&#91;i&#93;&#91;j&#93;.y = a;
              rect&#91;i&#93;&#91;j&#93;.w = 32;
              rect&#91;i&#93;&#91;j&#93;.h = 40;
              s = s + 32;
             &#125;
             s = 0;
             a = a + 40;       
          &#125;          
     
           SDL_WM_SetCaption &#40;"Je dédie ce programme à ma chère soeur Hasna", NULL&#41;;
    //////////////////////////////////////////////////////////////////////////////////       
          while &#40;1&#41;        //////////////////////////////////////////////////////////
          &#123;
           SDL_Event event;
           if&#40;SDL_PollEvent &#40;&event&#41; && event.type==SDL_QUIT&#41;break;
           //if&#40;SDL_PollEvent &#40;&event&#41; && event.type==SDL_KEYDOWN&#41;
           &#123;
              if&#40;event.key.state == SDL_PRESSED&#41;
              &#123;
                 if&#40;event.key.keysym.sym == SDLK_ESCAPE&#41;break;
              &#125;    
           &#125;    
           SDL_FillRect&#40;ecran,NULL,SDL_MapRGB&#40;ecran->format,255,0,255&#41;&#41;;
     
           for&#40;i=0;i<12;i=i+1&#41;
           &#123; 
             for&#40;j=0;j<20;j=j+1&#41;  
             &#123;     
     
                SDL_BlitSurface&#40;sprite&#91;i&#93;&#91;j&#93;->image,NULL,ecran,&rect&#91;i&#93;&#91;j&#93;&#41;;
             &#125;
           &#125;     
            SDL_Flip&#40;ecran&#41;;  
          &#125;         /////////////////////////////////////////////////////////////////
      /////////////////////////////////////////////////////////////////////////////// 
          SDL_FreeSurface&#40;ecran&#41;;
     
          for&#40;i=0;i<12;i=i+1&#41;
           &#123; 
             for&#40;j=0;j<20;j=j+1&#41;  
             &#123;    
               SDL_FreeSurface&#40;sprite&#91;i&#93;&#91;j&#93;->image&#41;;
     
             &#125;    
           &#125;    
     
           for&#40;i=0;i<12;i=i+1&#41;
           &#123; 
             for&#40;j=0;j<20;j=j+1&#41;  
             &#123;    
     
               free&#40;sprite&#91;i&#93;&#91;j&#93;&#41;;
             &#125;    
           &#125;    
     
     
     
      ///////////////////////////////////////////////////////////////////////////////////    
      return 0;
    &#125;

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/03/2006, 18h38
  2. Réponses: 2
    Dernier message: 27/05/2002, 20h46
  3. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 13h21
  4. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 12h15
  5. Réponses: 4
    Dernier message: 13/05/2002, 17h43

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