• 1. Affichage d'un rond (projet_2_a_cercle)

       

      Vous allez ajouter à votre projet un cercle vert qui va s'afficher ou disparaitre à chaque appui sur la touche d'espace (sfKeySpace).

      Pour cela vous allez devoir créer la variable rond (comme vous aviez créer dans le programme précédent la variable rectangle). Rappelons que toutes les fonctions, structures et autres typedef de la bibliothèque graphique csfml commence par sf. On trouve ensuite le type d'objet graphique associé , ici CircleShape (que l'on peut traduire comme la Forme Cercle) et pour le rectangle nous avions RectangleShape . Donc rond est un pointeur sur la structure de données sfCircleShape et c'est cette variable qui va intégrer tous les paramètres du cercle à afficher (position, couleur, rayon,...).

      //création du cercle

      sfCircleShape* rond;

      Aprés avoir créer la variable rond, il est nécessaire de créer la structure de données intégrant tous les paramètres nécessaire à l'affichage puis la configuration des paramètres (c'est dans cette fonction qu'intervient un malloc pour la création dynamique de la variable rond).

      rond = sfCircleShape_create();

      sfCircleShape_setFillColor(rond, sfGreen);

      sfCircleShape_setRadius(rond, R_ROND);

      sfCircleShape_setPosition(rond, (sfVector2f) { 100, 100 });

      Pour terminer il ne faudra pas oublier d'ajouter la fonction d'affichage du rond aprés l'affichage de l'objet rectangle.

      sfRenderWindow_drawCircleShape(window, rond, NULL);

      Enfin ne pas oublier la destruction des données associées à la structure rond (puisque cette structure a été créée par la fonction malloc) aprés la destruction de la structure rectangle.

      sfCircleShape_destroy(rond);

      TRAVAIL  A FAIRE
      • Copier  le projet  1_c_rectangle_bloque  qui sera votre premier projet modifié et le coller dans 2_a_cercle le nouveau dossier
      • Ajouter la définition et la création de l'objet rond aprés la définition de rectangle, ajouter son affichage et sa destruction afin d'avoir un rond vert qui s'affiche
      • Ajouter le code de gestion de l'affichage ou pas du rond vert en fonction de l'appui sur la barre d'espace (sfKeySpace) qui fait afficher ou disparaitre le rond.

      Quelques explications : 

      La bibliothèque csfml étant une adaptation de la bibliothèque C++ sfml toutes les fonctions ont toujours la même logique :

      • sfCircleShape_setFillColor(rond, sfGreen); pour la modification de la couleur de fond de l'objet rond(en bleu on retrouve la fonction)
      • sfRectangleShape_setFillColor(rectangle, sfGreen); pour la modification de la couleur de fond de l'objet rectangle( pour la forme RectangleShape)
      • sfCircleShape_setPosition(rond, (sfVector2f) { 100, 100 }); pour la modification de la position du rond; remarquez l'utilisation du cast explicite permettant de définir à la volée une structure de données donnant la position en x,y dans la fenêtre (sfVector2f) { 100, 100 }

       

    • 2. Affichage d'un rond rebondissant (projet 2_b_cercle_bouge)

        

      Vous allez dans cette partie modifier l'utilisation de la barre d'espace pour arrêter ou lancer le mouvement de la balle rebondissante (votre rond vert) qui se déplace à l'horizontale de droite vers la gauche puis de gauche vers la droite).

      Pour cela, nous allons créer une nouvelle variable posRond juste aprés la création de la variable posRect. sfVector2f est une structure de données définie avec un typedef intégrant 2 champs de type float.

      sfVector2f posRond = { 100,100 };

      Remarque : nous avions utilisé le cast explicite dans le projet précédent pour définir la position en x,y du rond, nous utilisons ici une variable posRond de type sfVector2f ce qui va permettre de faire bouger la forme (qui était statique dans le projet précédent).

      Projet 2_a_rond (projet précédent)
      Projet 2_b_rond_deplace

      sfCircleShape_setPosition(rond, (sfVector2f) { 100, 100 } );

      sfVector2f posRond = { 100,100 };

      sfCircleShape_setPosition(rond, posRond);

      Attention : Pour gérer le mouvement de la balle (rond) il faudra placer votre code à l'extérieur de la boucle des messages. Les parties en rouge  ... correspondent à votre code actuel et la partie en jaune ...  le code à écrire (qui gère le mouvement de la balle). Remarquez l'ajout de la fonction sfCircleShape_setPosition(rond, posRond) qui permet de préparer le déplacement du rond (toutes les 20ms).

      #define INC_DEP_ROND 5

      #define R_ROND 20

      int main(){

      // création et configuration des objets graphiques

       ...

        while (sfRenderWindow_isOpen(window)) {

      // Gestion des évènements

          while (sfRenderWindow_pollEvent(window, &event)){

              //votre code de gestion des touches clavier

               ...

            }

          }

      // gestion du déplacement de la balle (mise à jour de posRond)

           ...

          sfRectangleShape_setPosition(rect, posRect);

          sfCircleShape_setPosition(rond, posRond);

          sfRenderWindow_clear(window, sfWhite);

          sfRenderWindow_drawRectangleShape(window, rect, NULL);

          sfRenderWindow_drawCircleShape(window, rond, NULL);

      // Update the window

          sfRenderWindow_display(window);

      // temps de rafraichissement pour pas trop charger le GPU

          sfSleep((sfTime) { 20000 });

        }

      // Cleanup resources

        ...

      }

      TRAVAIL  A FAIRE
      • Recopier le répertoire 2_a_cercle vers un nouveau répertoire 2_b_cercle_bouge et ouvrir le projet dans ce nouveau dossier.

      • Modifier le programme pour gérer le mouvement de rebond de la balle : si la position de la balle sort à gauche (posRond.x<0), il faut inverser le mouvement et si la position de la balle sort à droite posRond.x>( L_WIN - R_ROND)) il faut inverser le mouvement, utiliser la constante INC_DEP_ROND  pour gérer l'incrément de déplacement.
      • Ajouter la gestion du blocage ou de la reprise du mouvement avec la barre d'espace.

    • 3. Travail avec les fonctions

      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  1_d_fonction_base. dans le répertoire 2_c_fonction_base. Le but de ce projet est de créer des fonctions de gestion des boules qui rebondissent permettant par exemple de créer plusieurs boules dans un projet plus grand. Voici l'organisation des fonctions gérant la balle.

      typedef struct {

      sfCircleShape* rond;

      float x;

      float y;

      int rayon;

      int toggle;// pour la balle qui s'arrête ou bouge

      int droite;// pour savoir si la balle va à droite ou a gauche.

      } Balle;

      Balle balle_create(float x, float y, int rayon, int toggle,int droite, sfColor fillColor) {

      //a compléter programme

      }

      void balle_move(Balle* balle, float dx, float dy) {

        balle->x += dx;

        balle->y += dy;

        sfVector2f pos = { balle->x, balle->y };

        sfCircleShape_setPosition(balle->rond, pos);

      }

      void balle_draw(sfRenderWindow* windowBalle balle) {

        sfRenderWindow_drawCirclehape(window, balle.rond, NULL);

      }

      void balle_destroy(Balle balle) {

        sfCircleShape_destroy(balle.rond);

      }

      TRAVAIL  A FAIRE
      • copier le projet 1_d_fonction_base dans le répertoire 2_c_fonction_base.
      • Ecrire le code de la fonction balle_create 
      • Ajouter à la fonction main les appels aux fonctions balle_create , balle_move (utilisée pour le déplacement de la balle) et les 2 autres fonctions.
      • Rendre votre programme modulaire (Balle.c, Balle.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).