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 d'affiche avec l'alpha


Sujet :

SDL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    502
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 502
    Points : 227
    Points
    227
    Par défaut probleme d'affiche avec l'alpha
    bonsoir ,

    j'ai un probleme avec l'affichage de l'alpha : je n'arrive a comprendre pourquoi mon reste toujours en image alpha (transparente) enfaite je voudrais rendre mon image une fois sur 2 en alpha : alpha/normal etc..

    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
    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL.h>
     
     
     
     
     
     
    int main (int argc,char **argv)
     {
     
    SDL_Rect pos,postir,posalien,pospoint[10],posalien2;
    SDL_Surface *ecran=NULL, *carre=NULL, *tir=NULL ,*alien=NULL,*alien2=NULL;
    SDL_Surface *point[10]={NULL};
    SDL_Event event;
     
    	 int continuer=1,j=0,i; int tmp_alien=0,tmp_alien2=0;
     
    int v=0;int tmp=0,tmp_p=0;
     
    SDL_Init(SDL_INIT_VIDEO);                                  // initialisation de la video
    if (SDL_Init(SDL_INIT_VIDEO)==-1)                           // test de la video
      {
    	  fprintf(stderr,"error initialisation :%s",SDL_GetError());
    	  return (EXIT_FAILURE);
      }
      ecran=SDL_SetVideoMode(800,600,32,SDL_HWSURFACE | SDL_DOUBLEBUF); // creation de la video
                                         // curseur de la souris invisible
     
     
    for (i=0;i<10;i++)
      {
       if (point[i] !=NULL)
        {
     
    	fprintf(stderr,"erreur lors de initailisation : %s",SDL_GetError());
            return EXIT_FAILURE;
         }
    }
    pos.x=(800/2) -(50/2); // initialisation de la position du viseur carré
    pos.y=(600/2) -(50/2);
    for( i=0;i<10;i++)
    {
    pospoint[i].x=j;
    pospoint[i].y=0;
    j +=30;
    }
    int tmp_alien_par =0,tmp_alien_par2=0;
    int temps_actuel =0,temps_precedent=0;// initialisation du temps pour lançer aleatoirement l'image alien
    int alpha =0;
    alien=SDL_LoadBMP("/home/domnik/alien.bmp");
    alien2=SDL_LoadBMP("/home/domnik/alien2.bmp"); // initialisation et chargement de l'image alien
    for (i=0;i<10;i++)
    {
    point[i]=SDL_CreateRGBSurface(SDL_HWSURFACE,20,20,32,0,0,0,0); // creation des points
    }
    tir =SDL_CreateRGBSurface(SDL_HWSURFACE,10,10,32,0,0,0,0); // creation du tir (point rouge)
    carre=SDL_CreateRGBSurface(SDL_HWSURFACE,50,50,32,0,0,0,0); // creation du viseur (point blanc)
    SDL_ShowCursor(SDL_DISABLE);
      while (continuer)                                  // evenement
      {
     
     
     
     
    	  SDL_PollEvent(&event);                 // attente d'une action
    	  switch(event.type)
    	  {                                             
    		  case SDL_QUIT :continuer=0;break;             // si appuiyer sur la croix de la fenetre (quiter)
    		  case SDL_MOUSEMOTION : pos.x=event.motion.x;      // si la souris bouge alors bouger aussi le viseur
    		  pos.y=event.motion.y;break;
    		  case SDL_MOUSEBUTTONDOWN : postir.x=event.motion.x+22; // si on clic sur la souris 
    		  postir.y=event.motion.y+22;
    		        SDL_FillRect(tir,NULL,SDL_MapRGB(tir->format,255,0,0)); 
                            SDL_BlitSurface(tir,NULL,ecran,&postir); 
                               SDL_Flip(ecran);                        // a posit
     
                             if ((((postir.x >=posalien.x))&& (postir.x<=(posalien.x+100))&&(postir.y   >=(posalien.y)&&(postir.y<=posalien.y+100))))    // si la position du tir et entre l'image 
                                {
    				v++;					// alors augmente l'indice v
                                }
     
    		break;
               }	
     
     
    // compteur de temps toutes les 30 ms
             temps_actuel=SDL_GetTicks();  
    if (temps_actuel - temps_precedent >30)  
     { 
     
       tmp_alien++;tmp_alien2++;tmp_alien_par++;
       temps_precedent=temps_actuel;
      } 
     
     
    // si le temps est inferieur a 900 ms alors j'active l'alpha (30*30)
     
          if (tmp_alien<30)
           {
            alpha=1;
            }
             else  if (tmp_alien >=30&&tmp_alien <=60)  //alors si le tmp alien et entre 900 et 1800 ms
                {     alpha=0;                           // alors je desactive l'alpha et je positionne mon alien  
    posalien.x=rand()%600;posalien.y=rand()%400;         // aléatoirement ,je remets a 0 le temps
          tmp_alien=0;                   
        }    
     
     
        if (tmp_alien2==60)
          {
     
     
          posalien2.x=rand()%600;posalien2.y=rand()%400;
            tmp_alien2=0;tmp_alien=0;
          }
     
     
      if (v==10)
        {
           v=0;
        }
     
     
     
          SDL_FillRect(ecran,NULL,SDL_MapRGB(carre->format,2,25,255));    
          SDL_FillRect(carre,NULL,SDL_MapRGB(carre->format,255,255,255));	  
     
     
         if (alpha)                                                  // si j'ai activé l'alpha alors apliquer l'alpha
     
               {
              SDL_SetAlpha(alien,SDL_SRCALPHA,128);
              SDL_BlitSurface(alien,NULL,ecran,&posalien);
               }
                else                                                      // sinon blitter normalement 
                     { SDL_SetAlpha(alien,SDL_SRCALPHA,255);
        			 SDL_BlitSurface(alien,NULL,ecran,&posalien);
     
    		}
     
     
          SDL_BlitSurface(alien2,NULL,ecran,&posalien2); 
     
     
          SDL_BlitSurface(carre,NULL,ecran,&pos);
            for (i=0;i<v;i++)
        {
     
     
            SDL_FillRect(point[i],NULL,SDL_MapRGB(point[i]->format,25,25,22));
    	SDL_BlitSurface(point[i],NULL,ecran,&pospoint[i]);
          }    
     
         SDL_Flip(ecran);                
     
     
     
     
     
    }
     
     
     
     
     
     
     
     
     
     for (int i=0;i<10;i++)   // effacement des points,image,tir,viseur et quitter
     {	 
      SDL_FreeSurface(point[i]);
     }
     
      SDL_FreeSurface(tir);
      SDL_FreeSurface(carre);
      SDL_Quit();
      return (EXIT_SUCCESS);
     }
    merci !

  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
    C'est quoi ce code ?

    On est déjà passé par là :

    - Où est le test après SDL_SetVideoMode ?

    - Où est l'intérêt de tes 10 points, ils sont de mêmes couleurs ?

    - Où sont les tests après les appels SDL_CreateRGBSurface ?

    - Où sont les tests après les appels SDL_LoadBMP ?

    - On n'utilise pas SDL_PollEvent comme cela mais on test son retour, voir http://www.developpez.net/forums/sho...d.php?t=276536

    - Il y a plusieurs SDL_Flip dans une itération... C'est une erreur grave

    - ton code est indenté n'importe comment sur le code gérant l'alpha...

    - Tu as remis (ou laissé) des appels SDL_FillRect dans la boucle générales, ils pouvaient être sortis.

    Ensuite ton erreur est algorithmique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            // si le temps est inferieur a 900 ms alors j'active l'alpha (30*30)   
            if (tmp_alien<30)  
            {  
                alpha=1;
            }
            else if (tmp_alien >=30&&tmp_alien <=60) //alors si le tmp alien et entre 900 et 1800 ms  
            {
                alpha=0; // alors je desactive l'alpha et je positionne mon alien 
                posalien.x=rand()%600;
                posalien.y=rand()%400; // al�toirement ,je remets a 0 le temps  
                tmp_alien=0;
            }
    Regarde bien l'évolution de tmp_alien et tu devrais comprendre le problème.
    Jc

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    502
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 502
    Points : 227
    Points
    227
    Par défaut
    salut,

    c'est vrai je l'avoue, je suis tres bordelique : c'est parce que je fais des phases de tests
    c'est bon j'ai trouvé l'algorithmique car c'est vrai qu'au debut ,c'est assez difficile de gerer le temps (SDL_GetTicks()).

    mais voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
         if (tmp_alien>30&&tire%2==0)
           {    SDL_SetAlpha(alien,SDL_SRCALPHA,0);              
    posalien.x=rand()%600;posalien.y=rand()%400; 
            tmp_alien2=tmp_alien;       
          tmp_alien=0;tire++;                   
       }
          if (tire%2!=0&&tmp_alien>30)
             {
                SDL_SetAlpha(alien,SDL_SRCALPHA,128);
                tmp_alien=0;tire++;
              }
    tire etant le nombre de fois d'image ,le modulo sert de paire et de impaire.
    j'aurai aussi des questions car c'est vrai aussi que je ne sais pas bien ou placer les différente fonction de SDL comme SDL_FillSurface ,SDL_BlitSurface etc..
    quand mon code sera fini ,je te le montrerai ,enfaite c'est un petit prog pour une gamine a l'un de pote.

    merci !

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

Discussions similaires

  1. Probleme bouton afficher/masquer avec boucle for-each
    Par CouicCouic dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 25/11/2011, 08h48
  2. Débuter avec openGL, problem pour afficher des primitives
    Par kosa_nostra dans le forum OpenGL
    Réponses: 1
    Dernier message: 06/11/2011, 20h40
  3. Probleme d'affiche des bordures d'un tableau avec DOCTYPE
    Par TangoZoulou dans le forum Mise en page CSS
    Réponses: 11
    Dernier message: 02/02/2007, 12h38
  4. Réponses: 12
    Dernier message: 23/10/2002, 11h56
  5. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26

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