[SDL] Affichage + Timer

adel1433 - 24 août 2012 à 13:24
 adel1433 - 26 août 2012 à 04:54
bonjour
je suis débutant au domaine de programmation
et je doit réaliser un projet d'été constitué de 3 partie
1-afficher l'heure dans une fenêtre graphique
2-crée une zone de texte qui permet a l'utilisateur de faire entrer un temps pour l'alarme
3-bip sonore qui se déclenche au temps entrée par l'utilisateur
j'ai arrivé a réaliser la première partie en utilisant la bibliothèque SDL

#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_ttf.h>
#include <time.h>


int main(int argc, char *argv[])
{
    SDL_Surface *ecran = NULL;
    SDL_Surface *texte = NULL;
    SDL_Rect position;
    SDL_Event event;
    TTF_Font *police = NULL;
    SDL_Color ecranCouleur {0, 0, 0}, fontColor {0, 255, 0};
    int continuer = 1;
    int tempsActuel 0, tempsPrecedent 0, compteur = 0;
    char temps[20] ;

    SDL_Init(SDL_INIT_VIDEO);
    TTF_Init();

    ecran = SDL_SetVideoMode(160, 80, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WM_SetCaption("timer", NULL);


    // Chargement de la police
    police = TTF_OpenFont("font.ttf", 23);

    // Initialisation du temps et du texte
    tempsActuel = SDL_GetTicks();
    time_t timestamp = time(NULL);
    strftime(temps, sizeof(temps), "%X", localtime(&timestamp));
    texte = TTF_RenderText_Shaded(police, temps, fontColor, ecranCouleur);

    while (continuer)
    {
        SDL_PollEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
        }
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        tempsActuel = SDL_GetTicks();
        if (tempsActuel - tempsPrecedent >= 1000) // Si 1000ms au moins se sont écoulées
        {
            compteur += 1000; // On rajoute 1000ms au compteur
            time_t timestamp = time(NULL);
            strftime(temps, sizeof(temps), "%X", localtime(&timestamp)); // On écrit dans la chaîne "temps" le nouveau temps
            SDL_FreeSurface(texte); // On supprime la surface précédente de la mémoire avant d'en charger une nouvelle (IMPORTANT)
            texte = TTF_RenderText_Shaded(police, temps, fontColor, ecranCouleur); // On écrit la chaine temps dans la SDL_Surface
            tempsPrecedent = tempsActuel; // On met à jour le tempsPrecedent

        }

        position.x = 40;
        position.y = 10;
        SDL_BlitSurface(texte, NULL, ecran, &position); // Blit du texte contenant le temps
        SDL_Flip(ecran);

    }

    TTF_CloseFont(police);
    TTF_Quit();
    SDL_FreeSurface(texte);
    SDL_Quit();
  
    return 1 ;
}


et j'ai trouver des problème dans la deuxième partie

#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_ttf.h>
#include <time.h>


int main(int argc, char *argv[])
{
    SDL_Surface *ecran = NULL;
    SDL_Surface *texte = NULL;
    SDL_Surface *reveille =NULL;
    SDL_Rect position;
    SDL_Rect position1;
    SDL_Event event;
    TTF_Font *police = NULL;
    SDL_Color ecranCouleur {0, 0, 0}, fontColor {0, 255, 0};
    int continuer = 1;
    int tempsActuel 0, tempsPrecedent 0, compteur = 0;
    char temps[20] ;
    int i ;
    char y1 [20];
    char indice[5];

    SDL_Init(SDL_INIT_VIDEO);
    TTF_Init();

    ecran = SDL_SetVideoMode(160, 80, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WM_SetCaption("timer", NULL);


    // Chargement de la police
    police = TTF_OpenFont("font.ttf", 23);

    // Initialisation du temps et du texte
    tempsActuel = SDL_GetTicks();
    time_t timestamp = time(NULL);
    strftime(temps, sizeof(temps), "%X", localtime(&timestamp));
    texte = TTF_RenderText_Shaded(police, temps, fontColor, ecranCouleur);

    while (continuer)
    {
        SDL_PollEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN :

for(i=1;i<7;i++){

              if (event.key.keysym.sym==SDLK_0){
                    indice[i]=0;

                }
                if (event.key.keysym.sym==SDLK_1){
                    indice[i]=1;

                }
                if (event.key.keysym.sym==SDLK_2){
                    indice[i]=2;

                }
                if (event.key.keysym.sym==SDLK_3){
                    indice[i]=3;

                }
                if (event.key.keysym.sym==SDLK_4){
                    indice[i]=4;

                }
                if (event.key.keysym.sym==SDLK_5){
                    indice[i]=5;

                }
                if (event.key.keysym.sym==SDLK_6){
                    indice[i]=6;

                }
                if (event.key.keysym.sym==SDLK_7){
                    indice[i]=7;

                }
                if (event.key.keysym.sym==SDLK_8){
                    indice[i]=8;

                }
                if (event.key.keysym.sym==SDLK_9){
                    indice[i]=9;

                }
position1.x += 5 ;
sprintf (y1,"%d", indice[i]);
reveille = TTF_RenderText_Shaded(police, y1, fontColor, ecranCouleur);
}


        }
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        tempsActuel = SDL_GetTicks();
        if (tempsActuel - tempsPrecedent >= 1000) // Si 1000ms au moins se sont écoulées
        {
            compteur += 1000; // On rajoute 1000ms au compteur
            time_t timestamp = time(NULL);
            strftime(temps, sizeof(temps), "%X", localtime(&timestamp)); // On écrit dans la chaîne "temps" le nouveau temps
            SDL_FreeSurface(texte); // On supprime la surface précédente de la mémoire avant d'en charger une nouvelle (IMPORTANT)
            texte = TTF_RenderText_Shaded(police, temps, fontColor, ecranCouleur); // On écrit la chaine temps dans la SDL_Surface
            tempsPrecedent = tempsActuel; // On met à jour le tempsPrecedent

        }

        position.x = 40;
        position.y = 10;

        position1.x = 40;
        position1.y = 40;

        SDL_BlitSurface(reveille, NULL, ecran, &position1);
        SDL_BlitSurface(texte, NULL, ecran, &position); // Blit du texte contenant le temps
        SDL_Flip(ecran);

    }

    TTF_CloseFont(police);
    TTF_Quit();

    SDL_FreeSurface(reveille);
    SDL_FreeSurface(texte);
    SDL_Quit();

    return 1 ;
}



j ai besoin d'aide et merci

4 réponses

BunoCS Messages postés 15480 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 12 juin 2024 103
24 août 2012 à 15:14
Yop,
J'ai renommé ta demande de manière plus explicite.
Je ne connais pas SDL, mais j'ai trouvé ceci pour jouer avec les TTF


@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
BunoCS Messages postés 15480 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 12 juin 2024 103
24 août 2012 à 15:17
Pour la zone de texte, SDL n'étant pas fait pour ça, il faut plutôt chercher du côté de la communauté, genre ici par exemple


@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
en utilisant gtk j'ai rencontré un problème dans la 1er partie:
j'ai réussi a afficher le temps mais il reste constant (le temps qui s'affiche est le temps de l’exécution du programme)



et en utilisant la fonction g_timeout_add_seconds() voila mon code
le temps s'actualise mais j'avais un problème que le temps ne s'affiche pas dans la fenêtre

#include <stdlib.h>
#include <gtk/gtk.h>
#include <time.h>



void affiche(    GtkWidget* Fenetre  ,GtkWidget* Label){
char temps[256];
gchar* TexteConverti = NULL;


time_t timestamp = time(NULL);
strftime(temps, sizeof(temps), "%X", localtime(&timestamp));



printf(temps);//pour vérifier si le temps s'actualise

    TexteConverti = g_locale_to_utf8(temps,-1, NULL, NULL, NULL);  //Convertion du texte avec les balises
    Label=gtk_label_new(TexteConverti); // Application de la convertion à notre label
    g_free(TexteConverti); // Libération de la mémoire
   gtk_container_add(GTK_CONTAINER(Fenetre), Label);//je crois que c'est ici le problème:quand j&#8217;exécute il s'affiche en ecran noir le message:gtk_container_add: assertion 'gtk_is_container' <container> ' failed
   gtk_widget_show(Label); // On affiche 'Fenetre' et tout ce qu'il contient

}


int main(int argc,char **argv)
{
    GtkWidget* Fenetre = NULL;
    GtkWidget* Label = NULL;

    gtk_init(&argc, &argv);


    Fenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);  // Définition de la fenêtre
    gtk_window_set_title(GTK_WINDOW(Fenetre), "Le texte avec les labels"); // Titre de la fenêtre


gtk_window_set_default_size(GTK_WINDOW(Fenetre), 300, 100); // Taille de la fenêtre


    gtk_widget_show(Fenetre); // On affiche 'Fenetre' et tout ce qu'il contient




g_timeout_add_seconds  (1,affiche,Label);




    gtk_main();

    return EXIT_SUCCESS;
}
0
ya t'il quelqu'un qui peut m'aider a corriger le dernier code ou j'ai utiliser la bibliothèque GTK
0
Rejoignez-nous