Skip to topic | Skip to bottom
Home
Linfo
Linfo.CTPSurModulesr1.5 - 14 Dec 2004 - 05:41 - MichelBuffatopic end

Start of topic | Skip to actions

Tp sur la programmation multi-fichiers, makefiles, types abstraits

Introduction

Dans ce TP vous allez pour la première fois travailler sur un programme composé de plusieurs fichiers et d'un Makefile. Pour le compiler, vous lancerez la commande "make" dans le répertoire des sources.

Fichiers fournis, à récupérer

  1. Tapez la commande "make" pour compiler, lancez le programme. Retaillez la fenêtre, déplacez la souris, cliquez dedans, tapez des touches pendant que la souris est dans la fenêtre...
  2. Etudiez le fichier Makefile, comprenez-vous ce qu'il fait ?
  3. Etudiez les fichiers source en détail, en commençant par les "modules"
    • Module "graphics" qui fournit des fonctions pour afficher une fenêtre et détecter des événements souris/clavier/retaillage de la fenêtre. Avant de regarder l'implémentation (vous ne comprendrez pas grand chose au début du fichier de toutes manières), regardez les fonctions de ce module en analysant le fichier graphics.h. Quelles fonctions fournit-t-il, quelle fonctions s'attend-il à trouver dans les autres fichiers des autres modules ?
    • Module "Shape" qui correspond à "objet graphique dessinable". Idem, commencez par shape.h, puis regardez son implémentation dans shape.c. Il s'agit d'une tentative pour faire de la pseudo programmation orientée objet en C. Vous avez remarqué que toutes les fonctions commencent par le nom du module ("Shape"), en voilà une bonne habitude à prendre !!!
  4. Etudiez le programme principal. Comment se fait le lien entre les différents modules ? Avec le programme principal ?

Etude d'un vrai jeu réalisé à partir de ce squelette

On vous fournit maintenant un "vrai" jeu réalisé à partir de ce squelette, un pacman. Bon, il n'est pas aussi beau que le vrai, mais cela vous donnera une idée de comment on peut travailler proprement pour écrire ce genre d'application. Des fonctions ont été ajoutées dans le module graphics.c pour gérer plus d'événements (souris relâchée), une astuce est utilisée pour pouvoir appeler à intervalles réguliers une fonction qui va se charger de l'animation, etc...

Animation avec un double buffer : le module graphics cette fois-ci utilise une technique nommée "double buffer" pour faire de l'animation fluide, sans scintillement. Regardez le fichier main.c du pacman, dans la fonction redraw_all() qui est appelée à intervalles réguliers (60 fois/s au moins), on commence par effacer le double buffer (une image en mémoire), puis on dessine, puis on affiche le double buffer (on recopie l'image dans laquelle le dessin a été effectué dans la fenêtre).

  • pacman.tgz: dezippez cette archive, compilez, regardez le code ! NEW Le pacman est maintenant en C ANSI, un de vos collègue l'a "normalisé", utilisez plutôt cette version ! Merci Olivier !

Modification de votre programme de TP

Intégration du module graphics du pacman

  • Recopiez graphics.h et graphics.c du pacman dans votre TP. Remplacez les fichiers existants.
  • Ajoutez dans main.c les fonctions que le module graphics s'attend à trouver (compilez, vous verrez bien...). Les en-têtes des fonctions manquantes manquantes sont dans graphics.h
  • Modifiez la fonction bouton_enfonce(x, y) en appelant au début clear_double_buffer() et à la fin display_double_buffer() pour que le rectangle qui apparaissait en haut à gauche dans la première version s'affiche. Et oui, maintenant, avec cette nouvelle version du module graphics, comme le dessin se fait dans un double buffer, il faut faire cette modification.

On joue avec le rectangle

On veut maintenant que le rectangle ne s'affiche plus en haut à gauche mais à la position cliquée. Modifiez la fonction bouton_enfonce(x, y) pour faire ce qui est demandé. Vous utiliserez la fonction ShapeSetAttribute? pour modifier la position de l'objet.

Déplacement d'une raquette en bas de l'écran

  • Modifiez main.c pour que le rectangle soient en variable globale, créé une seule fois dans le main (avant init_graphics).
  • Quand on déplacera la souris, on changera juste la position horizontale de ce rectangle (une seule ligne dans souris_deplace() maintenant.
  • Dans la fonction redraw_all, vous effacez le double buffer, vous dessinez le rectangle, vous affichez le double buffer.

Voilà, bienvenue dans la programmation événementielle !

Ajout d'un nouvel objet

  • Maintenant, vous allez modifier l'implémentation de shape.c pour supporter un nouvel objet graphique, un triangle !
  • Il suffira de taper sur la touche "t" pour passer dans le mode "je dessine des triangles quand je clique", si on tapes la touche "r" on passe dans le mode "je dessine des rectangles quand je clique" quand je clique. Bien entendu, la raquette continue de bouger.
  • Réflechissez à la "bonne" manière de modifier la structure shape dans shape.c. Ce qui a été fait dans le pacman n'est pas super intelligent.

Travail/mini projet à rendre pour la rentrée : un casse-briques

Voilà, pour la fin de la semaine de la rentrée vous devrez nous rendre un jeu de casse-brique, réalisé à partir du modèle de conception proposé ici. Pas question de nous refiler un truc piqué sur le net sans types abstraits, modules, makefile, etc...

Contraintes

  • Vous travaillerez en binômes,
  • Vous enverrez par mail à Olivier Dalle et à Michel Buffa une archive de votre projet contenant :
    1. Les fichiers sources abondamment commentés,
    2. Le makefile qui doit compiler sous linux sans problèmes,
    3. Une page HTML avec la doc détaillée de ce que vous avez fait, les touches, les points forts, faibles, etc...
    4. tout autre fichier/image/lib utile à la correction ou pour faire tourner le projet.
  • Recommendation : ne chiadez pas trop les graphiques, utilisez le module graphics fourni. Une fois que votre proto tourne, les plus forts pourront s'ils le souhaitent améliorer le module graphique pour supporter le dessin de bitmaps, de cercles, etc... les plus curieux pourront consulter le cours de M.Buffa sur la programmation graphique à l'aide de la xlib : http://www.essi.fr/~buffa/cours/X11_Motif/cours/index.html Si la prog xlib ne vous convient pas, vous pouvez utiliser une autre lib, mais attention, respectez la prog événementielle, la programmation modulaire proposée dans ce TP. Pas question de nous refiler un truc tout fait. On veut conserver l'idée des modules graphics, shape, avec shape qui ignore la nature de la librairie utilisée (si vous passez sur openGL ou SDL, pas une ligne de shape.c ne doit changer, idem pour main.c)

Barème

Le projet sera noté sur 22 points/20, les deux points supplémentaires étant du bonus pour les forts qui auront voulu faire des trucs non demandés (genre pas utiliser le module graphique proposé ici). Le barème tiendra compte du travail fourni et de la qualité du code, de la doc, des commentaires, etc... Le barème tiendra aussi compte très sévèrement du code pompé sur le net. On a le coup d'oeil, vous savez !


to top

I Attachment sort Action Size Date Who Comment
Makefile manage 1.3 K 06 Dec 2004 - 11:16 OlivierDalle  
graphics.h manage 0.4 K 05 Dec 2004 - 09:17 MichelBuffa  
graphics.c manage 5.4 K 05 Dec 2004 - 09:17 MichelBuffa  
shape.h manage 0.4 K 05 Dec 2004 - 09:17 MichelBuffa  
shape.c manage 1.3 K 05 Dec 2004 - 09:18 MichelBuffa  
main.c manage 1.1 K 05 Dec 2004 - 09:18 MichelBuffa  
pacman.zip manage 12.1 K 07 Dec 2004 - 09:59 MichelBuffa  
pacman.tgz manage 7.2 K 14 Dec 2004 - 05:40 MichelBuffa Le pacman en C ANSI

You are here: Linfo > CTPSurModules

to top

Copyright © 1999-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding WIKIDeptinfo? Send feedback