Introduction
Dans ce cours nous allons vous présenter les grandes parties de HTML5 et d'autres librairies émergentes intéressantes, puis nous ferons quelques rappels sur JavaScript (objets, conceptions, callbacks, events, etc.), illustrés au travers de l'écriture d'un jeu vidéo tournant à 60 images/s.
Michel Buffa est l'auteur de deux MOOCs gratuits (en anglais) sur HTML5, couvrant toute la spécification HTML5, mais aussi avec des sections dédiées à l'écriture de jeux HTML5, au multimédia avancé (WebAudio, etc.), à AjaX et aux WebComponents:
Inscrivez-vous à ces deux cours (gratuits), et regardez la table des matières pour vous faire une idée. Par exemple, dans quel cours étudie-t-on la persistence côté client (attention, piège !).
Outils
Nous n'allons pas utiliser d'outils particuliers pour ce cours, uniquement des outils "standards" tels que Eclipse, Sublime Text, Atom Editor, Brackets, Notepad++ ou les outils que vous appréciez pour éditer du code. Néanmoins, de nombreux exemples HTML5/JS/CSS seront proposés sur des envrionnements de développement en ligne tels que https://plnkr.co/, http://jsbin.com/, http://jsfiddle.net/, http://dabblet.com/ ou http://codepen.io/, particulièrement adaptés pour faire de petits exemples partageables (vous pouvez modifier les exemples, vous les approprier, mais jamais les casser, car pour chaque modification une version est générée, avec son URL unique).
Partie 1 : découverte des APIs de HTML5
Supports de cours :
Autres ressources :
JavaScript :
CSS :
- Les tutoriaux de codeacademy.com sont très bien et gratuits, parfaits pour les débutants
- Le MOOC HTML5 intro sur W3Cx est très bien si vous ne vous sentez pas à l'aise.
Partie 2: écriture d'un moteur de jeu en HTML5/JavaScript
Cette partie est prétexte à faire du JavaScript, apprendre à débugger, apprendre à organiser son code, à faire de l'objet, etc. Pour la partie "manipulation du DOM" et autres joyeusetés plus classiques dans un site Web, on verra ça la semaine prochaine.
Séance 1
- Ici un exemple avec des rectangles fait en live pendant le cours : dans la partie JS les différentes manières de faire des objets en JavaScript, sans héritage ni manipulation des prototypes (objets singleton, fonctions constructeur -pseudo classes- et Black Box Model) : http://jsbin.com/qodisu/edit
- Ici exemple d'un monstre et dans le code il y a les trois manières de créer des objets bien documentées : http://jsbin.com/kafehi/edit
Séance 2 : on continue le TP en modifiant le code pour mettre des objets et séparer en fichiers
Aujourd'hui on va faire les choses suivantes :
- Transformer le monstre en objet JavaScript singleton,
- Ajouter un "ennemi" : un rectangle ou un cercle qui se promène aléatoirement sur l'écran, lui aussi en objet. Dans un premier temps on en fera aussi un objet singleton, avec méthodes draw, move, etc. Lorsqu'il sort de l'écran, on le fera réapparaitre sur le côté opposé.
- Regarder dans le MOOC HTML5 part 2, Week 2 sur "game programming", la partie collision detection. Prendre la ou les fonctions dont vous aurez besoin (rectangle/rectangle et/ou rectangle/cercle). Il faudra pour voir détecter lorsque le monstre touche l'ennemi. Dans ce cas, on incrémentera le score et on replacera l'ennemi à un autre endroit aléatoire sur le canvas, mais loin du monstre. On augmentera la vitesse de déplacement de l'ennemi (c'est comme si on passe au niveau suivant).
- Faire un objet "score" avec des méthodes
increment(inc), reset, draw (x,y)
, et des propriétés value, color
, etc. On incrémentera le score lorsqu'on touche l'ennemi
- Rajouter un bouton pour démarrer ou remettre à zéro le jeu, des sliders pour modifier la difficulté du jeu, un
input type=color
pour choisir la couleur, etc. Vous vous inspirerez de l'exemple situé dans le MOOC HTML5 part 1, Week 5 sur les formulaires, live coding video 1 & 2 sur "using input elements as widgets to control a Web Application".
- On réfléchira à la possibilité de créer non pas 1 ennemi, mais n ennemis, les rouges sont méchants, il faut les éviter, les verts sont gentils et rapportent des points. Une collision avec un rouge enlève une vie au monstre (il en a 3 au départ d'une nouvelle partie). Lorsque le nombre de vies atteint zéro le jeu est en game over.
Les plus curieux peuvent suivre l'intégralité de la semaine 2 du MOOC HTML5 part 2 sur la programmation de jeux, pour voir comment gérer des écrans (états du jeu : écran de départ, écran game over, etc.), dessiner des images, des sprites animées etc.
Ce travail est à rendre pour le XXX, ceci ne concerne que les étudiants en alternance, travail individuel. A rendre de la manière suivante :
- Avec une version en ligne facile à corriger (sur jsbin.com, codepen, plunker ou même sur un de vos serveur, peu importe)
- Avec un zip dans lequel le code est structuré en fichiers (monstre.js, ennemi.js, score.js, etc.)
Séance 3 : on va un peu plus loin en JavaScript : héritage (en JS classique, en ES6) et persistence simple
Héritage
Ressources pour l'héritage :
- Le plus simple pour commencer est de tester des exemples simples que je vous ai préparé sur JsBin:
- Exemple 1 qui couvre les cas "classiques" : classes et sous-classes, héritage de propriété et de méthodes. Différentes syntaxe d'appel des constructeurs hérités (avec et sans utilisation de la méthode
call
)
- Exemple 2 qui montre comment redéfinir une méthode héritée sans changer son nom, et en gardant la possibilité d'appeler la méthode de la classe dont on hérite (équivalent du
super.methode
...)
- Exemple 3 avec le Black Box model (qui n'est pas de l'héritage mais de la composition, on peut quand même simuler l'héritage et la redéfinition, vous verrez, mais l'opérateur instanceof ne donnera plus l'appartenance des instances à plusieurs types en même temps).
- Pour en savoir plus sur la l'héritage et la définition de pseudo-classes avec la syntaxe JavaScript classique, voir ce cours en français sur le Mozilla Developer Network
Exercice à faire : utiliser l'héritage dans votre code pour généraliser la manipulation des objets graphiques. Obligation de tester au moins deux syntaxes (je conseille d'inclure ES6 dans une des deux, c'est l'avenir).