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

Développement 2D, 3D et Jeux Discussion :

2 executions d'un programe C graphique avec SDL me donne des résultats différents


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut 2 executions d'un programe C graphique avec SDL me donne des résultats différents
    Je croyais que c'était impossible...
    Je développe un petite calculatrice en C et j'essaie d'y ajouter une interface graphique. Après apprentissage des librairies SDL sur le site , j'ai essayé d'appliquer mes connaissances mais, dès le début, j'ai des problèmes :
    - l'icône de la fenêtre ne s'affiche pas
    - l'image du tux ne s'affiche pas non plus
    - et surtout, le dégradé de fond d'écran s'affiche une fois sur deux...

    Pour les deux premières, j'ai dû faire une erreur mais pour la troisième, je vois vraiment pas...

    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
     
    void pause(void){
    	int continuer = 1;
    	SDL_Event event;
     
    	while (continuer){
    		SDL_WaitEvent(&event);
    		switch(event.type){
    			case SDL_QUIT:
    				continuer = 0;
    		}
    	}
    }
     
    void lanceFenetre(void){
    	//declaration de la taille de la fenetre
    	int hauteur = 512, largeur = 300, i, j;
    	//declaration des pointeurs SDL_Surface
    	SDL_Surface *ecran = NULL, *fondDegrade[hauteur], *tux = NULL;
    	//declaration des coordonnees
    	SDL_Rect position;
    //chargement
    	//chargement de l'icone de le fenetre
    	SDL_WM_SetIcon(SDL_LoadBMP("images/icone.bmp"), NULL);
     
    	//chargement de la fenetre
    	SDL_Init(SDL_INIT_VIDEO);
     
    	//lancement de la fenetre
    	ecran = SDL_SetVideoMode(largeur, hauteur, 32, SDL_HWSURFACE);
     
    	//titre de la fenetre
    	SDL_WM_SetCaption("Calculatrice", NULL);
     
    	//chargement du degrade
    	for (i = 0 ; i <= hauteur ; i++)
    		fondDegrade[i] = SDL_CreateRGBSurface(SDL_HWSURFACE, largeur, 1, 32, 0, 0, 0, 0);
     
    	//chargement du Tux
    	tux = IMG_Load("images/tux.png");
    //creation
    	//creation de l'ecran
    	SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
     
    	//creation du degrade
    	for (i = 0, j = 0 ; i <= hauteur ; i++){
    		if(i<hauteur/2){
    			position.x = 0; // Les lignes sont à gauche (abscisse de 0)
    			position.y = i; // La position verticale dépend du numéro de la ligne actuelle
    			SDL_FillRect(fondDegrade[i], NULL, SDL_MapRGB(ecran->format, 0, 0, i)); // Remplissage
    			SDL_BlitSurface(fondDegrade[i], NULL, ecran, &position); // Collage
    		}
    		else{
    			position.x = 0; // Les lignes sont à gauche (abscisse de 0)
    			position.y = i; // La position verticale dépend du numéro de la ligne actuelle
    			SDL_FillRect(fondDegrade[i], NULL, SDL_MapRGB(ecran->format, j, j, 255)); // Remplissage
    			SDL_BlitSurface(fondDegrade[i], NULL, ecran, &position); // Collage
    			j++;
    		}
    	}
     
    	//creation de l'image du tux
    	position.x = 0;
    	position.y = 0;
    	SDL_BlitSurface(tux, NULL, ecran, &position);
     
     
    //pause
    	//ce qui se passe dans la fenetre
    	pause();
     
    //liberation de la place
    	//liberation de l'espace du degrade
    	for (i = 0 ; i <= hauteur ; i++)
    		SDL_FreeSurface(fondDegrade[i]);
     
    	//liberation de l'espace de tux
    	SDL_FreeSurface(tux);
     
    	//dechargement de la fenetre
    	SDL_Quit();
    }
    merci d'avance

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Fiu,

    Je n'ai pas lu en détails, mais je vois au moins ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	for (i = 0 ; i <= hauteur ; i++)
    qui devrait certainement être plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	for (i = 0 ; i < hauteur ; i++)
    D'autre part, un comportement aléatoire est quasiment toujours dû à une mauvaise initialisation d'une ou plusieurs variables.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    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
    Il faut commencer par tester le retour de chaque fonction SDL. Ensuite, ce n'est pas nécessaire d'avoir une image de fondu pour chaque ligne. Ce serait mieux de faire une grande image avec un fondu et le blitter en une seule fois sur l'écran.

    Jc

  4. #4
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses rapides
    Bon, j'ai corrigé les <= mais j'ai toujours le même bug :/
    Enfin... j'ai dû faire une autre erreur...
    De toute manière, c'est vrai, vaut mieux que je fasse une image.

    Encore merci pour vos réponses

  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
    Ok j'ai regardé le code :

    - le problème était le manque de SDL_Flip dans ton code.

    Mais j'ai regardé un peu plus et il est plus compliqué qu'il ne le faut. Je me suis d'abord demandé pourquoi avoir un tableau de dégradé et je me suis dit que tu voudrais peut-être remettre le fond de temps en temps et tu as dû vouloir te souvenir du dégradé. Mais ta solution est plus compliquée qu'il ne le faut

    Voici comment je le ferai :

    - Déjà je mettrai tous les tests sur les retours de fonctions SDL (SDL_Init, SDL_SetVideoMode, SDL_WaitEvent...)

    - Ensuite, voici ma déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface *ecran = NULL, *fondDegrade;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	//chargement du degrade
    	fondDegrade = SDL_CreateRGBSurface(SDL_HWSURFACE, largeur, hauteur, 32, 0, 0, 0, 0);
     
    	//creation de l'ecran
    	SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
    	SDL_FillRect(fondDegrade, NULL, SDL_MapRGB(fondDegrade->format, 0, 0, 0));
    Ensuite, la création d'un seul dégradé qui est la même taille que l'écran et on mettra les deux à 0.

    Ensuite, ma boucle de dégradé ressemble à 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
    //creation du degrade
    	position.x = 0; // Les lignes sont à gauche (abscisse de 0)
    	position.w = largeur;
    	position.h = 1;
    	for (i = 0, j = 0 ; i <= hauteur ; i++){
    		position.y = i; // La position verticale dépend du numéro de la ligne actuelle
    		if(i<256){
    			SDL_FillRect(fondDegrade, &position, SDL_MapRGB(fondDegrade->format, 0, 0, i)); // Remplissage
    		}
    		else{
    			SDL_FillRect(fondDegrade, &position, SDL_MapRGB(fondDegrade->format, j, j, 255)); // Remplissage
    			j++;
    		}
    	}
    Et pour le rendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	SDL_BlitSurface(fondDegrade, NULL, ecran, NULL);
    	SDL_Flip(ecran);
    Pour les autres problème, il faut tester le retour des fonctions de chargements d'image et voir si tout se passe correctement.

    Jc

Discussions similaires

  1. Afficher graphique avec tableau de données
    Par Specifik dans le forum Windows Forms
    Réponses: 0
    Dernier message: 30/01/2014, 14h10
  2. WebPArt Graphique avec sources de donnée d'un webpart.
    Par Silvers dans le forum Développement Sharepoint
    Réponses: 2
    Dernier message: 21/12/2010, 17h59
  3. Réponses: 4
    Dernier message: 11/03/2010, 18h14
  4. [XL-2003] Graphique avec plage de données variables
    Par yoord dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/06/2009, 11h48
  5. Graphique avec plage de données contenant des dates / heures
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/08/2007, 21h13

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