Le TP est à rendre, par email, avant le dimanche 6 mai à 23h59...
La pièce la plus importante sera le fichier objects-nom-prenom.ml
contenant votre code.
Attention, le seul fait que votre programme fonctionne ne suffit pas pour avoir une bonne note. Les points suivants seront pris en compte :
Attention : les points suivants ne rapportent rien, mais ne pas les respecter pourra retrancher jusqu'à 10 points sur la note finale :
make all
,
info421
, ou info-421
ou info 421
,
./spheres
).
Les références vues en cours sont en fait un cas particulier de structure avec un champs mutable :
# let r = ref 0;; - val r : int ref = {contents = 0}
Ceci signifie qu'une référence est unes structure à un seul champs (appelé "contents
") et que ce champs est modifiable (on dit aussi mutable). La définition
# let r = ref ... ;;
est de fait équivalente à
# let r = { contents = ... } ;;
Pour déclarer un type « structure » avec des champs mutables, on utilise
# type st = { a : int; mutable b : int; c : bool; mutable d : float };;
Notez bien que tous les champs ne sont pas forcément mutables...
s.champs
". En particulier,
# !r;;
# r.contents;;
# let s = {a = 1; b = 2; c = true; d = 3.14};; val s : st = {a = 1; b = 2; c = true; d = 3.14}
s.champs <- ...
". En particulier,
# r := 1;;
# r.contents <- 1;;
let _ = s.a (*1*) let _ = s.a <- 12 (*2*) let _ = s.a <- s.a + 1 ; s.a +1 (*3*)
On utilise le type
type boule = { rayon : int ; mutable hauteur : int }
Écrivez une fonction
let positionne (b:boule) (l:boule list) = ...
qui met à jours la hauteur de la boule "b
". La nouvelle hauteur sera la plus petite hauteur qui permette à la boule "b
" de rentrer dans la liste "l
".
Par exemple, pour le dessin suivant, il faudra modifier la "hauteur
" de la boule "b
" pour la positionner comme à gauche.
Pour ceux qui travaillent sur leur portable, il faut installer les bibliothèques OpenGL / Glut. Pour une distribution Ubuntu standard, il faut ajouter le paquet "liblablgl-ocaml-dev
".
Le jeu SPHERES
a été écrit par Christophe Raffalli suite à une discussion autour de Caml et OpenGL. Il s'agit d'un petit prototype de jeu très simple où il faut simplement éviter des sphères dans l'espace...
Le code, à trous, est disponible ici. Vous devrez extraire le contenu de l'archive avec
$ tar xvf sphere-tp5.tar
Si tout c'est bien passé, vous aurez alors un répertoire TP5-spheres
contenant les fichiers suivants :
Makefile
(le fichier pour lancer la compilation automatique),
objects_luke_skywalker.ml
(le fichier qui contient les fonctions sur les sphères),
random.ml
(un générateur pseudo-aléatoire),
spheres.ml
(la fonction principale, qui donne l'exécutable),
vector.ml
(quelques définitions pour les opérations sur les vecteurs dans l'espace à 3 dimensions),
dependfile
(les dépendances entre fichiers, pour le compilateur).
Le seul fichier que vous devrez modifier est le fichier objects_luke_skywalker.ml
!
Mettez vous dans le répertoire spheres
et:
objects_luke_skywalker.ml
en mettant votre nom et prénom (sans accents),
Makefile
et modifiez la première ligne:
NOM = luke_skywalker
objects_....ml
.
$ make depend
$ make
$ ./spheres
q
.
À partir de maintenant, vous n'avez besoin d'exécuter que les commandes 4 et 5. La précompilation n'est plus nécessaire.
Ouvrez le fichier objects_....ml
et lisez le (en diagonal). Il n'y a rien de très compliqué dans ce fichier...
La partie que vous devrez modifier se trouve vers la fin du fichier (vers la ligne 100).
La première chose à faire est de faire bouger les sphères. Pour ceci, modifiez la fonction move_spheres_and_check
(dernière fonction du fichier) en ajoutant une ligne pour modifier la position de chaque sphère en fonction de sa vitesse. Comme cette fonction est appelée "refresh
" fois par seconde, il faut faire
position := position + (1/refresh) * vitesse
Attention, position
est un vecteur de l'espace à 3 dimensions. Vous pouvez utiliser les fonctions du fichier "vector.ml
" pour les opérations usuelles sur les vecteurs...
Recompilez et lancez le jeu :
$ make $ ./spheres
Vous devriez maintenant voir les sphères bouger et venir vers vous...
Si le programme s'arrête rapidement en affichant un message
$ ./spheres Computer too slow sorry.
c'est probablement que vous n'avez pas la 3D accélérée ou un ordinateur "lent". Vous pouvez régler le taux de rafraichissement (avec l'option "-r
" et la précision des sphères avec l'option "-d
". Par exemple, la ligne suivante lance le jeux avec un rafraichissement de 10 images par secondes (le minimum) et une précision assez basse pour les sphères :
$ ./spheres -d 10 -r 10
Continuez à modifier la fonction "move_spheres_and_check
" pour :
30
de l'origine
Lorsqu'une sphère est générée (avec la fonction "``random_sphere''", il se peut qu'elle se trouve en collision avec des sphères existantes.
intersect
" qui vérifie si deux sphères s'intersectent,
avoid_others
" qui modifie la position (sur l'axe des z) d'une sphère pour qu'elle ne touche plus aucune des sphères existantes
Écrivez maintenant la fonction "check_collisions_between
"qui teste les collision de sphère pendant le jeu. Lorsque deux sphères rentrent en collision, elles rebondissent l'une sur l'autre. On met donc à jours leurs vecteurs vitesses en utilisant la fonction (déjà écrite) "bounce
".
Ajoutez une fonctionnalité au jeu. Vous pouvez faire ce que vous voulez, mais voici quelques idées :
weight
" aux sphères et modifier la fonction "bounce
" pour le prendre en compte,
Pour ceux qui les souhaitent, vous pouvez également modifier les autres fichiers (notamment le fichier "spheres.ml
". Dans ce cas, envoyez moi :
objets_....ml
" de base
....ml
" pour vos modifications.