Le projet se base sur le jeu de France 3, Questions Pour Un Champion (QPUP). Les auteurs de ce jeu ayant une préférence pour la politique Française, ils ont donc décidé de faire un spin-off de ce dernier : Question Pour Un Président (QPUP).
Le jeu fonctionne entièrement en JavaScript, mais les pages fonctionnent aussi en HTML, CSS, PHP, et JQuery (une librairie JavaScript)
La structure est relativement simple.
A la racine du site, donc au début du site, nous pouvons trouver les différentes pages HTML. Attention toutefois, leur extension est en PHP : PHP permet de créer du contenu dynamique plus simplement et rapidement. Nous l'utilisons principalement pour la page où le jeu se situe : par conséquent, nous avons mis toutes les pages HTML en PHP pour se simplifier la tâche (histoire d'éviter les fichiers soit PHP, soit HTML).
Dans le dossier CSS, nous pouvons trouver les différents styles utilisés sur les pages. Le CSS correspondrait à l'agencement des meubles si le code HTML correspondait aux dits meubles.
Dans le dossier fonts, nous trouvons des polices d'écriture. Elles servent de pilier à certains fichiers CSS s'en servant.
Dans gameRes, nous pouvons trouver les fichiers de ressources externes au jeu (gameRes = Game Resources). Nous pouvons par exemple trouver les questions et les réponses du quizz.
Dans le dossier img, nous stockons les images dont nous nous servons tant pour le site que pour le jeu. Nous n'avons pas adopté de format en particulier.
Dans js, nous trouvons deux sous-parties : en premier lieu, les fichiers servant à faire fonctionner le site (ou le jeu, dans le cas échéant). Nous nous basons sur les fichiers de l'infrastructure BootStrap, nous utilisons donc leurs fichiers, libres de droits, ainsi que d'autres fichiers externes à Bootstrap. Cette sous-partie n'a pas été écrite par les auteurs de ce jeu. Le dossier game, quant à lui, correspond aux fichiers écrits par ces derniers faisant fonctionner le jeu uniquement. Ils sont répartis selon leur utilité : les fichiers servant aux évènements seront donc dans le fichier events.js. Ce dossier est automatiquement chargé par la page supportant le jeu.
Enfin, dans music, nous trouvons tout simplement la musique utilisée par le jeu.
Le fichier se décompose pour chaque question en plusieurs parties :
Voici un exemple utilisé:
function drawImage(vec,src) { //Affiche une image var img = new Image(); img.src = src; img.onload = function() { ctx.drawImage(img, vec[0], vec[1], vec[2], vec[3]); } } function clear(vec) { //Efface l'écran selon le vecteur vec. ctx.clearRect(vec[0], vec[1], vec[2], vec[3]); }
La fonction drawImage a deux arguments : vec et src. En vrai, vec doit être un tableau (array) ayant 4 paramètres : X0, Y0, X1, Y1. Le principe vectoriel est simplement d'aller du point A (<X0;Y0>) au point B (<X1;Y1>). Quant à src, c'est simplement le chemin vers l'image par rapport à la page que l'utilisateur. Comme les pages sont à la racine, il suffit de préciser que src = "img/julien.png"
.
Voici un autre exemple, cette fois pratique mais à nouveau utilisé dans notre code :
drawImage([-100,julienPos,900,600], 'img/julien.png', 20);julienPos correspond ici à une variable pour "déplacer" l'image petit à petit.
L'écran de démarrage se décompose en plusieurs parties :
drawStartupMenuCette fonction a un argument : step. Soit step un nombre entre 0 et 3. Une fois le boot effectué (boot()), on appelle drawStartupMenu(0), qui va s'occuper de faire apparaître petit à petit J.L. . Cela fait (quand la tête est à la hauteur maximale), la fonction va s'appeller elle-même :
drawStartupMenu(1)L'argument = 1 dessine les commandes. Une fois cela fait, elle se rappelle à nouveau, etc. etc. jusqu'à arriver à
drawStartupMenu(3)Une fois step = 3, la fonctionne cesse de se rappeller.
document.onkeydown = inputKey;Ce code permet de déclencher l'une des plus grosses fonctions dans notre système : la gestion des évènements. Cette fonction, dans events.js va gérer les touches que l'utilisateur utilise. Cette fonction fonctionne sur un principe simple : déterminer la touche, déterminer si elle est utile dans ce niveau, déterminer si on peut l'utiliser dans ce niveau dans le contexte actuel.
Cette dernière gèrant tout le jeu, elle est particulièrement massive. Elle n'autorise pourtant que deux touches sur l'écran de démarrage : J et S (Jouer et couper le Son).
La transition entre ce niveau et l'écran de démarrage est faite grâce à une musique et au dessin de l'écran pour les questions. La musique, une fois terminée, va déclencher un autre évènement. Cet évènement autorisera Julien Lepers à faire son explication. En somme, en démarrant le niveau, la musique s'active. Une fois cette dernière terminée, elle va activer un évènement : ce dernier va vérifier quelle musique vient de se terminer, va voir que c'est celle d'introduction (grâce au nom de fichier) et déclenchera la fonction tutorial()
. Elle utilise elle aussi une variable step
. Cette fois, elle sera activée uniquement grâce à l'appui sur la touche entrée. Une fois le tutoriel passé (qui consiste simplement à effacer l'écran, redessiner le plateau et afficher le texte de tutoriel suivant jusqu'au bout), on passe au vrai niveau un.
Le niveau un est plus complexe. Il se base sur un système de vies, de compte à rebours, de score, d'atouts et de questions. Malgré le nombre d'éléments à gérer, c'est encore ridiculement simple : chaque élément est géré par une fonction (en général nommée draw<Nom de l'élément>
). Les questions vont se suivre selon ce système :
newQuestion()
dans le fichier questions.js.playLvl1()
, qui va appeller toutes les fonctions nécessaires en plus de redessiner l'écran.
shuffle()
sur les réponses de façon à les mélanger. On les affiche et on déclare au système quelle est la bonne réponse.