En Javascript, on n'a pas directement accès au système de fichiers (pour des raisons de sécurité).
Le compilateur js_of_ocaml propose une solution:
On modifie le fichier prog/dune pour passer les bonnes commandes :
(executable
(name game_js)
(modes js)
(modules game_js)
(preprocess (pps js_of_ocaml-ppx))
(libraries game js_of_ocaml gfx_jsoo)
(js_of_ocaml (javascript_files "jsoo_fs.js"))
)
(rule
(deps (glob_files ../resources/static/*))
(target "jsoo_fs.js")
(action (run js_of_ocaml build-fs -I . -o %{target} %{deps})))
Ce fichier est fourni dans le code d'exemple, vous pouvez le récupérer ou
copier les lignes dans le fichier prog/dune
Un fichier f de chemin resources/static/f sera accessible
dans le code OCaml (compilé vers Javascript) via le chemin /static/f.
On rappelle le principe fondamental de la dynamique:
ou
En quoi cela nous aide ?
On ajoute un nouveau composant SumForces qui est simplement un vecteur représentant la somme des forces. À chaque frame, on accumule les forces sur les objets qui ont se composant. On rajoute un nouveau système Force_S exécuté avant la detection de collision. Ce dernier :
Attention, l'accéleration due à la gravité ne dépend pas de la masse. (On lache 100g de plomb et 100kg de plomb à la même hauteur et ils tombent à la même vitesse).
On ne peut donc pas utiliser une constante pour la gravité, mais on doit multiplier par la masse de l'objet (et on redivisera par la masse une fois faite la somme de toutes les forces, ce qui compense).
On traîte avec un cadre générique plein de choses :
De plus, les valeurs de certaines constantes peuvent avoir des effets intéressants:
Il faut beaucoup expérimenter pour trouver des bonnes valeurs pour un jeu. On ne prend pas en général de valeurs « réalistes ». (G = 6.67430 × 10-11Nm2kg-2, c'est très petit, ⇒ erreurs d'arrondis).
Les frottements sont appliqués lorsqu'on se déplace le long d'une surface (on parle uniquement des frottements du support). Ils ont une force proportionnelle à l'oposée de la composante horizontale de la vitesse.
Pour pouvoir les appliquer, on veut savoir si un objet est « appuyé » sur un autre. Cette information est disponible lors de la détection de collision. On ajoute un nouveau composant Resting qui est un booléen indiquant si on l'objet en question repose sur un autre.
Ce booléen Resting est mis à true si on a une collision verticale vers le haut entre deux boîtes.
Après, on peut autoriser le personnage à sauter uniquement s'il est en repos sur une surface.
Le système d'entrées utilisateurs que l'on a mis en place n'est pas idéal, en particulier il ne prend pas en compte les pressions simultanées. On propose la variation suivante :
Le « TP » 6, déjà codé, illustre tous ces concepts dans un « jeu » de plateforme minimaliste (c'est plutot un embryon de moteur). Il utilise
Il est vivement recommandé de s'en inspirer si on est bloqué