L3 Miage 2023-2024 Introduction à JavaScript et aux API W3C standards

De $1

Version de 18:58, 19 Mai 2024

cette version.

Revenir à liste des archives.

Voir la version actuelle

Séance 1 : introduction à JavaScript, rappels, outils, Moocs de référence

Supports de cours

Live coding : environnement de développement, rappel sur les fonctions, les objets, les classes, intro aux modules, le DOM, les événements... Voir le repo GutHub COURS/ExempleProjetJS

TRAVAIL A FAIRE POUR LA PROCHAINE SEANCE :

  1. Vous inscrire au MOOC JavaScript Introduction,
  2. Regarder les exemples du module 2 (adding interactivity to web pages), sur les événements, le DOM, etc.
  3. Pour les non alternants : vous inscrire au concours games on Web 2024 

Séance 2: préparation du TP, drag'n'drop, initiation au dessin et à l'animation à 60 images/seconde dans un canvas HTML etc.

Support de cours :

TP1 - Ecriture d'un jeu de type Mach3 à l'aide du DOM

  • Sujet du TP : dans cette première version on va commencer à coder un jeu à la Candy Crush / Mach 3, en utilisant des divs pour représenter la grille et les cases. On utilisera l'API standard du DOM pour la gestion des événements et pour implémenter le drag'n'drop.

Séance 3: animation dans un canvas, Programmation Orientée Objet en JavaScript

Supports de cours dans les MOOCs :

Utilisation d'un canvas HTML5

  1. Comprendre l'utilisation du canvas HTML5 : simple dessin
  2. Animation à 60 images secondes avec requestAnimationFrame
  3. Animer plusieurs objets,
  4. Déclencher des animations (et les arrêter) à des fréquences < 60 images/s,
  5. Avancé : gérer l'animation en fonction du temps,
  6. Animer un joueur et gérer les événements clavier,
  7. Gérer les événements souris,
  8. Détecter les collisions entre objets et obstacles,
  9. Utiliser des classes, faire un petit moteur de jeu
  10. Travailler avec des images ou avec des sprites.

Exemples vus en classe :

  • Exemple basique JsBin en ligne montrant une animation dans un canvas, le chargement et le dessin d'une image, la gestion de la souris, comment récupérer sa position exacte avec getBoundingRect(), etc. Pour aller plus loin, voir les chapitres 2 et 3 du MOOC "HTML5 coding essentials and best practices",
  • Pour le chargement multiple d'images et de sons, le programme proposé en TP, sur lequel j'ai fait du live coding, propose un "asset loader" utilisant la librairie HowlerJS pour la gestion des sons et musiques. Vous trouverez l'exemple fait en live coding dans le repository github du cours, dans TP3/TP3_faitEnCours 
     

Exemples dont j'ai parlé en TP :

  • Exemple simple d'animation et contrôle pour qu'un objet suive la souris : https://jsbin.com/jegamas/edit?js,output

     
  • Petite évolution de l'exemple précédent : https://jsbin.com/voyowo/3/edit?js,output (montre un "monstre rectangulaire qui suit la souris. Animation à 60im/s avec request animation frame et "animation secondaire" à l'aide de setInterval pour qu'il change de couleur toutes les n secondes. Je montre aussi dans cet exemple comment on peut mesurer précisément le temps dans la boucle d'animation.
     
  • Ici exemple de tests de collision, gestion du déplacement d'un objet, affichage d'obstacles : https://jsbin.com/gacezog/edit?output
     
  • Ici un exemple de char qui tire (souris + barre espace et bouton 1 souris) :Projet zip avec un char qui tire et suit la souris. Dezipper, ouvrir le folder avec Visual Studio Code, ouvrir le fichier index.html et le lancer avec click droit/Open With Live Server (si vous n'avez pas cette option, installez l'extension VSCode "Live Server"). C'est un bon exemple de squelette de jeu minimal pour faire un jeu de chars. Montre les classes, les événements, le dessin et l'animation dans un canvas HTML5. Pour approfondir les fonctions de dessins dans le canvas, voir les chapitres 3 et 4 du MOOC HTML5 Coding Essentials and best practices.

Exemples de Snakes (à re-écrire avec des classes, ce serait génial d'avoir plusieurs serpents etc.)

TP2 : On continue le TP1

 

 

 

Le TP1 étant assez long, vous le continuerez dans cette séance, mais cette fois-ci vous essaierez d'implémenter les chutes. Je vous propose un algorithme que vous testerez initialement uniquement sur une seule colonne, puis que vous étendrez à toutes :

  • Prenons la colonne 0 (la plus à gauche), positionnez à la souris un groupe de 3 cookies identique verticalement.
  • Cliquez sur un bouton que vous aurez ajouté pour tester, qui appellela la fonction chuteColonne(0);
  • Ecrivez la fonction chuteColonne(colonne) qui fera ceci
    1. On part du bas de la colonne et on remonte jusqu'à trouver le premier trou. Si on en trouve pas, la fonction fais return;
    2. Si on est sur un trou, on mémorise l'index et on remonte jusqu'à trouver soit un cookie, soit le haut de l'écran, on mémorise l'index de fin, et on appelle une autre fonction compacteColonne(indexDebut, indexFin) qui va faire déplacer le contenu de la colonne au-dessus de indexFin pour qu'il démarre à indexDebut (en gros, on descend le haut de la colonne pour compacter le trou). Il peut y avoir un autre trou au-dessus, mais on le descend aussi.
    3. On repart de indexDebut et on remonte jusqu'à trouver un trou ou le haut de l'écran. Attention, les cases laissées vacantes en haut de la colonne, s'il y a eu une "descente", doivent être remplis par des cookies aléatoires. On ne teste pas s'ils forment à leur tour une série de 3.
    4. Si on trouve encore des trous on repart en 2.
    5. Une fois terminé, on remplit les éventuels trous entre le haut de l'écran et le premier cookie avec des cookies aléatoires. On ne teste pas s'ils forment un groupe.

Une fois que vous aurez testé cela sur plusieurs configurations (groupe de trois en haut de l'écran, plusieurs groupes de trois, etc.), et donc que vous aurez validé votre algorithme de compactage sur une colonne, vous n'aurez plus qu'à appeler ce traitement sur toutes les colonnes.

Les chutes ayant sans doute créé des alignements, vous redetecterez les alignements, recompacterez les colonnes, re-detecterez les alignements, etc. jusqu'à ce qu'il n'y ait plus d'alignement.

Pensez à un score chaque fois que des groupes sont détectés...