Consignes

Le TP est à rendre, par email, avant le mercredi 25 mai à 23h59...

Pour ce TP comme pour les suivants, 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 :

  1. l'architecture de votre programme (code découpé en fonctions etc.),
  2. la lisibilité de votre programme (choix pertinent pour les noms de variables etc.),
  3. la présence de commentaires aux endroits appropriés,
  4. la présence de documentation pour vos fonctions.

Attention : les points suivants ne rapportent rien, mais ne pas les respecter pourra retrancher jusqu'à 10 points sur la note finale :

Préliminaires : références et champs « mutables »

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 = { mutable 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...

-

On utilise le type

type boule = { rayon : int ; mutable hauteur : int }

Écrivez une fonction

  let positionne (b:boule) (l:boule list) = ...

qui met la boule "b" le plus bas possible pour qu'elle tienne dans la liste "l".

Par exemple, pour le dessin suivant, il faudra modifier la "hauteur" de la boule "b" pour la positionner comme à gauche.

Le jeu SPHERES

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 :

Le seul fichier que vous devrez modifier est le fichier objects_luke_skywalker.ml !

Mettez vous dans le répertoire spheres et:

  1. changez le nom du fichier objects_luke_skywalker.ml en mettant votre nom et prénom (sans accents),
  2. ouvrez le fichier Makefile et modifiez la première ligne:
    NOM = luke_skywalker
    

    en mettant votre nom et prénom, //exactement comme vous l'avez mis pour le fichier objects_....ml.
  3. lancer la commande de « précompilation » depuis un terminal

    $ make depend
    
  4. compilez le jeu avec la commande

    $ make
    
  5. lancez le jeu avec la commande

    $ ./spheres
    
    Vous devriez voir des sphères apparaitre sur l'écran. Vous pouvez vous déplacez (légèrement) avec les flèches et quitter avec la touche 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 :

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.

É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 :

Pour ceux qui les souhaitent, vous pouvez également modifier les autres fichiers (notamment le fichier "spheres.ml". Dans ce cas, envoyez moi :