• 1. Ajouter du texte (projet_3a_texte)

       

       

      Vous allez ajouter à votre projet du texte directement sur la fenêtre graphique.

      Pour cela vous avez besoin de l'objet font (nécessaire pour la gestion de la police de caractères) , de l'objet graphique  text pour afficher le texte et d'une chaine de caractère tabText qui viendra accueillir le texte à afficher sur la fenêtre.

      sfFont* font;

      sfText* text;

      char tabText[100];

      Ensuite vous allez devoir charger une police de caractère (font), dans notre cas ce sera la police arial (qui est définie dans le fichier arial.ttf) grace à la fonction sfFont_createFromFile, créer l'objet text avec la fonction sfText _create();  et associer les 2 objets (font et text) avec la fonction sfText_setFont . On peut alors modifier les propriétés du texte (taille, position, texte et couleur).

      font = sfFont_createFromFile("ressources/arial.ttf"); // chargement de la police

      text = sfText _create(); // creation de l'objet texte

      sfText_setFont(text, font); // association de la police à l'objet texte

      sfText_setCharacterSize(text, 20);

      sfText_setPosition(text, (sfVector2f){ 30,H_WIN-30 });

      sfText_setString(text, "Mon premier texte"));

      sfText_setColor(text, sfBlack);

      2 façons de modifier le texte de notre objet text : soit en plaçant directement le texte à affiché (texte non formatté), soit en utilisant la fonction sprintfpour mettre à jour le tableau tabTextqui va accueillir le texte intégrant des variables à afficher.

      Affichage d'un texte non formatté
      Affichage d'un texte formaté -> utilisation de sprintf

      printf("Down\n");//visu pour le debug

      sfText_setString(text , "Down");

      printf("PAS=%d %d\n", dx, dy);//visu pour le debug

      sprintf(tabText, "PAS=%d %d", dx, dy);

      sfText_setString(text , tabText);

      On n'oubliera pas l'affichage du texte et la destruction des objets font et text.

      sfRenderWindow_drawText(window, text, NULL);

      sfText_destroy(text);

      sfFont_destroy(font);

      TRAVAIL  A FAIRE
      • Copier  le projet  2_b_cercle_bouge   et le coller dans 3_a_texte le nouveau dossier
      • Ajouter la définition et la création de l'objet font et text, ajouter son affichage et sa destruction afin d'avoir un le texte Mon premier texte qui s'affiche
      • Ajouter l'affichage de tous les messages associés aux différents évènements (qui sont affichés avec printf) sur la fenêtre graphique.

    • 2. Ajouter du son (projet 3b_texte_son)

       

       

      Nous allons maintenant ajouter un son lorsque la balle rebondit. Nous avons besoin pour cela de créer 2 objets : music et clk (pour gérer le temps de lecture de la musique).

      sfMusic* music;

      sfClock* clk;

      Il va falloir ensuite charger le fichier de son (fichier de type wav) avec la fonction sfMusic_cpreateFromFile puis créer l'intervalle de temps entre le début et la fin du fichier son (nous pourrions ne sélectionner qu'une partie du fichier son) avec la variable timespan, puis charger la musique en RAM sfMusic_setLoopPoints (pour qu'elle soit prête à être lancée). Pour terminer, Il va nous falloir arrêter le son (qui sinon va être lue en boucle) donc nous devons aussi créer un timer avec la fonction sfClock_create .

      music = sfMusic_createFromFile("ressources/ball.wav");

      if (!music) {

        printf("ERREUR : ouverture du fichier \'ressources/ball.wav\'");

        return EXIT_FAILURE;

      }

      sfTimeSpan timespan = { 0, sfMusic_getDuration(music) };

      sfMusic_setLoopPoints(music, timespan); // charger la musique complète

      clk = sfClock_create(); //lance timer pour le son

      La musique étant chargée et le timer clk  prêt à être utilisé, nous pouvons à tout moment lancer le son (et relancer le timer).

      //on lance la musique

      sfMusic_play(music);

      sfClock_restart(clk);

      Il ne reste plus aprés avoir gérer l'affichage d'arrêter le son au bout d'une seconde (dans la boucle while (sfRenderWindow_isOpen(window))

      /*arrêt de la musique au bout de 1s*/

      sfTime temps = sfClock_getElapsedTime(clk);

      if (temps.microseconds > 1000000) {

         sfMusic_stop(music);

      }

       

      Sans oublier d'appeler les fonction destroy des objets music et clk.

      sfMusic_destroy(music);

      sfClock_destroy(clk);

      TRAVAIL  A FAIRE
      • Copier  le projet  3_a_texte   et le coller dans 3_b_texte_son le nouveau dossier
      • Ajouter la définition et la création de l'objet clk et music, charger le  son en RAM puis lancer le son à chaque rebond 
      • Tester et valider.
    • 3. Travail avec les fonctions (projet_3c_fonction_base)

      Pour travailler sur cette partie, il est nécessaire que vous ayez validé tous les chapitres de la troisième partie puisque pour pouvoir répondre à ce problème vous avez besoin de comprendre les structures de données, les pointeurs sur structures et les fonctions appelant des structures. Si c'est le cas vous pouvez essayer de travailler sur cette partie, sinon passer à la suite.

      Vous allez copier le projet  2_c_fonction_base dans le répertoire 3_c_fonction_base. Le but de ce projet est de créer des fonctions de gestion des textes et du son. Vous allez donc créer les 2 structures permettant de gérer les textes et le son. 

      typedef struct {

        sfText* text;

        float x;

        float y;

      }Texte;

      typedef struct {

        sfMusic* music;

        sfClock* clk;

      }Music;

      Puis Ecrire le code des fonctions associées à la gestion des textes.

      Texte text_create(char* titre, float x, float y, int sizeFont, sfFont* font, sfColor textColor) {

       Texte monTexte;

      // compléter le code

        return monTexte;

      }

      void text_setString(Texte* texte, char* chaineCar) {

      // compléter le code

      }

      void text_draw(sfRenderWindow* window, Texte texte) {

      // compléter le code

      }

      void text_destroy(Texte texte) {

      // compléter le code

      }

      Voici le code des fonctions de gestion de la musique

      Music music_load(char* fichier) {

        Music musique;

        musique.music = sfMusic_createFromFile(fichier);// chargement du fichier de musique en RAM

        if (!musique.music) {

          printf("ERREUR : ouverture du fichier %s", fichier);

        }

        sfTime finMusique = sfMusic_getDuration(musique.music);// lecture durée musique

        sfTimeSpan timespan = { 0, finMusique };

        sfMusic_setLoopPoints(musique.music, timespan);// configuration lecture en boucle du début à la fin

        musique.clk = sfClock_create();// lancement timer

        return musique;

      }

      void music_play(Music  musique) {

        sfMusic_play(musique.music);// jouer la musique en boucle

        sfClock_restart(musique.clk);// relancer le timer (pour pouvoir arrêter le son au bout d'une seconde)

      }

      void music_stop(Music  musique) {

        sfMusic_stop(musique.music);

      }

      void music_destroy(Music  musique) {

        sfMusic_destroy(musique.music);

        sfClock_destroy(musique.clk);

      }

      Voici un extrait de la fonction main permettant d'initialiser les 2 structures.

      font = sfFont_createFromFile("ressources/arial.ttf");

      if (!font) {

        printf("ERREUR : ouverture de la font \'ressources/arial.ttf\'");

        return EXIT_FAILURE;

      }

      Texte info1 = text_create("Premier texte", 30, H_WIN - 30, 20, font, sfBlue);

      Music rebond1 = music_load("ressources/ball.wav");

      TRAVAIL  A FAIRE
      • copier le projet 2_c_fonction_base. vers 3_c_fonction_base.
      • Ecrire le code des fonctions de la structure Text
      • Ecrire le code du main
      • Rendre votre programme modulaire (Text.c, Text.h, Music.c, Music.h et main.c).
      Ce travail de projet est destiné seulement aux étudiants ayant réussi tous les exercices de la partie 3 (et donc terminé les 14 chapitres).