logo Homepage
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [C] SDL et rafraichissement d'écran  (Lu 5044 fois)
Snake046
Invité
« le: 16 Novembre 2006 à 22:06:05 »

Voilà, j'essaye de tester et étendre mes compétences en faisant du caca sur mon IDE.

Et, je miss knowledge, comme le dit newbie-contest.

J'essaye de tenter un "écran" de chargement, qui s'actualise donc à chaque étape (lorsque le programme ouvre un fichier pour récupérer quelques données dessus, lorsque je charge d'autres images, des sons, et à la fin pour afficher une image finale qui invite à taper une touche pour continuer). Et pour cela j'utilise SDL, SDL_Image, et éventuellement quand j'aurais réglé ce problème je générerais les textes avec SDL_ttf.

Le problème, c'est que la première image s'affiche une fraction de seconde, et plus rien...
Je m'attendais pas vraiment à mieux pour dire vrai : j'ai suivi les cours de newbie-contest, et maintenant j'essaye de tester un peu des nouveaux trucs qui me passent par la tête, notamment cela. J'ai conçu cela en faisant :

D'abord, IMG_Load (pour toutes), puis FillRect, puis Blit, puis Flip. Ensuite, je fait les opérations, puis FillRect, puis Blit, puis Flip, etc...
Jusqu'à la phase finale (3ème) : là je charge une nouvelle image, je fillrect, je blit l'image, je flip, je libère la mémoire des deux premières images, je fait une boucle qui ne s'arrêtent qu'à l'appuis d'une toûche.

Et je ne comprend pas pourquoi la première image apparaît une fraction de seconde, puis la fenêtre deviens noire... si je me souviens bien, SDL_Blit prépare le future écran, et SDL_Flip actualise l'image... je ne vois pas ce qui cloche.



Quoiqu'il en soit, j'ai tenté pas mal de méthodes qui n'ont pas fonctionnés.
Je voulais finir sur une série de if et else if dans une boucle menée à la baguette par un piti booléen : chacun de ces if / else if contiennent des informations sur l'écran à afficher lorsque la valeure concernée est vraie et sur les réactions aux évenements qu'il faudra avoir.

Comme ceci par exemple :
Code:
bool continuer = true;
bool ecran1 = true;
bool ecran2 = false;

while(continuer)
{
 if(ecran1)
 {
 [switch enchâssés pour la gestion des évenements]
 [définition des images de l'écran, FillRect / Blit]
 }
 else if(ecran2)
 {
 [même chose]
 }
SDL_Flip(ecran);
}
La méthode est-elle bonne ?
Il y a-t-il un moyen plus efficace pour avoir quelque chose dans le genre ?
Journalisée
Nebelmann

Profil challenge

Classement : 464/54352

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1357


Voir le profil
« #1 le: 17 Novembre 2006 à 11:33:49 »

Citation
j'ai suivi les cours de newbie-contest
Journalisée

-- Nebelmann -- Registered linux user #429186
«Si les lecteurs étaient des compilateurs, les posteurs feraient peut-être davantage attention à ce qu'ils écrivent...»
Snake046
Invité
« #2 le: 17 Novembre 2006 à 15:39:41 »

Nioups ! Désolé ! Je voulais dire les cours du Site du Zéro !

[newbie-contest hypnotizachion]
Journalisée
neoflo
Profil challenge

Classement : 8123/54352

Membre Complet
***
Hors ligne Hors ligne
Messages: 171


Voir le profil WWW
« #3 le: 17 Novembre 2006 à 22:26:36 »

Tu utilises quel flag dans ton SDL_SetVideoMode ?


Il faut mettre : SDL_DOUBLEBUF pour activer le double buffering.

Par exemple comme ça :

SDL_SetVideoMode(pfenetre->resolutionx,pfenetre->resolutiony,  32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
Journalisée

Snake046
Invité
« #4 le: 18 Novembre 2006 à 20:13:13 »

J'ai vérifié, le double buffering est pourtant bien activé.
Bon, je vous donne le code, ce sera plus simple !

Code:
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>
#include <FMOD/fmod.h>
#include <MYSQL/mysql.h>

void erreur(); // Arrêt du programme pour permettre affichage de l'erreur, fermeture à la pression d'une touche.

int main ( int argc, char** argv )
{
 SDL_Init(SDL_INIT_VIDEO);
 FSOUND_Init(44100, 32, 0);
 SDL_Event event;

 SDL_Surface *ecran = NULL;
 ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
 SDL_Surface *IMG_Chargement1 = NULL, *IMG_Chargement2 = NULL, *IMG_Chargement3 = NULL, *IMG_Chargement4 = NULL, *IMG_Chargement5 = NULL, *IMG_Chargement6 = NULL, *IMG_ChargementEI = NULL, *IMG_ChargementES = NULL;
 IMG_Chargement1 = IMG_Load("DATA/Chargement/Loading.png");
 IMG_Chargement2 = IMG_Load("DATA/Chargement/Loading_init1.png");
 IMG_Chargement3 = IMG_Load("DATA/Chargement/Loading_init2.png");
 IMG_Chargement4 = IMG_Load("DATA/Chargement/Loading_init3.png");
 IMG_Chargement5 = IMG_Load("DATA/Chargement/Loading_init4.png");
 IMG_Chargement6 = IMG_Load("DATA/Chargement/Loading_init5.png");
 IMG_ChargementEI = IMG_Load("DATA/Chargement/TafalError1.png");
 IMG_ChargementES = IMG_Load("DATA/Chargement/TafalError2.png");
 SDL_Rect positionChargement;
 positionChargement.x = ecran->w / 2 - IMG_Chargement1->w / 2;
 positionChargement.y = ecran->h / 2 - IMG_Chargement1->h / 2;

 SDL_BlitSurface(IMG_Chargement1, NULL, ecran, &positionChargement);
 SDL_Flip(ecran);

 SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
 SDL_BlitSurface(IMG_Chargement2, NULL, ecran, &positionChargement);
 SDL_Flip(ecran);
 FILE* file_login = NULL;
 file_login = fopen("login.txt", "r");
 if(file_login != NULL)
 {
  long teteDeLecture = 1;
  char chaineDeLecture[50] = "";
  while (fgets(chaineDeLecture, 50, file_login) != NULL)
  {
     if(teteDeLecture == 1)
     {
       char login[50] = "";
       login[50] = chaineDeLecture[50];
       teteDeLecture++;
     }
     else if(teteDeLecture == 2)
     {
       char password[50] = "";
       password[50] = chaineDeLecture[50];
       teteDeLecture++;
     }
  }
  fclose(file_login);
 }
 else
 {
   SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
   SDL_BlitSurface(IMG_ChargementEI, NULL, ecran, &positionChargement);
   SDL_Flip(ecran);
   error();
 }


/* Connexion à la base de donnée */
// Cette partie n'est pas encore faite - sert à rien tant que je peu pas faire le reste

 SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
 SDL_BlitSurface(IMG_Chargement5, NULL, ecran, &positionChargement);
 SDL_Flip(ecran);

 /* Declaration des variables pour l'écran affiché */
 bool ecranAccueil = true;
 bool ecranOption = false;

 SDL_FreeSurface(IMG_Chargement1);
 SDL_FreeSurface(IMG_Chargement2);
 SDL_FreeSurface(IMG_Chargement3);
 SDL_FreeSurface(IMG_Chargement4);
 SDL_FreeSurface(IMG_Chargement5);
 SDL_FreeSurface(IMG_ChargementEI);
 SDL_FreeSurface(IMG_ChargementES);
 SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
 SDL_BlitSurface(IMG_Chargement6, NULL, ecran, &positionChargement);
 SDL_Flip(ecran);

 bool continuer = true;
 while(continuer)
 {

     if(ecranAccueil)
     {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_KEYUP:
                exit(EXIT_SUCCESS);
        }
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        SDL_BlitSurface(IMG_Chargement6, NULL, ecran, &positionChargement);
        SDL_Flip(ecran);
     }
     else if(ecranOption)
     {
     }
 }

 FSOUND_Close();
 SDL_Quit();
 return EXIT_SUCCESS;
}

void erreur()
{
    bool erreur_continue = true;
    SDL_Event event;

    while (erreur_continue)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_KEYUP:
                exit(EXIT_SUCCESS);
        }
    }
}
Après vérification, je sais que le script fonctionne déjà au moins jusqu'à la lecture du fichier... en remplaçant erreur(); par exit(EXIT_SUCCESS); dans le else de la boucle sensé lire le fichier contenant les chaînes login et mot de passe, le programme se ferme tout seul.
Mais je me demande justement si ya pas un problème dans ce while ? La lecture de fichier je ne suis pas sûr de l'avoir vraiment comprise.
Journalisée
neoflo
Profil challenge

Classement : 8123/54352

Membre Complet
***
Hors ligne Hors ligne
Messages: 171


Voir le profil WWW
« #5 le: 18 Novembre 2006 à 20:54:38 »

Bon, j'ai carrément du mal à lire ton code, il faudrait que tu essayes de découper en plus de sous fonction.

Quelque remarque général (je ne dis pas que ce soit ça qui fasse planter) :

- Il est déconseillé de déclarer des pointeurs l'un à la suite de l'autre, prefère
SDL_Surface* surf1;
SDL_Surface* surfe2; pour plus de lisibilité

Dans ta boucle :

Code:
while(continuer)
 {

     if(ecranAccueil)
     {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_KEYUP:
                exit(EXIT_SUCCESS);
        }
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        SDL_BlitSurface(IMG_Chargement6, NULL, ecran, &positionChargement);
        SDL_Flip(ecran);
     }
     else if(ecranOption)
     {
     }
continuer n'est jamais modifié, je ne sais pas si c'est normal.



Dans :

Code:
if(file_login != NULL)
 {
Tu ouvres des grandes accolades. Tu sais d'avance que dans l'autre cas, tu vas arrêter, prefère écrire sous la forme:

Code:
if(file_login == NULL)
{
  fprintf(stderr, "Ouverture de fichier non réussi");
  exit("Sortie à l'arrache");
}
- Attention, tu utilises le type bool qui n'est défini que dans la norme C99. C'est à dire qu'il est possible que ton code ne soit pas compilable avec d'autres compilateurs

- Tu as oublié de liberer l'espace pour la 6ém image

Citation
La lecture de fichier je ne suis pas sûr de l'avoir vraiment comprise.
Dans ce cas, essaye de tester ce bout de code séparement de SDL.
Journalisée

neoflo
Profil challenge

Classement : 8123/54352

Membre Complet
***
Hors ligne Hors ligne
Messages: 171


Voir le profil WWW
« #6 le: 18 Novembre 2006 à 21:34:52 »

Une question.

Tu comptes insérer des requetes SQL tout dans le même fichier. C'est vraiment bourrin... Pourquoi tu as besoin d'une base de donnée ?
Journalisée

Snake046
Invité
« #7 le: 19 Novembre 2006 à 09:41:11 »

Voilà, j'ai modifié le script : plus de bool, des long valant zéro ou un, les déclarations des SDL_Surface sont plus lisibles, et dans la boucle continuer j'ai remplacé le exit() par continuer = 0.

Citation
Tu comptes insérer des requetes SQL tout dans le même fichier. C'est vraiment bourrin... Pourquoi tu as besoin d'une base de donnée ?
Très bourrin oui, mais je tiens juste à tester quelques trucs pour pouvoir après faire des programmes plus grands.
Du reste et pour tout avouer, je ne sais pas faire de programmes en plusieurs fichiers. J'ai jamais compris comment ça marchait, en fait je crois pas qu'on m'ait déjà expliquer... enfin je vais voir ça alors.
Journalisée
neoflo
Profil challenge

Classement : 8123/54352

Membre Complet
***
Hors ligne Hors ligne
Messages: 171


Voir le profil WWW
« #8 le: 19 Novembre 2006 à 21:53:45 »

Tiens, j'avais écrit un petit truc sur les phases de compilation, c'est assez sommaire, mais ça pourra peut être t'interesser :

http://www.newbiecontest.org/punbb/viewtopic.php?id=599
Journalisée

Pages: [1]
  Imprimer  
 
Aller à: