begin process at 2012 05 29 17:07:56
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

Autre

 > 

Problème fenêtre SDL sous Linux


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème fenêtre SDL sous Linux

mardi 12 mai 2009 à 14:36:29 | Problème fenêtre SDL sous Linux

Neofabiensama

Bonjour,

Je poste aujourd'hui car je suis à cours d'idée sur un problème de fenêtre SDL. Je travaille actuellement sur un projet de visualisation 2D d'une onde dans un guide d'onde. J'ai donc créé un programme créant une fenêtre affichant des images de l'onde à la suite, ce qui fait une petite animation. Ce programme fonctionne parfaitement sur Windows avec Dev C++, mais je dois le passer sous linux (ubuntu) pour la fin de mon projet. Et là, ca ne fonctionne plus. Mon programme ne crée qu'une seule image puis s'arrete. En créant une nouvelle feneêtre à chaque image, le programme fonctionne, mais l'animation est gachée par l'apparition de chaque nouvelle fenêtre.

Je n'ai aucun problème ou erreur de compilation et les libraires SDL ont l'air de fonctionner correctement.
Voici mon code principal:

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <unistd.h>
#include <string.h>

void pause2();
void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel);
Uint32 obtenirPixel(SDL_Surface *surface, int x, int y);

int main(int argc, char *argv[])            //Main
{                                           //

     int c;
     FILE * fichier;    
     int tempo,i=0,j;
     char chaine[10] = "";
     int image[7656],k;
     int matriceimage[116][66];  
     char filename[30];
     

      SDL_Surface *ecran = NULL; // Le pointeur qui va stocker la surface de l'écran
      SDL_Init(SDL_INIT_VIDEO);
                                           
      ecran=SDL_SetVideoMode(116, 66, 32, SDL_HWSURFACE |SDL_RESIZABLE); 
     
    
     //while(1)
     //{
     
     for(c=100;c<399;c+=2)
     {                   
     sprintf(filename,"%d.txt", c);
     fichier=fopen(filename,"r");     //Ouverture des fichiers
    
     //fichier=fopen("200.txt","r");     //Ouverture des fichiers
 
    if (fichier != NULL)
    {

        while (fgets(chaine, 10, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
        {
            tempo=atoi(chaine);                    //Conversion chaine->entier
            image[i]=tempo;                        //Remplissage image
            i++;                                   //Incrémentation de i
                     
        }
         
      //ecran=SDL_SetVideoMode(116, 66, 32, SDL_HWSURFACE |SDL_RESIZABLE); 
    
           
      k=0;                               //Creation de la matrice
      for(i=65;i>=0;i--)                 //
      {                                  //
         for(j=0;j<116;j++)              //
         {                               //
          matriceimage[j][i]=image[k];   //
          k++;                           //
         }                               //
      }                                  //
 
      
       
      SDL_LockSurface(ecran); /*On bloque la surface*/

                      
      for(i=0;i<116;i++)
      {
      for(j=0;j<66;j++)
      {
         
      fprintf(stderr,"%d  %d  \n",i,j);
      Uint32 pixel;
      Uint8 r,v,b,a;
     
      int couleur=matriceimage[i][j];
     
     
      pixel=obtenirPixel(ecran,i,j);
      SDL_GetRGBA(pixel, ecran->format, &r, &v, &b, &a);
     
      r=couleur;
      v=couleur;
      b=couleur;
      a=255;

      pixel=SDL_MapRGBA(ecran->format, r, v, b, a);

      definirPixel(ecran,i,j,pixel);

      }
      }

     
      SDL_Flip(ecran);
      SDL_UnlockSurface(ecran); /*On libère la surface, elle peut être utilisée pour une autre tâche*/
      sleep(1);
     

      }
      }
      //}
     
     
      /*for(c=0;c<399;c+=2)
      {
      printf("essai");
      sprintf(filename,"%d.txt", c);
      remove(filename);
      }*/
     
      pause2();
      SDL_Quit();
     
         
           
      return EXIT_SUCCESS;
                               
}                                                       

////////////////////////////////////////////////////////////////////////////////

void pause2()                                //fonction pause
{                                           //
    int continuer = 1;                      //
    SDL_Event event;                        //
                                            //
    while (continuer)                       //
    {                                       //
        SDL_WaitEvent(&event);              //
        switch(event.type)                  //
        {                                   //
            case SDL_QUIT:                  //
                continuer = 0;              //
        }                                   //        
    }                                       //
}                                           //



void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
    /*nbOctetsParPixel représente le nombre d'octets utilisés pour stocker un pixel.
    En multipliant ce nombre d'octets par 8 (un octet = 8 bits), on obtient la profondeur de couleur
    de l'image : 8, 16, 24 ou 32 bits.*/
    int nbOctetsParPixel = surface->format->BytesPerPixel;
    /*Ici p est l'adresse du pixel que l'on veut modifier*/
    /*surface->pixels contient l'adresse du premier pixel de l'image*/
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel;

    /*Gestion différente suivant le nombre d'octets par pixel de l'image*/
    switch(nbOctetsParPixel)
    {
        case 1:
            *p = pixel;
            break;

        case 2:
            *(Uint16 *)p = pixel;
            break;

        case 3:
            /*Suivant l'architecture de la machine*/
            if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
            {
                p[0] = (pixel >> 16) & 0xff;
                p[1] = (pixel >> 8) & 0xff;
                p[2] = pixel & 0xff;
            }
            else
            {
                p[0] = pixel & 0xff;
                p[1] = (pixel >> 8) & 0xff;
                p[2] = (pixel >> 16) & 0xff;
            }
            break;

        case 4:
            *(Uint32 *)p = pixel;
            break;
    }
}




/* ********************************************************************* */
/*obtenirPixel : permet de récupérer la couleur d'un pixel
Paramètres d'entrée/sortie :
SDL_Surface *surface : la surface sur laquelle on va récupérer la couleur d'un pixel
int x : la coordonnée en x du pixel à récupérer
int y : la coordonnée en y du pixel à récupérer

Uint32 resultat : la fonction renvoie le pixel aux coordonnées (x,y) dans la surface
*/
Uint32 obtenirPixel(SDL_Surface *surface, int x, int y)
{
    /*nbOctetsParPixel représente le nombre d'octets utilisés pour stocker un pixel.
    En multipliant ce nombre d'octets par 8 (un octet = 8 bits), on obtient la profondeur de couleur
    de l'image : 8, 16, 24 ou 32 bits.*/
    int nbOctetsParPixel = surface->format->BytesPerPixel;
    /* Ici p est l'adresse du pixel que l'on veut connaitre */
    /*surface->pixels contient l'adresse du premier pixel de l'image*/
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel;

    /*Gestion différente suivant le nombre d'octets par pixel de l'image*/
    switch(nbOctetsParPixel)
    {
        case 1:
            return *p;

        case 2:
            return *(Uint16 *)p;

        case 3:
            /*Suivant l'architecture de la machine*/
            if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
                return p[0] << 16 | p[1] << 8 | p[2];
            else
                return p[0] | p[1] << 8 | p[2] << 16;

        case 4:
            return *(Uint32 *)p;

        /*Ne devrait pas arriver, mais évite les erreurs*/
        default:
            return 0;
    }
}


Merci de bien vouloir m'élairer




Cette discussion est classée dans : int, image, pixel, sdl, surface


Répondre à ce message

Sujets en rapport avec ce message

SDL: afficher un BMP [ par yugiohjcj ] Bonjour,c'est mon deuxième message sur ce forum pour un problème avec SDL.Cette fois, je n'arrive pas à afficher une image BMP.Voici la source:void Sh [SDL] Obtenir la couleur d'un pixel dans une SDL_Surface [ par Rouliann ] Bonjour tout le monde!Voilà je cherche une fonction capable de lire la couleur d'un pixel dans une SDL_Surface, j'ai cherché dans SDL_video.h mais rie probleme SDL et POO [ par darmoor ] voila je suis encore qu'un débutant dans la matière avec la POO et j'apprend a utiliser SDL j'ai fait un essai en affichant un image et avec unn SDL_ SDL et Surface [ par Kangourou_Nomade ] Je voulais savoir si, en SDL, il était préférable de loader une image a partir d'un fichier au fur et a mesure du déroulement du jeu ou s'il vallait m SDL image et masque [ par Timidouveg ] Bonjour Je poste pour la première fois ici Je développe toutes sortes de petits programmes et aussi un projet de réalité virtuelle en C/C++ avec SDL/O Probleme, creation d'une class traitant sur SDL [ par kickbar ] Bonjour a tous, voila j'ai un petit souci, dans l'un de mes methodes, je charge la fenetre principale, je colle une image, et la mystere, a l'executio sdl et vc++2010 [ par hb2012 ] slt tout le monde, je sais bien mes amis que c'est pas possible d'afficher une image avec c++. par contre je m'adresse à vous pour savoir s'il existe Mettre à jour une fenêtre SDL [ par asprog ] Bonjour; je me suis chargée de faire un jeu de casse brique sous C++ en utilisant des classes que je dois les créer(orienté objet) ainsi que la bibl chargement d'une image BMP dans un tableau de pixel.BESOIN D'AIDE. [ par lefaucheurs ] Bonjour ,Je suis acuellement en 2eme année de BTS iris et pour la fin d'anné je doi faire un programme.Mon problème est le suivant je veux placé 4 poi probleme de compilation DEBUG ERROR DAMAGE AFTER NORMAL BLOCK [ par ali_saguer1 ] Bonjour, Il se trouve que j'ai un projet en C++ et je suis complètement bloqué. A la fin de l'exécutionde mon projet , j'obtient le resultat que j'ai


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales