diff options
author | julieng <julien.gattelier@gmail.com> | 2021-11-11 07:45:14 +0100 |
---|---|---|
committer | SphinxKnight <SphinxKnight@users.noreply.github.com> | 2021-11-11 09:09:24 +0100 |
commit | e70d9556485debd0724eeff93d326bf946113c93 (patch) | |
tree | 0e59caf7dfa1a0921e0e1d1f577ed28f7de14fde /files/fr/games/tutorials/2d_breakout_game_pure_javascript | |
parent | 728e7b64e54f3b6e56eaba38b65adbbaa42990ca (diff) | |
download | translated-content-e70d9556485debd0724eeff93d326bf946113c93.tar.gz translated-content-e70d9556485debd0724eeff93d326bf946113c93.tar.bz2 translated-content-e70d9556485debd0724eeff93d326bf946113c93.zip |
convert content to md
Diffstat (limited to 'files/fr/games/tutorials/2d_breakout_game_pure_javascript')
11 files changed, 567 insertions, 494 deletions
diff --git a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/bounce_off_the_walls/index.md b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/bounce_off_the_walls/index.md index ba76f92846..b28c6c8b26 100644 --- a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/bounce_off_the_walls/index.md +++ b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/bounce_off_the_walls/index.md @@ -16,94 +16,107 @@ translation_of: Games/Tutorials/2D_Breakout_game_pure_JavaScript/Bounce_off_the_ original_slug: >- Games/Workflows/2D_Breakout_game_pure_JavaScript/Faire_rebondir_la_balle_sur_les_murs --- -<div>{{GamesSidebar}}</div> +{{GamesSidebar}}{{IncludeSubnav("/fr/docs/Games")}} -<div>{{IncludeSubnav("/fr/docs/Games")}}</div> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Move_the_ball", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Paddle_et_contr%C3%B4le_clavier")}} -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Move_the_ball", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Paddle_et_contr%C3%B4le_clavier")}}</p> +C'est la **3<sup>e</sup> étape sur** 10 de ce [tutoriel Gamedev Canvas](/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript). Vous pouvez retrouver le code source de cette leçon sur [Gamedev-Canvas-workshop/lesson3.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson01.html). -<p>C'est la <strong>3<sup>e</sup> étape sur</strong> 10 de ce <a href="/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript">tutoriel Gamedev Canvas</a>. Vous pouvez retrouver le code source de cette leçon sur <a class="external external-icon" href="https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson01.html" rel="noopener">Gamedev-Canvas-workshop/lesson3.html</a>.</p> +C'est agréable de voir notre balle bouger, mais elle disparaît rapidement de l'écran, ce qui limite le plaisir que nous pouvons avoir avec elle ! Pour y pallier, nous allons mettre en place une détection de collision très simple (qui sera expliquée plus tard en détail) pour faire rebondir la balle sur les quatre bords de la toile. -<p>C'est agréable de voir notre balle bouger, mais elle disparaît rapidement de l'écran, ce qui limite le plaisir que nous pouvons avoir avec elle ! Pour y pallier, nous allons mettre en place une détection de collision très simple (qui sera expliquée plus tard en détail) pour faire rebondir la balle sur les quatre bords de la toile.</p> +## Détection des collisions -<h2 id="Détection_des_collisions">Détection des collisions</h2> +Pour détecter la collision, nous vérifierons si la balle touche (entre en collision avec) le mur et, si c'est le cas, nous modifierons la direction de son mouvement en conséquence. -<p>Pour détecter la collision, nous vérifierons si la balle touche (entre en collision avec) le mur et, si c'est le cas, nous modifierons la direction de son mouvement en conséquence.<br> - <br> - Pour faciliter les calculs, nous allons définir une variable appelée <code>ballRadius</code> qui contiendra le rayon du cercle dessiné et sera utilisée pour les calculs. Ajoutez cette variable à votre code, quelque part en dessous des déclarations de variables existantes :<br> - </p> +Pour faciliter les calculs, nous allons définir une variable appelée `ballRadius` qui contiendra le rayon du cercle dessiné et sera utilisée pour les calculs. Ajoutez cette variable à votre code, quelque part en dessous des déclarations de variables existantes : -<pre class="brush: js">var ballRadius = 10;</pre> -<p>Mettez maintenant à jour la ligne qui dessine la balle à l'intérieur de la fonction <code>drawBall()</code> :</p> -<pre class="brush: js">ctx.arc(x, y, ballRadius, 0, Math.PI*2);</pre> +```js +var ballRadius = 10; +``` -<h3 id="Rebondir_en_haut_et_en_bas">Rebondir en haut et en bas</h3> +Mettez maintenant à jour la ligne qui dessine la balle à l'intérieur de la fonction `drawBall()` : -<p>Il y a 4 murs en tout mais nous allons d'abord nous pencher sur le mur du haut. Nous devons, à chaque rafraichissement du canvas, regarder si la balle touche le bord du haut. Si c'est le cas, alors nous devons inverser la direction de la balle pour créer un effet de limite de zone de jeu. Il ne faut surtout pas oublier que le point d'origine est en haut à gauche ! Nous pouvons donc écrire :</p> +```js +ctx.arc(x, y, ballRadius, 0, Math.PI*2); +``` -<pre class="brush: js">if(y + dy < 0) { +### Rebondir en haut et en bas + +Il y a 4 murs en tout mais nous allons d'abord nous pencher sur le mur du haut. Nous devons, à chaque rafraichissement du canvas, regarder si la balle touche le bord du haut. Si c'est le cas, alors nous devons inverser la direction de la balle pour créer un effet de limite de zone de jeu. Il ne faut surtout pas oublier que le point d'origine est en haut à gauche ! Nous pouvons donc écrire : + +```js +if(y + dy < 0) { dy = -dy; -}</pre> +} +``` + +Si la valeur y de la position de la balle est inférieure à zéro, changez la direction du mouvement sur l'axe y en le rendant égal à son inverse. Si la balle se déplaçait vers le haut à une vitesse de 2 pixels par image, elle se déplacera maintenant "vers le haut" à une vitesse de -2 pixels, ce qui équivaut en fait à se déplacer vers le bas à une vitesse de 2 pixels par image. -<p>Si la valeur y de la position de la balle est inférieure à zéro, changez la direction du mouvement sur l'axe y en le rendant égal à son inverse. Si la balle se déplaçait vers le haut à une vitesse de 2 pixels par image, elle se déplacera maintenant "vers le haut" à une vitesse de -2 pixels, ce qui équivaut en fait à se déplacer vers le bas à une vitesse de 2 pixels par image.<br> - <br> - Le code ci-dessus traite du rebondissement de la balle sur le bord supérieur, alors traitons maintenant le bord inférieur :</p> +Le code ci-dessus traite du rebondissement de la balle sur le bord supérieur, alors traitons maintenant le bord inférieur : -<pre class="brush: js">if(y + dy > canvas.height) { +```js +if(y + dy > canvas.height) { dy = -dy; -}</pre> +} +``` -<p>Si la position en y de la balle est supérieure à la hauteur du canvas (soit 480 pixels dans cette leçon) on inverse encore la vitesse de la balle.</p> +Si la position en y de la balle est supérieure à la hauteur du canvas (soit 480 pixels dans cette leçon) on inverse encore la vitesse de la balle. -<p>On peut rassembler les deux conditions en une grâce au "ou" qui s'écrit || en JavaScript :</p> +On peut rassembler les deux conditions en une grâce au "ou" qui s'écrit || en JavaScript : -<pre class="brush: js">if(y + dy > canvas.height || y + dy < 0) { +```js +if(y + dy > canvas.height || y + dy < 0) { dy = -dy; -}</pre> +} +``` -<p>Si une des deux conditions est vérifiée, alors la vitesse est inversée. Essayez de créer votre propre code pour la gauche et la droite avant de passer à la prochaine sous-partie. Vous verrez que le principe est le même.</p> +Si une des deux conditions est vérifiée, alors la vitesse est inversée. Essayez de créer votre propre code pour la gauche et la droite avant de passer à la prochaine sous-partie. Vous verrez que le principe est le même. -<h3 id="Rebondir_à_gauche_et_à_droite">Rebondir à gauche et à droite</h3> +### Rebondir à gauche et à droite -<p>Nous avons couvert les bords supérieur et inférieur, alors pensons à ceux de gauche et de droite. C'est très similaire en fait, il suffit de répéter les instructions pour <code>x</code> au lieu de <code>y</code> :</p> +Nous avons couvert les bords supérieur et inférieur, alors pensons à ceux de gauche et de droite. C'est très similaire en fait, il suffit de répéter les instructions pour `x` au lieu de `y` : -<pre class="brush: js">if(x + dx > canvas.width || x + dx < 0) { +```js +if(x + dx > canvas.width || x + dx < 0) { dx = -dx; } -if(y + dy > canvas.height || y + dy < 0) { +if(y + dy > canvas.height || y + dy < 0) { dy = -dy; -}</pre> +} +``` -<p>À ce stade, vous devez insérer le bloc de code ci-dessus dans la fonction draw(), juste avant l'accolade de fermeture.</p> +À ce stade, vous devez insérer le bloc de code ci-dessus dans la fonction draw(), juste avant l'accolade de fermeture. -<h3 id="La_balle_disparaît_toujours!">La balle disparaît toujours!</h3> +### La balle disparaît toujours! -<p>Testez votre code à ce stade, et vous serez impressionné — nous avons maintenant une balle qui rebondit sur les quatre bords de la toile ! Mais nous avons un autre problème — lorsque la balle frappe un mur, elle s'y enfonce légèrement avant de changer de direction :</p> +Testez votre code à ce stade, et vous serez impressionné — nous avons maintenant une balle qui rebondit sur les quatre bords de la toile ! Mais nous avons un autre problème — lorsque la balle frappe un mur, elle s'y enfonce légèrement avant de changer de direction : -<p><img alt="" src="ball-in-wall.png"></p> +![](ball-in-wall.png) -<p>C'est parce que nous calculons le point de collision entre le mur et le centre de la balle, alors que nous devrions le faire pour sa circonférence. La balle devrait rebondir juste après avoir touché le mur, et non pas lorsqu'elle est déjà à mi-chemin dans le mur, alors ajustons un peu nos déclarations pour inclure cela. Mettez à jour le dernier code que vous avez ajouté :</p> +C'est parce que nous calculons le point de collision entre le mur et le centre de la balle, alors que nous devrions le faire pour sa circonférence. La balle devrait rebondir juste après avoir touché le mur, et non pas lorsqu'elle est déjà à mi-chemin dans le mur, alors ajustons un peu nos déclarations pour inclure cela. Mettez à jour le dernier code que vous avez ajouté : -<pre class="brush: js">if(x + dx > canvas.width-ballRadius || x + dx < ballRadius) { +```js +if(x + dx > canvas.width-ballRadius || x + dx < ballRadius) { dx = -dx; } -if(y + dy > canvas.height-ballRadius || y + dy < ballRadius) { +if(y + dy > canvas.height-ballRadius || y + dy < ballRadius) { dy = -dy; -}</pre> +} +``` -<p>Lorsque la distance entre le centre de la balle et le bord du mur est exactement la même que le rayon de la balle, cela change la direction du mouvement. Soustraire le rayon de la largeur d'un bord et l'ajouter à l'autre nous donne l'impression d'une détection de collision correcte — la balle rebondit sur les murs comme elle devrait le faire.</p> +Lorsque la distance entre le centre de la balle et le bord du mur est exactement la même que le rayon de la balle, cela change la direction du mouvement. Soustraire le rayon de la largeur d'un bord et l'ajouter à l'autre nous donne l'impression d'une détection de collision correcte — la balle rebondit sur les murs comme elle devrait le faire. -<h2 id="Comparez_votre_code">Comparez votre code</h2> +## Comparez votre code -<p>Vérifions encore une fois le code fini pour cette partie par rapport à ce que vous avez, et jouons une partie :</p> +Vérifions encore une fois le code fini pour cette partie par rapport à ce que vous avez, et jouons une partie : -<p>{{JSFiddleEmbed("https://jsfiddle.net/end3r/redj37dc/","","395")}}</p> +{{JSFiddleEmbed("https://jsfiddle.net/end3r/redj37dc/","","395")}} -<p><strong>Exercice</strong>: essayez de changer la couleur de la balle à chaque fois que celle-ci tape un mur.</p> +**Exercice**: essayez de changer la couleur de la balle à chaque fois que celle-ci tape un mur. -<h2 id="Dans_le_prochain_chapitre">Dans le prochain chapitre</h2> +## Dans le prochain chapitre -<p>Nous sommes maintenant arrivés au stade où notre balle se déplace et reste sur le plateau de jeu. Dans le quatrième chapitre, nous examinerons la mise en place d'une raquette contrôlable - voir<a href="/fr/docs/Games/Workflows/Breakout_game_from_scratch/Paddle_and_keyboard_controls"> Raquette et contrôle au clavier</a>. {PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Move_the_ball", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Paddle_et_contr%C3%B4le_clavier")}}</p> +Nous sommes maintenant arrivés au stade où notre balle se déplace et reste sur le plateau de jeu. Dans le quatrième chapitre, nous examinerons la mise en place d'une raquette contrôlable - voir[ Raquette et contrôle au clavier](/fr/docs/Games/Workflows/Breakout_game_from_scratch/Paddle_and_keyboard_controls). {PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Move_the_ball", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Paddle_et_contr%C3%B4le_clavier")}} diff --git a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/build_the_brick_field/index.md b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/build_the_brick_field/index.md index 7814fecefa..1c89ff4260 100644 --- a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/build_the_brick_field/index.md +++ b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/build_the_brick_field/index.md @@ -12,50 +12,53 @@ tags: translation_of: Games/Tutorials/2D_Breakout_game_pure_JavaScript/Build_the_brick_field original_slug: Games/Workflows/2D_Breakout_game_pure_JavaScript/Build_the_brick_field --- -<div>{{GamesSidebar}}</div> +{{GamesSidebar}}{{IncludeSubnav("/fr/docs/Games")}} -<div>{{IncludeSubnav("/fr/docs/Games")}}</div> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Game_over", "Games/Workflows/2D_Breakout_game_pure_JavaScript/detection_colisions")}} -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Game_over", "Games/Workflows/2D_Breakout_game_pure_JavaScript/detection_colisions")}}</p> +Il s'agit de la **6ème étape** sur 10 du [Gamedev Canvas tutorial](/fr/docs/Games/Workflows/Breakout_game_from_scratch). Vous pouvez trouver le code source après avoir complété cette leçon à : [Gamedev-Canvas-workshop/lesson6.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson06.html). -<p>Il s'agit de la <strong>6ème étape</strong> sur 10 du <a href="/fr/docs/Games/Workflows/Breakout_game_from_scratch">Gamedev Canvas tutorial</a>. Vous pouvez trouver le code source après avoir complété cette leçon à : <a href="https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson06.html">Gamedev-Canvas-workshop/lesson6.html</a>.</p> +Après avoir modifié la mécanique du Gameplay, nous sommes maintenant en mesure de perdre. Et ça c'est top car on a enfin l'impression de jouer à un vrai jeu. Cependant, ça devient vite ennuyeux si la balle ne fait que rebondir sur la raquette. Ce dont a vraiment besoin un jeu de casse-brique c'est des briques à détruire avec la balle. Et c'est ce que nous allons faire maintenant. -<p>Après avoir modifié la mécanique du Gameplay, nous sommes maintenant en mesure de perdre. Et ça c'est top car on a enfin l'impression de jouer à un vrai jeu. Cependant, ça devient vite ennuyeux si la balle ne fait que rebondir sur la raquette. Ce dont a vraiment besoin un jeu de casse-brique c'est des briques à détruire avec la balle. Et c'est ce que nous allons faire maintenant.</p> +## Mettre en place les variables "Brique" -<h2 id="Mettre_en_place_les_variables_Brique">Mettre en place les variables "Brique"</h2> +Le principal objectif de cette leçon est d'avoir quelques lignes de code pour afficher les briques, en utilisant une boucle imbriquée qui va parcourir un tableau à deux dimensions. Cependant nous avons besoin de définir quelques variables pour stocker des informations décrivant les briques, telles que leur largeur, leur hauteur, les colonnes et les lignes, etc. Ajoutez les lignes suivantes dans votre code, sous les variables préalablement déclarées. -<p>Le principal objectif de cette leçon est d'avoir quelques lignes de code pour afficher les briques, en utilisant une boucle imbriquée qui va parcourir un tableau à deux dimensions. Cependant nous avons besoin de définir quelques variables pour stocker des informations décrivant les briques, telles que leur largeur, leur hauteur, les colonnes et les lignes, etc. Ajoutez les lignes suivantes dans votre code, sous les variables préalablement déclarées.</p> - -<pre class="brush: js">var brickRowCount = 3; +```js +var brickRowCount = 3; var brickColumnCount = 5; var brickWidth = 75; var brickHeight = 20; var brickPadding = 10; var brickOffsetTop = 30; -var brickOffsetLeft = 30;</pre> +var brickOffsetLeft = 30; +``` -<p>Ici nous avons défini dans l'ordre le nombre de lignes et de colonnes de briques, mais également une hauteur, une largeur et un espacement (<em>padding</em>) entre les briques pour qu'elles ne se touchent pas entre elles et qu'elles ne commencent pas a être tracées sur le bord du canevas.</p> +Ici nous avons défini dans l'ordre le nombre de lignes et de colonnes de briques, mais également une hauteur, une largeur et un espacement (_padding_) entre les briques pour qu'elles ne se touchent pas entre elles et qu'elles ne commencent pas a être tracées sur le bord du canevas. -<p>Nous allons placer nos briques dans un tableau à deux dimensions. Il contiendra les colonnes de briques (c), qui à leur tour contiendront les lignes de briques (r) qui chacune contiendront un objet défini par une position <code>x</code> et <code>y</code> pour afficher chaque brique sur l'écran.<br> - Ajoutez le code suivant juste en-dessous des variables :</p> +Nous allons placer nos briques dans un tableau à deux dimensions. Il contiendra les colonnes de briques (c), qui à leur tour contiendront les lignes de briques (r) qui chacune contiendront un objet défini par une position `x` et `y` pour afficher chaque brique sur l'écran. +Ajoutez le code suivant juste en-dessous des variables : -<pre class="brush: js">var bricks = []; -for(var c=0; c<brickColumnCount; c++) { +```js +var bricks = []; +for(var c=0; c<brickColumnCount; c++) { bricks[c] = []; - for(var r=0; r<brickRowCount; r++) { + for(var r=0; r<brickRowCount; r++) { bricks[c][r] = { x: 0, y: 0 }; } -}</pre> +} +``` -<p>Le code ci-dessus va parcourir les lignes et les colonnes et créer de nouvelles briques. REMARQUE : les objets briques seront également utilisés plus tard afin de détecter les collisions.</p> +Le code ci-dessus va parcourir les lignes et les colonnes et créer de nouvelles briques. REMARQUE : les objets briques seront également utilisés plus tard afin de détecter les collisions. -<h2 id="Logique_de_dessin_des_briques">Logique de dessin des briques</h2> +## Logique de dessin des briques -<p>Maintenant créons une fonction pour parcourir toutes les briques dans le tableau et les dessiner sur l'écran. Notre code pourrait ressembler à ça :</p> +Maintenant créons une fonction pour parcourir toutes les briques dans le tableau et les dessiner sur l'écran. Notre code pourrait ressembler à ça : -<pre class="brush: js">function drawBricks() { - for(var c=0; c<brickColumnCount; c++) { - for(var r=0; r<brickRowCount; r++) { +```js +function drawBricks() { + for(var c=0; c<brickColumnCount; c++) { + for(var r=0; r<brickRowCount; r++) { bricks[c][r].x = 0; bricks[c][r].y = 0; ctx.beginPath(); @@ -65,20 +68,24 @@ for(var c=0; c<brickColumnCount; c++) { ctx.closePath(); } } -}</pre> +} +``` -<p>Une nouvelle fois, nous parcourons les colonnes et les lignes pour attribuer une position <code>x</code> et <code>y </code>à chaque brique, et nous dessinons les briques — de taille : <code>brickWidth</code> x <code>brickHeight</code> — sur le canevas, pour chaque itération de la boucle. Le problème est que nous les affichons toutes au même endroit, aux coordonnées <code>(0,0)</code>. Ce dont nous avons besoin d'inclure ce sont quelques calculs qui vont définir la position <code>x</code> et <code>y</code> de chaque brique à chaque passage dans la boucle :</p> +Une nouvelle fois, nous parcourons les colonnes et les lignes pour attribuer une position `x` et `y `à chaque brique, et nous dessinons les briques — de taille : `brickWidth` x `brickHeight` — sur le canevas, pour chaque itération de la boucle. Le problème est que nous les affichons toutes au même endroit, aux coordonnées `(0,0)`. Ce dont nous avons besoin d'inclure ce sont quelques calculs qui vont définir la position `x` et `y` de chaque brique à chaque passage dans la boucle : -<pre class="brush: js">var brickX = (c*(brickWidth+brickPadding))+brickOffsetLeft; -var brickY = (r*(brickHeight+brickPadding))+brickOffsetTop;</pre> +```js +var brickX = (c*(brickWidth+brickPadding))+brickOffsetLeft; +var brickY = (r*(brickHeight+brickPadding))+brickOffsetTop; +``` -<p>Chaque position <code>brickX</code> est déterminée par <code>brickWidth</code> + <code>brickPadding</code>, multiplié par le nombre de colonnes, <code>c</code>, plus <code>brickOffsetLeft</code>; la logique pour <code>brickY</code> est identique excepté qu'on utilise pour les ligne les valeurs <code>r</code>,<code>brickHeight</code> et <code>brickOffsetTop</code>. Maintenant chaque brique peut être dessinée à la bonne place - en lignes et colonnes, avec un espacement entre les briques, avec un espace par rapport à la gauche et au haut du contour du canvas.</p> +Chaque position `brickX` est déterminée par `brickWidth` + `brickPadding`, multiplié par le nombre de colonnes, `c`, plus `brickOffsetLeft`; la logique pour `brickY` est identique excepté qu'on utilise pour les ligne les valeurs `r`,`brickHeight` et `brickOffsetTop`. Maintenant chaque brique peut être dessinée à la bonne place - en lignes et colonnes, avec un espacement entre les briques, avec un espace par rapport à la gauche et au haut du contour du canvas. -<p>La version finale de la fonction <code>drawBricks()</code>, après avoir assigné les valeurs <code>brickX</code> et <code>brickY</code> comme coordonnées, plutot que <code>(0,0)</code> à chaque fois, va ressembler à ceci — ajouter la fonction ci-dessous après <code>drawPaddle()</code> :</p> +La version finale de la fonction `drawBricks()`, après avoir assigné les valeurs `brickX` et `brickY` comme coordonnées, plutot que `(0,0)` à chaque fois, va ressembler à ceci — ajouter la fonction ci-dessous après `drawPaddle()` : -<pre class="brush: js">function drawBricks() { - for(var c=0; c<brickColumnCount; c++) { - for(var r=0; r<brickRowCount; r++) { +```js +function drawBricks() { + for(var c=0; c<brickColumnCount; c++) { + for(var r=0; r<brickRowCount; r++) { var brickX = (c*(brickWidth+brickPadding))+brickOffsetLeft; var brickY = (r*(brickHeight+brickPadding))+brickOffsetTop; bricks[c][r].x = brickX; @@ -90,26 +97,28 @@ var brickY = (r*(brickHeight+brickPadding))+brickOffsetTop;</pre> ctx.closePath(); } } -}</pre> +} +``` -<h2 id="Afficher_les_briques">Afficher les briques</h2> +## Afficher les briques -<p>La dernière chose à faire dans cette leçon est d'ajouter un appel à <code>drawBricks()</code> quelque part dans la fonction <code>draw()</code>, préférablement au début, entre le nettoyage du canevas et le dessin de la balle. Ajoutez la ligne suivante juste en dessous de <code>drawBall()</code> :</p> +La dernière chose à faire dans cette leçon est d'ajouter un appel à `drawBricks()` quelque part dans la fonction `draw()`, préférablement au début, entre le nettoyage du canevas et le dessin de la balle. Ajoutez la ligne suivante juste en dessous de `drawBall()` : -<pre class="brush: js">drawBricks(); -</pre> +```js +drawBricks(); +``` -<h2 id="Comparez_votre_code">Comparez votre code</h2> +## Comparez votre code -<p>À ce stade, le jeu a gagné un peu en intérêt :</p> +À ce stade, le jeu a gagné un peu en intérêt : -<p>{{JSFiddleEmbed("https://jsfiddle.net/yumetodo/t1zqmzLp/","","395")}}</p> +{{JSFiddleEmbed("https://jsfiddle.net/yumetodo/t1zqmzLp/","","395")}} -<p>Exercice : essayez de changer le nombre de briques dans une colonne ou dans une ligne ou bien leur position.</p> +Exercice : essayez de changer le nombre de briques dans une colonne ou dans une ligne ou bien leur position. -<h2 id="Prochaines_étapes">Prochaines étapes</h2> +## Prochaines étapes -<p>Nous avons donc maintenant des briques ! <br> - Mais la balle n'a toujours aucune interaction avec elles. Nous allons donc changer ça dans le chapitre sept : <a href="/fr/docs/">Détection des collisions </a></p> +Nous avons donc maintenant des briques ! +Mais la balle n'a toujours aucune interaction avec elles. Nous allons donc changer ça dans le chapitre sept : [Détection des collisions ](/fr/docs/) -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Game_over", "Games/Workflows/2D_Breakout_game_pure_JavaScript/detection_colisions")}}</p> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Game_over", "Games/Workflows/2D_Breakout_game_pure_JavaScript/detection_colisions")}} diff --git a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/collision_detection/index.md b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/collision_detection/index.md index f5f8302b6a..4f2db9ffc5 100644 --- a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/collision_detection/index.md +++ b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/collision_detection/index.md @@ -11,74 +11,76 @@ tags: translation_of: Games/Tutorials/2D_Breakout_game_pure_JavaScript/Collision_detection original_slug: Games/Workflows/2D_Breakout_game_pure_JavaScript/detection_colisions --- -<div>{{GamesSidebar}}</div> +{{GamesSidebar}}{{IncludeSubnav("/fr/docs/Games")}} -<div>{{IncludeSubnav("/fr/docs/Games")}}</div> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Build_the_brick_field", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win")}} -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Build_the_brick_field", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win")}}</p> +Il s'agit de la **7ème étape** sur 10 du [Gamedev Canvas tutorial](/fr/docs/Games/Workflows/Breakout_game_from_scratch). Vous pouvez trouver le code source tel qu'il devrait être après avoir complété cette leçon à : [Gamedev-Canvas-workshop/lesson7.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson07.html). -<p>Il s'agit de la <strong>7ème étape</strong> sur 10 du <a href="/fr/docs/Games/Workflows/Breakout_game_from_scratch">Gamedev Canvas tutorial</a>. Vous pouvez trouver le code source tel qu'il devrait être après avoir complété cette leçon à : <a href="https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson07.html">Gamedev-Canvas-workshop/lesson7.html</a>.</p> +Les briques apparaissent à l'écran, mais le jeu n'est toujours pas intéressant car la balle les traverse. Nous devons ajouter une détection des collisions afin qu’elle puisse rebondir sur les briques et les casser. -<p>Les briques apparaissent à l'écran, mais le jeu n'est toujours pas intéressant car la balle les traverse. Nous devons ajouter une détection des collisions afin qu’elle puisse rebondir sur les briques et les casser.</p> +C'est notre décision, bien sûr, de mettre ça en œuvre, mais il peut être difficile de calculer si la balle touche le rectangle ou non, car il n'y a pas de fonction d'aide dans Canvas pour cela. Dans l'intérêt de ce tutoriel, nous le ferons de la manière la plus simple possible. Nous vérifierons si le centre de la balle entre en collision avec l'une des briques données. Cela ne donnera pas toujours un résultat parfait, et il existe des moyens beaucoup plus sophistiqués de détecter des collisions, mais cela fonctionnera assez bien pour vous apprendre les concepts de base. -<p>C'est notre décision, bien sûr, de mettre ça en œuvre, mais il peut être difficile de calculer si la balle touche le rectangle ou non, car il n'y a pas de fonction d'aide dans Canvas pour cela. Dans l'intérêt de ce tutoriel, nous le ferons de la manière la plus simple possible. Nous vérifierons si le centre de la balle entre en collision avec l'une des briques données. Cela ne donnera pas toujours un résultat parfait, et il existe des moyens beaucoup plus sophistiqués de détecter des collisions, mais cela fonctionnera assez bien pour vous apprendre les concepts de base.</p> +## Une fonction de détection de collision -<h2 id="Une_fonction_de_détection_de_collision">Une fonction de détection de collision</h2> +Pour commencer, nous voulons créer une fonction de détection de collision qui va parcourir toutes les briques et comparer la position de chaque brique avec les coordonnées de la balle lorsque chaque image est dessinée. Pour une meilleure lisibilité du code, nous allons définir la variable `b` pour stocker l’objet brique dans la boucle de la détection de collision: -<p><br> - Pour commencer, nous voulons créer une fonction de détection de collision qui va parcourir toutes les briques et comparer la position de chaque brique avec les coordonnées de la balle lorsque chaque image est dessinée. Pour une meilleure lisibilité du code, nous allons définir la variable <code>b</code> pour stocker l’objet brique dans la boucle de la détection de collision:</p> - -<pre class="brush: js">function collisionDetection() { - for(var c=0; c<brickColumnCount; c++) { - for(var r=0; r<brickRowCount; r++) { +```js +function collisionDetection() { + for(var c=0; c<brickColumnCount; c++) { + for(var r=0; r<brickRowCount; r++) { var b = bricks[c][r]; // calculs } } -}</pre> +} +``` -<p>Si le centre de la balle se trouve à l'intérieur des coordonnées d'une de nos briques, nous changerons la direction de la balle. Pour que le centre de la balle soit à l'intérieur de la brique, les quatre affirmations suivantes doivent être vraies :</p> +Si le centre de la balle se trouve à l'intérieur des coordonnées d'une de nos briques, nous changerons la direction de la balle. Pour que le centre de la balle soit à l'intérieur de la brique, les quatre affirmations suivantes doivent être vraies : -<ul> - <li>La position x de la balle est supérieure à la position x de la brique.</li> - <li>La position x de la balle est inférieure à la position x de la brique plus sa largeur.</li> - <li>La position y de la balle est supérieure à la position y de la brique.</li> - <li>La position y de la balle est inférieure à la position y de la brique plus sa hauteur.</li> -</ul> +- La position x de la balle est supérieure à la position x de la brique. +- La position x de la balle est inférieure à la position x de la brique plus sa largeur. +- La position y de la balle est supérieure à la position y de la brique. +- La position y de la balle est inférieure à la position y de la brique plus sa hauteur. -<p>Écrivons cela sous forme de code:</p> +Écrivons cela sous forme de code: -<pre class="brush: js">function collisionDetection() { - for(var c=0; c<brickColumnCount; c++) { - for(var r=0; r<brickRowCount; r++) { +```js +function collisionDetection() { + for(var c=0; c<brickColumnCount; c++) { + for(var r=0; r<brickRowCount; r++) { var b = bricks[c][r]; -<strong> if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) { + if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) { dy = -dy; - }</strong> + } } } -}</pre> +} +``` -<p>Ajoutez le bloc ci-dessus à votre code, sous la fonction <code>keyUpHandler()</code> .</p> +Ajoutez le bloc ci-dessus à votre code, sous la fonction `keyUpHandler()` . -<h2 id="Faire_disparaître_les_briques_après_quelles_aient_été_touchées">Faire disparaître les briques après qu'elles aient été touchées</h2> +## Faire disparaître les briques après qu'elles aient été touchées -<p>Le code ci-dessus fonctionnera comme vous le souhaitez et la balle changera de direction. Le problème est que les briques restent là où elles sont. Nous devons trouver un moyen de nous débarrasser de celles que nous avons déjà touchées avec la balle. Nous pouvons le faire en ajoutant un paramètre supplémentaire pour indiquer si nous voulons ou non afficher chaque brique à l’écran. Dans la partie du code où nous initialisons les briques, ajoutons une propriété <code>status</code> à chaque brique. Mettez à jour la partie suivante du code comme indiqué par la ligne en évidence:</p> +Le code ci-dessus fonctionnera comme vous le souhaitez et la balle changera de direction. Le problème est que les briques restent là où elles sont. Nous devons trouver un moyen de nous débarrasser de celles que nous avons déjà touchées avec la balle. Nous pouvons le faire en ajoutant un paramètre supplémentaire pour indiquer si nous voulons ou non afficher chaque brique à l’écran. Dans la partie du code où nous initialisons les briques, ajoutons une propriété `status` à chaque brique. Mettez à jour la partie suivante du code comme indiqué par la ligne en évidence: -<pre class="brush: js; highlight:[5]">var bricks = []; -for(var c=0; c<brickColumnCount; c++) { +```js +var bricks = []; +for(var c=0; c<brickColumnCount; c++) { bricks[c] = []; - for(var r=0; r<brickRowCount; r++) { - <strong>bricks[c][r] = { x: 0, y: 0, status: 1 };</strong> + for(var r=0; r<brickRowCount; r++) { + bricks[c][r] = { x: 0, y: 0, status: 1 }; } -}</pre> +} +``` -<p>Nous vérifierons ensuite la valeur de la propriété <code>status</code> de chaque brique dans la fonction <code>drawBricks</code><code>()</code> avant de la dessiner. Si <code>status</code> vaut <code>1</code>, dessinez-la, mais s'il vaut <code>0</code>, la balle a été touchée et nous ne voulons pas la voir sur l'écran. Mettez à jour votre fonction <code>drawBricks</code><code>()</code> comme suit:</p> +Nous vérifierons ensuite la valeur de la propriété `status` de chaque brique dans la fonction ` drawBricks``() ` avant de la dessiner. Si `status` vaut `1`, dessinez-la, mais s'il vaut `0`, la balle a été touchée et nous ne voulons pas la voir sur l'écran. Mettez à jour votre fonction ` drawBricks``() ` comme suit: -<pre class="brush: js; highlight:[4,5,6,7,8,9,10,11,12,13,14]">function drawBricks() { - for(var c=0; c<brickColumnCount; c++) { - for(var r=0; r<brickRowCount; r++) { - <strong>if(bricks[c][r].status == 1) {</strong> +```js +function drawBricks() { + for(var c=0; c<brickColumnCount; c++) { + for(var r=0; r<brickRowCount; r++) { + if(bricks[c][r].status == 1) { var brickX = (c*(brickWidth+brickPadding))+brickOffsetLeft; var brickY = (r*(brickHeight+brickPadding))+brickOffsetTop; bricks[c][r].x = brickX; @@ -88,46 +90,50 @@ for(var c=0; c<brickColumnCount; c++) { ctx.fillStyle = "#0095DD"; ctx.fill(); ctx.closePath(); - <strong>}</strong> + } } } -}</pre> +} +``` -<h2 id="Suivi_et_mise_à_jour_de_létat_dans_la_fonction_de_détection_de_collision">Suivi et mise à jour de l'état dans la fonction de détection de collision</h2> +## Suivi et mise à jour de l'état dans la fonction de détection de collision -<p>Nous devons maintenant impliquer la propriété de <code>status</code> de brique dans la fonction <code>collisionDetection()</code>: si la brique est active (son statut est <code>1</code>), nous vérifierons si une collision a lieu ; Si une collision se produit, nous allons définir l'état de la brique donnée sur <code>0</code> afin qu'elle ne soit pas affichée à l'écran. Mettez à jour votre fonction <code>collisionDetection()</code> comme indiqué ci-dessous:</p> +Nous devons maintenant impliquer la propriété de `status` de brique dans la fonction `collisionDetection()`: si la brique est active (son statut est `1`), nous vérifierons si une collision a lieu ; Si une collision se produit, nous allons définir l'état de la brique donnée sur `0` afin qu'elle ne soit pas affichée à l'écran. Mettez à jour votre fonction `collisionDetection()` comme indiqué ci-dessous: -<pre class="brush: js; highlight:[5,6,7,8,9,10]">function collisionDetection() { - for(var c=0; c<brickColumnCount; c++) { - for(var r=0; r<brickRowCount; r++) { +```js +function collisionDetection() { + for(var c=0; c<brickColumnCount; c++) { + for(var r=0; r<brickRowCount; r++) { var b = bricks[c][r]; - <strong>if(b.status == 1) {</strong> - if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) { + if(b.status == 1) { + if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) { dy = -dy; - <strong> b.status = 0;</strong> + b.status = 0; } - <strong>}</strong> + } } } -}</pre> +} +``` -<h2 id="Activer_notre_détection_de_collision">Activer notre détection de collision</h2> +## Activer notre détection de collision -<p>La dernière chose à faire est d’ajouter un appel à la fonction <code>collisionDetection ()</code> à notre fonction <code>draw()</code> principale. Ajoutez la ligne suivante à la fonction <code>draw ()</code>, juste en dessous de l'appel <code>drawPaddle()</code>:</p> +La dernière chose à faire est d’ajouter un appel à la fonction `collisionDetection ()` à notre fonction `draw()` principale. Ajoutez la ligne suivante à la fonction `draw ()`, juste en dessous de l'appel `drawPaddle()`: -<pre class="brush: js">collisionDetection(); -</pre> +```js +collisionDetection(); +``` -<h2 id="Comparez_votre_code">Comparez votre code</h2> +## Comparez votre code -<p>La détection de collision de la balle est maintenant vérifiée sur chaque image, avec chaque brique. Maintenant, nous pouvons détruire des briques ! : -</p> +La détection de collision de la balle est maintenant vérifiée sur chaque image, avec chaque brique. Maintenant, nous pouvons détruire des briques ! : - -<p>{{JSFiddleEmbed("https://jsfiddle.net/yumetodo/mkwtxgc3/242/","","395")}}</p> +{{JSFiddleEmbed("https://jsfiddle.net/yumetodo/mkwtxgc3/242/","","395")}} -<p>Exercice: changez la couleur de la balle lorsqu'elle frappe une brique.</p> +Exercice: changez la couleur de la balle lorsqu'elle frappe une brique. -<h2 id="Prochaine_étape">Prochaine étape</h2> +## Prochaine étape -<p>Nous ne sommes plus très loin de la fin ; poursuivons ! Dans le huitième chapitre, nous verrons comment<a href="/fr/docs/Games/Workflows/Breakout_game_from_scratch/Track_the_score_and_win"> Track the score and win</a>.</p> +Nous ne sommes plus très loin de la fin ; poursuivons ! Dans le huitième chapitre, nous verrons comment[ Track the score and win](/fr/docs/Games/Workflows/Breakout_game_from_scratch/Track_the_score_and_win). -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Build_the_brick_field", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win")}}</p> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Build_the_brick_field", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win")}} diff --git a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/create_the_canvas_and_draw_on_it/index.md b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/create_the_canvas_and_draw_on_it/index.md index ff39e2bf9d..39debd17dd 100644 --- a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/create_the_canvas_and_draw_on_it/index.md +++ b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/create_the_canvas_and_draw_on_it/index.md @@ -15,101 +15,107 @@ translation_of: >- original_slug: >- Games/Workflows/2D_Breakout_game_pure_JavaScript/creer_element_canvas_et_afficher --- -<div>{{GamesSidebar}}</div> +{{GamesSidebar}}{{IncludeSubnav("/fr/docs/Jeux")}} -<div>{{IncludeSubnav("/fr/docs/Jeux")}}</div> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Move_the_ball")}} -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Move_the_ball")}}</p> +C'est la **1<sup>re</sup> étape sur** 10 de ce [tutoriel Gamedev Canvas](/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript). Vous pouvez retrouver le code source de cette leçon sur [Gamedev-Canvas-workshop/lesson1.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson01.html). -<p>C'est la <strong>1<sup>re</sup> étape sur</strong> 10 de ce <a href="/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript">tutoriel Gamedev Canvas</a>. Vous pouvez retrouver le code source de cette leçon sur <a href="https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson01.html">Gamedev-Canvas-workshop/lesson1.html</a>.</p> +Avant d'écrire les fonctionnalités de notre jeu, nous devons créer une structure où le jeu sera rendu. C'est possible en utilisant HTML et l'élément {{htmlelement("canvas")}}. -<p>Avant d'écrire les fonctionnalités de notre jeu, nous devons créer une structure où le jeu sera rendu. C'est possible en utilisant HTML et l'élément {{htmlelement("canvas")}}.</p> +## La page HTML du jeu -<h2 id="La_page_HTML_du_jeu">La page HTML du jeu</h2> +La structure de la page HTML est vraiment simple, car tout le jeu sera contenu dans l'élément {{htmlelement("canvas")}}. Avec votre éditeur de texte préféré, créez un nouveau fichier HTML, sauvegardez-le sous le nom `index.html`, et ajoutez-y le code suivant : -<p>La structure de la page HTML est vraiment simple, car tout le jeu sera contenu dans l'élément {{htmlelement("canvas")}}. Avec votre éditeur de texte préféré, créez un nouveau fichier HTML, sauvegardez-le sous le nom <code>index.html</code>, et ajoutez-y le code suivant :</p> - -<pre class="brush: html"><!DOCTYPE html> -<html> -<head> - <meta charset="utf-8" /> - <title>Gamedev Canvas Workshop</title> - <style> +```html +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8" /> + <title>Gamedev Canvas Workshop</title> + <style> * { padding: 0; margin: 0; } canvas { background: #eee; display: block; margin: 0 auto; } - </style> -</head> -<body> + </style> +</head> +<body> -<canvas id="myCanvas" width="480" height="320"></canvas> +<canvas id="myCanvas" width="480" height="320"></canvas> -<script> +<script> // JavaScript code goes here -</script> +</script> -</body> -</html></pre> +</body> +</html> +``` -<p>Dans l'en-tête, nous avons défini l'encodage des caractères (<code>charset</code>), le titre {{htmlelement("title")}} et quelques règles CSS très simples. Le corps contient les éléments {{htmlelement("canvas")}} et {{htmlelement("script")}}. L'élément {{htmlelement("canvas")}} contiendra le rendu du jeu et l'élément {{htmlelement("script")}} l'emplacement du code JavaScript pour contrôler le jeu. L'élément {{htmlelement("canvas")}} a un identifiant nommé <code>myCanvas</code> qui permettra de le retrouver facilement en JavaScript, et possède des dimensions de 480 pixels de longueur et 320 pixels de hauteur. Tout le code JavaScript que nous allons écrire dans ce tutoriel sera contenu entre la balise ouvrante <code><script></code> et la balise fermante <code></script></code>.</p> +Dans l'en-tête, nous avons défini l'encodage des caractères (`charset`), le titre {{htmlelement("title")}} et quelques règles CSS très simples. Le corps contient les éléments {{htmlelement("canvas")}} et {{htmlelement("script")}}. L'élément {{htmlelement("canvas")}} contiendra le rendu du jeu et l'élément {{htmlelement("script")}} l'emplacement du code JavaScript pour contrôler le jeu. L'élément {{htmlelement("canvas")}} a un identifiant nommé `myCanvas` qui permettra de le retrouver facilement en JavaScript, et possède des dimensions de 480 pixels de longueur et 320 pixels de hauteur. Tout le code JavaScript que nous allons écrire dans ce tutoriel sera contenu entre la balise ouvrante `<script>` et la balise fermante `</script>`. -<h2 id="Les_bases_de_Canvas">Les bases de Canvas</h2> +## Les bases de Canvas -<p>Pour utiliser l'élément {{htmlelement("canvas")}}, pour le rendu graphique de notre jeu, nous devons d'abord en donner la référence à JavaScript. Ajoutez le code après la balise ouvrante <code><script></code>.</p> +Pour utiliser l'élément {{htmlelement("canvas")}}, pour le rendu graphique de notre jeu, nous devons d'abord en donner la référence à JavaScript. Ajoutez le code après la balise ouvrante `<script>`. -<pre class="brush: js">var canvas = document.getElementById("myCanvas"); -var ctx = canvas.getContext("2d");</pre> +```js +var canvas = document.getElementById("myCanvas"); +var ctx = canvas.getContext("2d"); +``` -<p>Ici nous avons enregistré la référence à l'élément {{htmlelement("canvas")}} dans une variable nommée <code>canvas</code>. Ensuite, nous créons la variable ctx pour stocker le contexte de rendu 2D — l'outil réel que nous pouvons utiliser pour peindre sur Canvas.</p> +Ici nous avons enregistré la référence à l'élément {{htmlelement("canvas")}} dans une variable nommée `canvas`. Ensuite, nous créons la variable ctx pour stocker le contexte de rendu 2D — l'outil réel que nous pouvons utiliser pour peindre sur Canvas. -<p>Voyons un exemple de code qui imprime un carré rouge sur le canevas. Ajoutez ceci en dessous de vos lignes précédentes de JavaScript, puis chargez votre <code>index.html</code> dans un navigateur pour l'essayer.</p> +Voyons un exemple de code qui imprime un carré rouge sur le canevas. Ajoutez ceci en dessous de vos lignes précédentes de JavaScript, puis chargez votre `index.html` dans un navigateur pour l'essayer. -<pre class="brush: js">ctx.beginPath(); +```js +ctx.beginPath(); ctx.rect(20, 40, 50, 50); ctx.fillStyle = "#FF0000"; ctx.fill(); -ctx.closePath();</pre> +ctx.closePath(); +``` -<p>Toutes les instructions sont entre les méthodes {{domxref("CanvasRenderingContext2D.beginPath()","beginPath()")}} et {{domxref("CanvasRenderingContext2D.closePath()","closePath()")}} . Nous définissons un rectangle en utilisant {{domxref("CanvasRenderingContext2D.rect()","rect()")}} : les deux premières valeurs spécifient les coordonnées du coin supérieur gauche du rectangle tandis que les deux suivantes spécifient la largeur et la hauteur du rectangle. Dans notre cas, le rectangle est peint à 20 pixels du côté gauche de l'écran et à 40 pixels du haut, et a une largeur de 50 pixels et une hauteur de 50 pixels, ce qui en fait un carré parfait. La propriété {{domxref("CanvasRenderingContext2D.fillStyle","fillStyle")}} stocke une couleur qui sera utilisée par la méthode {{domxref("CanvasRenderingContext2D.fill()","fill()")}} pour peindre le carré en rouge.</p> +Toutes les instructions sont entre les méthodes {{domxref("CanvasRenderingContext2D.beginPath()","beginPath()")}} et {{domxref("CanvasRenderingContext2D.closePath()","closePath()")}} . Nous définissons un rectangle en utilisant {{domxref("CanvasRenderingContext2D.rect()","rect()")}} : les deux premières valeurs spécifient les coordonnées du coin supérieur gauche du rectangle tandis que les deux suivantes spécifient la largeur et la hauteur du rectangle. Dans notre cas, le rectangle est peint à 20 pixels du côté gauche de l'écran et à 40 pixels du haut, et a une largeur de 50 pixels et une hauteur de 50 pixels, ce qui en fait un carré parfait. La propriété {{domxref("CanvasRenderingContext2D.fillStyle","fillStyle")}} stocke une couleur qui sera utilisée par la méthode {{domxref("CanvasRenderingContext2D.fill()","fill()")}} pour peindre le carré en rouge. -<p>Nous ne sommes pas limités aux rectangles, voici un code pour imprimer un cercle vert. Essayez d'ajouter ceci au bas de votre JavaScript, puis sauvegardez et rafraîchissez :</p> +Nous ne sommes pas limités aux rectangles, voici un code pour imprimer un cercle vert. Essayez d'ajouter ceci au bas de votre JavaScript, puis sauvegardez et rafraîchissez : -<pre class="brush: js">ctx.beginPath(); +```js +ctx.beginPath(); ctx.arc(240, 160, 20, 0, Math.PI*2, false); ctx.fillStyle = "green"; ctx.fill(); -ctx.closePath();</pre> +ctx.closePath(); +``` -<p>Comme nous pouvons le voir, nous utilisons à nouveau les méthodes {{domxref("CanvasRenderingContext2D.beginPath()","beginPath()")}} et {{domxref("CanvasRenderingContext2D.closePath()","closePath()")}} . Entre elles, la partie la plus importante du code ci-dessus est la méthode {{domxref("CanvasRenderingContext2D.arc()","arc()")}} . Elle comporte six paramètres :</p> +Comme nous pouvons le voir, nous utilisons à nouveau les méthodes {{domxref("CanvasRenderingContext2D.beginPath()","beginPath()")}} et {{domxref("CanvasRenderingContext2D.closePath()","closePath()")}} . Entre elles, la partie la plus importante du code ci-dessus est la méthode {{domxref("CanvasRenderingContext2D.arc()","arc()")}} . Elle comporte six paramètres : -<ul> - <li>les coordonnées <code>x</code> et<code>y</code> du centre de l'arc</li> - <li>rayon de l'arc</li> - <li>l'angle de départ et l'angle de fin (pour finir de dessiner le cercle, en radiant)</li> - <li>direction du dessin (<code>false</code><em>(faux)</em> pour le sens des aiguilles d'une montre, la valeur par défaut, ou <code>true</code> (vrai) pour le sens inverse). Ce dernier paramètre est facultatif.</li> -</ul> +- les coordonnées `x` et`y` du centre de l'arc +- rayon de l'arc +- l'angle de départ et l'angle de fin (pour finir de dessiner le cercle, en radiant) +- direction du dessin (`false`_(faux)_ pour le sens des aiguilles d'une montre, la valeur par défaut, ou `true` (vrai) pour le sens inverse). Ce dernier paramètre est facultatif. -<p>La propriété {{domxref("CanvasRenderingContext2D.fillStyle","fillStyle")}} semble différente par rapport à l'exemple précédent. C'est parce que, tout comme avec CSS, la couleur peut être spécifiée sous la forme d'une valeur hexadécimale, d'un mot-clé, de la fonction <code>rgba ()</code> <em>(RVBA)</em> ou de toute autre méthode disponible pour les couleurs.</p> +La propriété {{domxref("CanvasRenderingContext2D.fillStyle","fillStyle")}} semble différente par rapport à l'exemple précédent. C'est parce que, tout comme avec CSS, la couleur peut être spécifiée sous la forme d'une valeur hexadécimale, d'un mot-clé, de la fonction `rgba ()` _(RVBA)_ ou de toute autre méthode disponible pour les couleurs. -<p>Au lieu d'utiliser {{domxref("CanvasRenderingContext2D.fillStyle","fillStyle")}} et de remplir les formes avec des couleurs, nous pouvons utiliser {{domxref("CanvasRenderingContext2D.stroke()","stroke()")}} pour ne colorer que le contour exterieur. Essayez d'ajouter ce code à votre JavaScript aussi :</p> +Au lieu d'utiliser {{domxref("CanvasRenderingContext2D.fillStyle","fillStyle")}} et de remplir les formes avec des couleurs, nous pouvons utiliser {{domxref("CanvasRenderingContext2D.stroke()","stroke()")}} pour ne colorer que le contour exterieur. Essayez d'ajouter ce code à votre JavaScript aussi : -<pre class="brush: js">ctx.beginPath(); +```js +ctx.beginPath(); ctx.rect(160, 10, 100, 40); ctx.strokeStyle = "rgba(0, 0, 255, 0.5)"; ctx.stroke(); -ctx.closePath();</pre> +ctx.closePath(); +``` -<p>Le code ci-dessus affiche un rectangle vide avec des traits bleus. Grâce au canal alpha de la fonction rgba (), la couleur bleue est semi transparente.</p> +Le code ci-dessus affiche un rectangle vide avec des traits bleus. Grâce au canal alpha de la fonction rgba (), la couleur bleue est semi transparente. -<h2 id="Comparez_votre_code">Comparez votre code</h2> +## Comparez votre code -<p>Voici tout le code source de cette première leçon, fonctionnant avec JSFiddle :</p> +Voici tout le code source de cette première leçon, fonctionnant avec JSFiddle : -<p>{{JSFiddleEmbed("https://jsfiddle.net/end3r/x62h15e2/","","370")}}</p> +{{JSFiddleEmbed("https://jsfiddle.net/end3r/x62h15e2/","","370")}} -<p><strong>Exercice </strong>: essayez de changer la taille et la couleur des formes géométriques.</p> +**Exercice** : essayez de changer la taille et la couleur des formes géométriques. -<h2 id="Prochaines_étapes">Prochaines étapes</h2> +## Prochaines étapes -<p>Maintenant, nous avons mis en place le code HTML de base et avons appris un peu sur Canvas, passons au deuxième chapitre et étudions comment <a href="/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Move_the_ball">Déplacer une balle sur notre jeu</a>.</p> +Maintenant, nous avons mis en place le code HTML de base et avons appris un peu sur Canvas, passons au deuxième chapitre et étudions comment [Déplacer une balle sur notre jeu](/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Move_the_ball). -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Move_the_ball")}}</p> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Move_the_ball")}} diff --git a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/finishing_up/index.md b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/finishing_up/index.md index db9da728f2..28d241a3cd 100644 --- a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/finishing_up/index.md +++ b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/finishing_up/index.md @@ -12,41 +12,44 @@ tags: translation_of: Games/Tutorials/2D_Breakout_game_pure_JavaScript/Finishing_up original_slug: Games/Workflows/2D_Breakout_game_pure_JavaScript/finitions --- -<div>{{GamesSidebar}}</div> +{{GamesSidebar}}{{IncludeSubnav("/fr/docs/Games")}} -<div>{{IncludeSubnav("/fr/docs/Games")}}</div> +{{Previous("Games/Workflows/2D_Breakout_game_pure_JavaScript/Mouse_controls")}} -<p>{{Previous("Games/Workflows/2D_Breakout_game_pure_JavaScript/Mouse_controls")}}</p> +C'est la dernière étape de ce [tutoriel Gamedev Canvas](/fr/docs/Games/Workflows/Breakout_game_from_scratch). Vous pouvez trouver le code source tel qu'il devrait être après avoir terminé cette leçon à l'adresse [Gamedev-Canvas-workshop/lesson10.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson10.html). -<p>C'est la dernière étape de ce <a href="/fr/docs/Games/Workflows/Breakout_game_from_scratch">tutoriel Gamedev Canvas</a>. Vous pouvez trouver le code source tel qu'il devrait être après avoir terminé cette leçon à l'adresse <a href="https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson10.html">Gamedev-Canvas-workshop/lesson10.html</a>.</p> +Il y a toujours des améliorations possibles pour tous les jeux que nous créons. Par exemple, nous pouvons offrir plus d'une vie au joueur. Il peut faire une ou deux erreurs et être encore capable de terminer le jeu. Nous pourrions également améliorer le rendu visuel du jeu. -<p>Il y a toujours des améliorations possibles pour tous les jeux que nous créons. Par exemple, nous pouvons offrir plus d'une vie au joueur. Il peut faire une ou deux erreurs et être encore capable de terminer le jeu. Nous pourrions également améliorer le rendu visuel du jeu.</p> +## Donner des vies au joueur -<h2 id="Donner_des_vies_au_joueur">Donner des vies au joueur</h2> +Mettre en œuvre des vies est assez simple. Ajoutons d'abord une variable pour stocker le nombre de vies à l'endroit où nous avons déclaré nos autres variables : -<p>Mettre en œuvre des vies est assez simple. Ajoutons d'abord une variable pour stocker le nombre de vies à l'endroit où nous avons déclaré nos autres variables :</p> +```js +var lives = 3; +``` -<pre class="brush: js">var lives = 3;</pre> +L'affichage du compteur de vie est similaire à celui du compteur de points — ajoutez la fonction suivante à votre code, sous la fonction `drawScore()` : -<p>L'affichage du compteur de vie est similaire à celui du compteur de points — ajoutez la fonction suivante à votre code, sous la fonction <code>drawScore()</code> :</p> - -<pre class="brush: js">function drawLives() { +```js +function drawLives() { ctx.font = "16px Arial"; ctx.fillStyle = "#0095DD"; ctx.fillText("Lives: "+lives, canvas.width-65, 20); -}</pre> +} +``` -<p>Au lieu de mettre immédiatement fin au jeu, nous allons réduire le nombre de vies jusqu'à ce qu'il n'y en ait plus. Nous pouvons également réinitialiser les positions du ballon et de la raquette lorsque le joueur commence sa prochaine vie. Ainsi, dans la fonction <code>draw()</code>, remplacez les trois lignes suivantes :</p> +Au lieu de mettre immédiatement fin au jeu, nous allons réduire le nombre de vies jusqu'à ce qu'il n'y en ait plus. Nous pouvons également réinitialiser les positions du ballon et de la raquette lorsque le joueur commence sa prochaine vie. Ainsi, dans la fonction `draw()`, remplacez les trois lignes suivantes : -<pre class="brush: js">alert("GAME OVER"); +```js +alert("GAME OVER"); document.location.reload(); -clearInterval(interval); // Needed for Chrome to end game</pre> - +clearInterval(interval); // Needed for Chrome to end game +``` +Nous pouvons ainsi y ajouter une logique un peu plus complexe, comme indiqué ci-dessous : -<p>Nous pouvons ainsi y ajouter une logique un peu plus complexe, comme indiqué ci-dessous :</p> - -<pre class="brush: js">lives--; +```js +lives--; if(!lives) { alert("GAME OVER"); document.location.reload(); @@ -58,50 +61,59 @@ else { dx = 2; dy = -2; paddleX = (canvas.width-paddleWidth)/2; -}</pre> +} +``` -<p>Maintenant, quand la balle frappe le bord inférieur de l'écran, nous soustrayons une vie de la variable <code>lives</code>. S'il n'y a plus de vies, la partie est perdue ; s'il reste encore des vies, alors la position de la balle et la raquette sont remises à zéro, ainsi que le mouvement de la balle.</p> +Maintenant, quand la balle frappe le bord inférieur de l'écran, nous soustrayons une vie de la variable `lives`. S'il n'y a plus de vies, la partie est perdue ; s'il reste encore des vies, alors la position de la balle et la raquette sont remises à zéro, ainsi que le mouvement de la balle. -<h3 id="Afficher_le_compteur_de_vies">Afficher le compteur de vies</h3> +### Afficher le compteur de vies -<p>Maintenant, vous devez ajouter un appel à <code>drawLives()</code> dans la fonction <code>draw()</code> et l'ajouter sous l'appel <code>drawScore()</code>.</p> +Maintenant, vous devez ajouter un appel à `drawLives()` dans la fonction `draw()` et l'ajouter sous l'appel `drawScore()`. -<pre class="brush: js">drawLives(); -</pre> +```js +drawLives(); +``` -<h2 id="Améliorer_le_rendu_avec_requestAnimationFrame">Améliorer le rendu avec requestAnimationFrame()</h2> +## Améliorer le rendu avec requestAnimationFrame() -<p>Maintenant, travaillons sur quelque chose qui n'est pas lié à la mécanique du jeu, mais à la façon dont il est rendu. {{domxref("window.requestAnimationFrame", "requestAnimationFrame")}} aide le navigateur à rendre le jeu mieux que la cadence fixe que nous avons actuellement mise en place en utilisant {{domxref("windowTimers.setInterval()", "setInterval()")}}. Remplacez la ligne suivante :</p> +Maintenant, travaillons sur quelque chose qui n'est pas lié à la mécanique du jeu, mais à la façon dont il est rendu. {{domxref("window.requestAnimationFrame", "requestAnimationFrame")}} aide le navigateur à rendre le jeu mieux que la cadence fixe que nous avons actuellement mise en place en utilisant {{domxref("windowTimers.setInterval()", "setInterval()")}}. Remplacez la ligne suivante : -<pre class="brush: js">var interval = setInterval(draw, 10);</pre> +```js +var interval = setInterval(draw, 10); +``` -<p>avec simplement :</p> +avec simplement : -<pre class="brush: js">draw();</pre> +```js +draw(); +``` -<p>et supprimez chaque occurence de :</p> +et supprimez chaque occurence de : -<pre class="brush: js">clearInterval(interval); // Needed for Chrome to end game -</pre> +```js +clearInterval(interval); // Needed for Chrome to end game +``` -<p>Ensuite, tout en bas de la fonction <code>draw()</code> (juste avant l'accolade de fermeture), ajoutez la ligne suivante, ce qui fait que la fonction <code>draw()</code> s'appelle encore et encore :</p> +Ensuite, tout en bas de la fonction `draw()` (juste avant l'accolade de fermeture), ajoutez la ligne suivante, ce qui fait que la fonction `draw()` s'appelle encore et encore : -<pre class="brush: js">requestAnimationFrame(draw);</pre> +```js +requestAnimationFrame(draw); +``` -<p>La fonction <code>draw()</code> est maintenant exécutée indéfiniment dans une boucle <code>requestAnimationFrame()</code>, mais au lieu de la cadence fixe de 10 millisecondes, nous redonnons le contrôle de la cadence au navigateur. Il synchronisera la cadence en conséquence et ne n'acutalisera l'affichage que lorsque cela sera nécessaire. Cela permet d'obtenir une boucle d'animation plus efficace et plus fluide que l'ancienne méthode <code>setInterval()</code>.</p> +La fonction `draw()` est maintenant exécutée indéfiniment dans une boucle `requestAnimationFrame()`, mais au lieu de la cadence fixe de 10 millisecondes, nous redonnons le contrôle de la cadence au navigateur. Il synchronisera la cadence en conséquence et ne n'acutalisera l'affichage que lorsque cela sera nécessaire. Cela permet d'obtenir une boucle d'animation plus efficace et plus fluide que l'ancienne méthode `setInterval()`. -<h2 id="Comparez_votre_code_your_code">Comparez votre code your code</h2> +## Comparez votre code your code -<p>C'est tout — la version finale du jeu est prête et prête à être lancée !</p> +C'est tout — la version finale du jeu est prête et prête à être lancée ! -<p>{{JSFiddleEmbed("https://jsfiddle.net/raymondjplante/dfh2tpu1/","","395")}}</p> +{{JSFiddleEmbed("https://jsfiddle.net/raymondjplante/dfh2tpu1/","","395")}} -<p><strong>Exercice</strong>: changer le nombre de vies et l'angle de rebond de la balle sur la raquette.</p> +**Exercice**: changer le nombre de vies et l'angle de rebond de la balle sur la raquette. -<h2 id="Game_over_-_pour_linstant_!">Game over - pour l'instant !</h2> +## Game over - pour l'instant ! -<p>Vous avez terminé toutes les leçons - félicitations ! À ce stade, vous devriez maintenant connaître les bases de la manipulation des Canevas et la logique des jeux simples en 2D. C'est maintenant le bon moment pour apprendre quelques frameworks et continuer le développement du jeu. Vous pouvez découvrir le pendant de cette série, le <a href="/fr/docs/Games/Workflows/2D_breakout_game_Phaser">casse-brique 2D utilisant Phaser</a> ou le <a href="/fr/docs/Games/Workflows/HTML5_Gamedev_Phaser_Device_Orientation_FR">tutoriel Cyber Orb</a> construit avec Phaser. Vous pouvez également consulter la section <a href="/fr/docs/Jeux">Jeux sur MDN</a> pour vous inspirer et approfondir vos connaissances.</p> +Vous avez terminé toutes les leçons - félicitations ! À ce stade, vous devriez maintenant connaître les bases de la manipulation des Canevas et la logique des jeux simples en 2D. C'est maintenant le bon moment pour apprendre quelques frameworks et continuer le développement du jeu. Vous pouvez découvrir le pendant de cette série, le [casse-brique 2D utilisant Phaser](/fr/docs/Games/Workflows/2D_breakout_game_Phaser) ou le [tutoriel Cyber Orb](/fr/docs/Games/Workflows/HTML5_Gamedev_Phaser_Device_Orientation_FR) construit avec Phaser. Vous pouvez également consulter la section [Jeux sur MDN](/fr/docs/Jeux) pour vous inspirer et approfondir vos connaissances. -<p>Vous pouvez également revenir à la <a href="/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript">page d'accueil</a> de cette série de tutoriels. Amusez-vous bien à coder !</p> +Vous pouvez également revenir à la [page d'accueil](/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript) de cette série de tutoriels. Amusez-vous bien à coder ! -<p>{{Previous("Games/Workflows/2D_Breakout_game_pure_JavaScript/Mouse_controls")}}</p> +{{Previous("Games/Workflows/2D_Breakout_game_pure_JavaScript/Mouse_controls")}} diff --git a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/game_over/index.md b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/game_over/index.md index 44cf0953f4..74bd248ae1 100644 --- a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/game_over/index.md +++ b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/game_over/index.md @@ -12,62 +12,65 @@ tags: translation_of: Games/Tutorials/2D_Breakout_game_pure_JavaScript/Game_over original_slug: Games/Workflows/2D_Breakout_game_pure_JavaScript/Game_over --- -<div>{{GamesSidebar}}</div> +{{GamesSidebar}}{{IncludeSubnav("/fr/docs/Games")}} -<div>{{IncludeSubnav("/fr/docs/Games")}}</div> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Paddle_et_contr%C3%B4le_clavier", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Build_the_brick_field")}} -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Paddle_et_contr%C3%B4le_clavier", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Build_the_brick_field")}}</p> +Voici la **5ème étape** sur 10 du [Gamedev Canvas tutorial](/fr/docs/Games/Workflows/Breakout_game_from_scratch). Vous pouvez trouver le code source comme il devrait être après avoir terminé cette leçon sur [Gamedev-Canvas-workshop/lesson5.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson05.html). -<p>Voici la <strong>5ème étape</strong> sur 10 du <a href="/fr/docs/Games/Workflows/Breakout_game_from_scratch">Gamedev Canvas tutorial</a>. Vous pouvez trouver le code source comme il devrait être après avoir terminé cette leçon sur <a href="https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson05.html">Gamedev-Canvas-workshop/lesson5.html</a>.</p> +C'est sympa de regarder la balle rebondir contre les murs et de pouvoir bouger la raquette, mais à part ça, le jeu ne fait rien, il n'y a pas de progression ni de but final. Il serait bien, du point de vue du gameplay, de pouvoir perdre. La façon de perdre dans le casse briques est simple. Si vous loupez la balle avec le paddle et la laissez atteindre le bas de l'écran, la partie est terminée. -<p>C'est sympa de regarder la balle rebondir contre les murs et de pouvoir bouger la raquette, mais à part ça, le jeu ne fait rien, il n'y a pas de progression ni de but final. Il serait bien, du point de vue du gameplay, de pouvoir perdre. La façon de perdre dans le casse briques est simple. Si vous loupez la balle avec le paddle et la laissez atteindre le bas de l'écran, la partie est terminée.</p> +## Intégrer une fin de partie -<h2 id="Intégrer_une_fin_de_partie">Intégrer une fin de partie</h2> +Essayons d'intégrer une fin de partie dans le jeu . Voyons une partie du code de la troisième leçon, où nous faisions rebondir la balle contre les murs : -<p>Essayons d'intégrer une fin de partie dans le jeu . Voyons une partie du code de la troisième leçon, où nous faisions rebondir la balle contre les murs :</p> - -<pre class="brush: js">if(x + dx > canvas.width-ballRadius || x + dx < ballRadius) { +```js +if(x + dx > canvas.width-ballRadius || x + dx < ballRadius) { dx = -dx; } -if(y + dy > canvas.height-ballRadius || y + dy < ballRadius) { +if(y + dy > canvas.height-ballRadius || y + dy < ballRadius) { dy = -dy; -}</pre> - -<p>Au lieu de permettre à la balle de rebondir sur les quatre murs, nous n'en autoriserons que trois désormais — gauche, haut et droite. Toucher le mur du bas mettra fin à la partie.</p> - -<p>Nous allons donc modifier le second bloc <code>if</code> (qui gère le déplacement sur l'axe vertical, y) en y ajoutant un <code>else if</code> qui déclenchera un Game Over si la balle entre en collision avec le mur du bas. Pour l'instant nous allons rester simple, afficher un message d'alerte et redémarrer le jeu en rechargeant la page.</p> +} +``` -<p>Tout d'abord remplacer l'appel initial à <code>setInterval()</code></p> +Au lieu de permettre à la balle de rebondir sur les quatre murs, nous n'en autoriserons que trois désormais — gauche, haut et droite. Toucher le mur du bas mettra fin à la partie. -<pre class="brush: js">setInterval(draw, 10); -</pre> +Nous allons donc modifier le second bloc `if` (qui gère le déplacement sur l'axe vertical, y) en y ajoutant un `else if` qui déclenchera un Game Over si la balle entre en collision avec le mur du bas. Pour l'instant nous allons rester simple, afficher un message d'alerte et redémarrer le jeu en rechargeant la page. -<p>par </p> +Tout d'abord remplacer l'appel initial à `setInterval()` -<pre class="brush: js">var interval = setInterval(draw, 10); -</pre> +```js +setInterval(draw, 10); +``` +par +```js +var interval = setInterval(draw, 10); +``` -<p>Puis remplacez la seconde instruction <code>if</code> par le code suivant:</p> +Puis remplacez la seconde instruction `if` par le code suivant: -<pre class="brush: js">if(y + dy < ballRadius) { +```js +if(y + dy < ballRadius) { dy = -dy; -} else if(y + dy > canvas.height-ballRadius) { +} else if(y + dy > canvas.height-ballRadius) { alert("GAME OVER"); document.location.reload(); clearInterval(interval); // Needed for Chrome to end game -}</pre> +} +``` -<h2 id="Faire_rebondir_la_balle_sur_la_raquette">Faire rebondir la balle sur la raquette</h2> +## Faire rebondir la balle sur la raquette -<p>La dernière chose à faire dans cette leçon est de créer une sorte de détection de collision entre la raquette et la balle, de sorte qu'elle puisse rebondir et revenir dans la zone de jeu. La chose la plus facile à faire est de vérifier si le centre de la balle se trouve entre les bords droit et gauche du paddle. Mettez à jour le dernier bout de code que vous venez de modifier, comme-ci dessous :</p> +La dernière chose à faire dans cette leçon est de créer une sorte de détection de collision entre la raquette et la balle, de sorte qu'elle puisse rebondir et revenir dans la zone de jeu. La chose la plus facile à faire est de vérifier si le centre de la balle se trouve entre les bords droit et gauche du paddle. Mettez à jour le dernier bout de code que vous venez de modifier, comme-ci dessous : -<pre class="brush: js">if(y + dy < ballRadius) { +```js +if(y + dy < ballRadius) { dy = -dy; -} else if(y + dy > canvas.height-ballRadius) { - if(x > paddleX && x < paddleX + paddleWidth) { +} else if(y + dy > canvas.height-ballRadius) { + if(x > paddleX && x < paddleX + paddleWidth) { dy = -dy; } else { @@ -75,20 +78,21 @@ if(y + dy > canvas.height-ballRadius || y + dy < ballRadius) { document.location.reload(); clearInterval(interval); } -}</pre> +} +``` -<p>Si la balle entre en collision avec le mur du bas, nous devons vérifier si elle touche la raquette. Si c'est le cas, la balle rebondit et revient dans la zone de jeu. Sinon, le jeu est terminé comme avant.</p> +Si la balle entre en collision avec le mur du bas, nous devons vérifier si elle touche la raquette. Si c'est le cas, la balle rebondit et revient dans la zone de jeu. Sinon, le jeu est terminé comme avant. -<h2 id="Comparez_votre_code">Comparez votre code</h2> +## Comparez votre code -<p>Voici le code fonctionnel avec lesquel vous pouvez comparer le vôtre :</p> +Voici le code fonctionnel avec lesquel vous pouvez comparer le vôtre : -<p>{{JSFiddleEmbed("https://jsfiddle.net/end3r/z4zy79fo/","","395")}}</p> +{{JSFiddleEmbed("https://jsfiddle.net/end3r/z4zy79fo/","","395")}} -<p><strong>Exercice: Faites en sorte que la balle accélère quand elle touche la raquette.</strong></p> +**Exercice: Faites en sorte que la balle accélère quand elle touche la raquette.** -<h2 id="Prochaine_étape">Prochaine étape</h2> +## Prochaine étape -<p>Nous avons déja bien avancé et notre jeu est devenu plus intéressant depuis que vous pouvez perdre ! Mais il manque encore quelque chose. Rendons-nous au sixième chapitre — <a href="/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript/Build_the_brick_field">Créer le champs de briques</a> — et créons quelques briques que la balle pourra détruire.</p> +Nous avons déja bien avancé et notre jeu est devenu plus intéressant depuis que vous pouvez perdre ! Mais il manque encore quelque chose. Rendons-nous au sixième chapitre — [Créer le champs de briques](/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript/Build_the_brick_field) — et créons quelques briques que la balle pourra détruire. -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Paddle_et_contr%C3%B4le_clavier", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Build_the_brick_field")}}</p> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Paddle_et_contr%C3%B4le_clavier", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Build_the_brick_field")}} diff --git a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/index.md b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/index.md index cc9fed3143..3e2df54633 100644 --- a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/index.md +++ b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/index.md @@ -11,49 +11,41 @@ tags: translation_of: Games/Tutorials/2D_Breakout_game_pure_JavaScript original_slug: Games/Workflows/2D_Breakout_game_pure_JavaScript --- -<div>{{GamesSidebar}}</div> +{{GamesSidebar}}{{IncludeSubnav("/fr/docs/Jeux")}} -<div>{{IncludeSubnav("/fr/docs/Jeux")}}</div> +{{Next("Games/Workflows/2D_Breakout_game_pure_JavaScript/creer_element_canvas_et_afficher")}} -<p>{{Next("Games/Workflows/2D_Breakout_game_pure_JavaScript/creer_element_canvas_et_afficher")}}</p> +Dans ce tutoriel, nous allons créer pas à pas un jeu de casse-briques MDN, créé entièrement avec JavaScript et sans framework, et rendu avec la balise HTML5 {{htmlelement("canvas")}}. -<p>Dans ce tutoriel, nous allons créer pas à pas un jeu de casse-briques MDN, créé entièrement avec JavaScript et sans framework, et rendu avec la balise HTML5 {{htmlelement("canvas")}}.</p> +Chaque étape est modifiable en direct, et disponible en test pour que vous puissiez voir ce à quoi les étapes intermédiaires devraient ressembler. Vous apprendrez les bases d'utilisations de l'élément {{htmlelement("canvas")}} pour implémenter des mécaniques de base du jeu vidéo, comme charger et déplacer des images, les détections de collisions, les mécanismes de contrôle, et les conditions de victoire/défaite. -<p>Chaque étape est modifiable en direct, et disponible en test pour que vous puissiez voir ce à quoi les étapes intermédiaires devraient ressembler. Vous apprendrez les bases d'utilisations de l'élément {{htmlelement("canvas")}} pour implémenter des mécaniques de base du jeu vidéo, comme charger et déplacer des images, les détections de collisions, les mécanismes de contrôle, et les conditions de victoire/défaite.</p> +Pour comprendre la plupart des articles de ce tutoriel, vous devez déjà avoir un niveau basique ou intermédiaire en [JavaScript](/fr/Learn/Getting_started_with_the_web/JavaScript_basics). À la fin de ce tutoriel, vous serez capable de créer vos propres jeux Web. -<p>Pour comprendre la plupart des articles de ce tutoriel, vous devez déjà avoir un niveau basique ou intermédiaire en <a href="/fr/Learn/Getting_started_with_the_web/JavaScript_basics">JavaScript</a>. À la fin de ce tutoriel, vous serez capable de créer vos propres jeux Web.</p> +![](mdn-breakout-gameplay.png) -<p><img src="mdn-breakout-gameplay.png"></p> +## Détail de la leçon -<h2 id="Détail_de_la_leçon">Détail de la leçon</h2> +Toutes les leçons — et les différentes versions de ce [jeu de casse-brique MDN](http://breakout.enclavegames.com/lesson10.html) que nous allons créer ensemble — sont [disponibles sur GitHub](https://github.com/end3r/Canvas-gamedev-workshop) : -<p>Toutes les leçons — et les différentes versions de ce <a href="http://breakout.enclavegames.com/lesson10.html">jeu de casse-brique MDN</a> que nous allons créer ensemble — sont <a href="https://github.com/end3r/Canvas-gamedev-workshop">disponibles sur GitHub</a> :</p> +1. [Créer l'élément canvas et dessiner dessus](/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript/creer_element_canvas_et_afficher) +2. [Déplacer la balle](/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Move_the_ball) +3. [Rebondir sur les murs](/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Bounce_off_the_walls) +4. [Contrôles clavier](/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Paddle_and_keyboard_controls) +5. [Jeu terminé](/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Game_over) +6. [Construire le mur de briques](/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Build_the_brick_field) +7. [Détection des collisions](/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Collision_detection) +8. [Afficher le score et gagner](/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win) +9. [Contrôles souris](/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Mouse_controls) +10. [Finir](/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Finishing_up) -<ol> - <li><a href="/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript/creer_element_canvas_et_afficher">Créer l'élément canvas et dessiner dessus</a></li> - <li><a href="/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Move_the_ball">Déplacer la balle</a></li> - <li><a href="/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Bounce_off_the_walls">Rebondir sur les murs</a></li> - <li><a href="/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Paddle_and_keyboard_controls">Contrôles clavier</a></li> - <li><a href="/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Game_over">Jeu terminé</a></li> - <li><a href="/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Build_the_brick_field">Construire le mur de briques</a></li> - <li><a href="/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Collision_detection">Détection des collisions</a></li> - <li><a href="/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win">Afficher le score et gagner</a></li> - <li><a href="/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Mouse_controls">Contrôles souris</a></li> - <li><a href="/fr/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Finishing_up">Finir</a></li> -</ol> +Commencer avec du Javascript pur et dur est le meilleur moyen d'acquérir des connaissances de développement de jeu web. Après ceci, vous pourrez prendre n'importe quel "framework" et l'utiliser pour vos projets. Les "frameworks" sont des outils créés avec le langage Javascript ; donc, même si vous voulez travailler avec ces derniers, c'est toujours bon d'apprendre le langage lui-même pour savoir ce qu'il se passe exactement. Les "frameworks" améliorent la vitesse de développement et aident à traiter les parties les moins intéressantes du jeu, mais si quelque chose ne fonctionne pas comme prévu, vous pouvez toujours essayer de déboguer ou juste écrire vos propre solutions en Javascript. -<p>Commencer avec du Javascript pur et dur est le meilleur moyen d'acquérir des connaissances de développement de jeu web. Après ceci, vous pourrez prendre n'importe quel "framework" et l'utiliser pour vos projets. Les "frameworks" sont des outils créés avec le langage Javascript ; donc, même si vous voulez travailler avec ces derniers, c'est toujours bon d'apprendre le langage lui-même pour savoir ce qu'il se passe exactement. Les "frameworks" améliorent la vitesse de développement et aident à traiter les parties les moins intéressantes du jeu, mais si quelque chose ne fonctionne pas comme prévu, vous pouvez toujours essayer de déboguer ou juste écrire vos propre solutions en Javascript. </p> +> **Note :** Si vous êtes intéressé par l'apprentissage du développement un jeu web 2D avec un "framework", consultez la série [Jeu de casse-tête 2D avec Phaser](/fr/docs/Games/Tutorials/2D_breakout_game_Phaser). -<div class="note"> -<p><strong>Note :</strong> Si vous êtes intéressé par l'apprentissage du développement un jeu web 2D avec un "framework", consultez la série <a href="/fr/docs/Games/Tutorials/2D_breakout_game_Phaser">Jeu de casse-tête 2D avec Phaser</a>.</p> -</div> +> **Note :** Cette série d'articles peut être utilisée comme matériel pour des ateliers pratiques de développement de jeux. Vous pouvez également utiliser le [Gamedev Canvas Content Kit](https://github.com/end3r/Gamedev-Canvas-Content-Kit) basé sur ce tutoriel si vous voulez faire une présentation sur le développement de jeux en général . -<div class="note"> -<p><strong>Note :</strong> Cette série d'articles peut être utilisée comme matériel pour des ateliers pratiques de développement de jeux. Vous pouvez également utiliser le <a href="https://github.com/end3r/Gamedev-Canvas-Content-Kit">Gamedev Canvas Content Kit</a> basé sur ce tutoriel si vous voulez faire une présentation sur le développement de jeux en général .</p> -</div> +## Prochaines étapes -<h2 id="Prochaines_étapes">Prochaines étapes</h2> +Ok, c'est parti ! Rendez-vous au premier chapitre pour commencer — Créer l'élément canvas et dessiner dessus -<p>Ok, c'est parti ! Rendez-vous au premier chapitre pour commencer — Créer l'élément canvas et dessiner dessus</p> - -<p>{{Next("Games/Workflows/2D_Breakout_game_pure_JavaScript/creer_element_canvas_et_afficher")}} </p> +{{Next("Games/Workflows/2D_Breakout_game_pure_JavaScript/creer_element_canvas_et_afficher")}} diff --git a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/mouse_controls/index.md b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/mouse_controls/index.md index 9220f1a557..b7ae10e768 100644 --- a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/mouse_controls/index.md +++ b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/mouse_controls/index.md @@ -12,47 +12,49 @@ tags: translation_of: Games/Tutorials/2D_Breakout_game_pure_JavaScript/Mouse_controls original_slug: Games/Workflows/2D_Breakout_game_pure_JavaScript/Mouse_controls --- -<div>{{GamesSidebar}}</div> +{{GamesSidebar}}{{IncludeSubnav("/fr/docs/Games")}} -<div>{{IncludeSubnav("/fr/docs/Games")}}</div> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win", "Games/Workflows/2D_Breakout_game_pure_JavaScript/finitions")}} -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win", "Games/Workflows/2D_Breakout_game_pure_JavaScript/finitions")}}</p> +C'est la **9<sup>e</sup> étape sur** 10 de ce [tutoriel Gamedev Canvas](/fr/docs/Games/Workflows/Breakout_game_from_scratch). Vous pouvez trouver le code source tel qu'il devrait être après avoir terminé cette leçon à l'adresse [Gamedev-Canvas-workshop/lesson9.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson09.html). -<p>C'est la <strong>9<sup>e</sup> étape sur</strong> 10 de ce <a href="/fr/docs/Games/Workflows/Breakout_game_from_scratch">tutoriel Gamedev Canvas</a>. Vous pouvez trouver le code source tel qu'il devrait être après avoir terminé cette leçon à l'adresse <a href="https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson09.html">Gamedev-Canvas-workshop/lesson9.html</a>.</p> +Le jeu lui-même est en fait terminé, alors travaillons à le peaufiner. Nous avons déjà ajouté des commandes au clavier, mais nous pourrions facilement ajouter des commandes à la souris. -<p>Le jeu lui-même est en fait terminé, alors travaillons à le peaufiner. Nous avons déjà ajouté des commandes au clavier, mais nous pourrions facilement ajouter des commandes à la souris.</p> +## Détecter les mouvements de la souris -<h2 id="Détecter_les_mouvements_de_la_souris">Détecter les mouvements de la souris</h2> +Il est encore plus facile de détecter les mouvements de la souris que les pressions sur les touches : il suffit d'écouter l'évènement {{event("mousemove")}}. Ajouter la ligne suivante au même endroit que les autres écouteurs d'événement, juste en dessous de `l'évènement keyup` : -<p>Il est encore plus facile de détecter les mouvements de la souris que les pressions sur les touches : il suffit d'écouter l'évènement {{event("mousemove")}}. Ajouter la ligne suivante au même endroit que les autres écouteurs d'événement, juste en dessous de <code>l'évènement keyup</code> :</p> +```js +document.addEventListener("mousemove", mouseMoveHandler, false); +``` -<pre class="brush: js">document.addEventListener("mousemove", mouseMoveHandler, false);</pre> +## Lier le mouvement de la raquette au mouvement de la souris -<h2 id="Lier_le_mouvement_de_la_raquette_au_mouvement_de_la_souris">Lier le mouvement de la raquette au mouvement de la souris</h2> +Nous pouvons mettre à jour la position de la raquette en fonction des coordonnées du pointeur — c'est exactement ce que fera la fonction de manipulation suivante. Ajoutez la fonction ci-dessous à votre code, sous la dernière ligne que vous avez ajoutée : -<p>Nous pouvons mettre à jour la position de la raquette en fonction des coordonnées du pointeur — c'est exactement ce que fera la fonction de manipulation suivante. Ajoutez la fonction ci-dessous à votre code, sous la dernière ligne que vous avez ajoutée :</p> - -<pre class="brush: js">function mouseMoveHandler(e) { +```js +function mouseMoveHandler(e) { var relativeX = e.clientX - canvas.offsetLeft; - if(relativeX > 0 && relativeX < canvas.width) { + if(relativeX > 0 && relativeX < canvas.width) { paddleX = relativeX - paddleWidth/2; } -}</pre> +} +``` -<p>Dans cette fonction, nous calculons d'abord une valeur <code>relativeX</code>, qui est égale à la position horizontale de la souris dans la fenêtre de visualisation (<code>e.clientX</code>) moins la distance entre le bord gauche de la toile et le bord gauche de la fenêtre de visualisation (<code>canvas.offsetLeft</code>) — en fait, cette valeur est égale à la distance entre le bord gauche du canevas et le pointeur de la souris. Si la position relative du pointeur X est supérieure à zéro et inférieure à la largeur du canevas, le pointeur se trouve dans les limites du canevas, et la position <code>paddleX</code> (ancrée sur le bord gauche de la palette) est fixée à la valeur <code>relativeX</code> moins la moitié de la largeur de la palette, de sorte que le mouvement sera en fait relatif au milieu de la raquette.</p> +Dans cette fonction, nous calculons d'abord une valeur `relativeX`, qui est égale à la position horizontale de la souris dans la fenêtre de visualisation (`e.clientX`) moins la distance entre le bord gauche de la toile et le bord gauche de la fenêtre de visualisation (`canvas.offsetLeft`) — en fait, cette valeur est égale à la distance entre le bord gauche du canevas et le pointeur de la souris. Si la position relative du pointeur X est supérieure à zéro et inférieure à la largeur du canevas, le pointeur se trouve dans les limites du canevas, et la position `paddleX` (ancrée sur le bord gauche de la palette) est fixée à la valeur `relativeX` moins la moitié de la largeur de la palette, de sorte que le mouvement sera en fait relatif au milieu de la raquette. -<p>La raquette suivra désormais la position du curseur de la souris, mais comme nous limitons le mouvement à la taille du canevas, elle ne disparaîtra pas complètement d'un côté ou de l'autre.</p> +La raquette suivra désormais la position du curseur de la souris, mais comme nous limitons le mouvement à la taille du canevas, elle ne disparaîtra pas complètement d'un côté ou de l'autre. -<h2 id="Comparez_votre_code">Comparez votre code</h2> +## Comparez votre code -<p>Voici le code final du chapitre, à vous de vérifier et de le tester pour voir si il y a des différences.</p> +Voici le code final du chapitre, à vous de vérifier et de le tester pour voir si il y a des différences. -<p>{{JSFiddleEmbed("https://jsfiddle.net/raymondjplante/vt7y5hcp/","","395")}}</p> +{{JSFiddleEmbed("https://jsfiddle.net/raymondjplante/vt7y5hcp/","","395")}} -<p>Exercice : ajustez les limites du mouvement de la raquette, de sorte que la raquette entière soit visible sur les deux bords du canevas au lieu de seulement la moitié.</p> +Exercice : ajustez les limites du mouvement de la raquette, de sorte que la raquette entière soit visible sur les deux bords du canevas au lieu de seulement la moitié. -<h2 id="Prochaine_étape">Prochaine étape</h2> +## Prochaine étape -<p>Maintenant que nous avons un jeu complet, nous allons terminer notre série de leçons avec quelques petites retouches supplémentaires — <a href="/fr/docs/Games/Workflows/Breakout_game_from_scratch/Finishing_up">Finitions</a>.</p> +Maintenant que nous avons un jeu complet, nous allons terminer notre série de leçons avec quelques petites retouches supplémentaires — [Finitions](/fr/docs/Games/Workflows/Breakout_game_from_scratch/Finishing_up). -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win", "Games/Workflows/2D_Breakout_game_pure_JavaScript/finitions")}}</p> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win", "Games/Workflows/2D_Breakout_game_pure_JavaScript/finitions")}} diff --git a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/move_the_ball/index.md b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/move_the_ball/index.md index 31b96ea7d8..ec2b525b5a 100644 --- a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/move_the_ball/index.md +++ b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/move_the_ball/index.md @@ -12,68 +12,73 @@ tags: translation_of: Games/Tutorials/2D_Breakout_game_pure_JavaScript/Move_the_ball original_slug: Games/Workflows/2D_Breakout_game_pure_JavaScript/Move_the_ball --- -<div>{{GamesSidebar}}</div> +{{GamesSidebar}}{{IncludeSubnav("/fr/docs/Games")}} -<div>{{IncludeSubnav("/fr/docs/Games")}}</div> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/creer_element_canvas_et_afficher", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Faire_rebondir_la_balle_sur_les_murs")}} -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/creer_element_canvas_et_afficher", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Faire_rebondir_la_balle_sur_les_murs")}}</p> +Voici la deuxième étape de ce [tutoriel](/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript). Vous pouvez retrouver le code source de cette leçon sur [Gamedev-Canvas-workshop/lesson2.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson02.html). -<p>Voici la deuxième étape de ce <a href="/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript">tutoriel</a>. Vous pouvez retrouver le code source de cette leçon sur <a href="https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson02.html">Gamedev-Canvas-workshop/lesson2.html</a>.</p> +Nous avons vu dans l'article précédent comment dessiner une balle, maintenant déplaçons là. Techniquement, nous afficherons la balle sur l'écran, puis nous l'effacerons et ensuite nous la repeindrons dans une position légèrement différente et ceci à chaque image afin de donner l'impression d'un mouvement (tout comme le fonctionnement du mouvement dans les films). -<p>Nous avons vu dans l'article précédent comment dessiner une balle, maintenant déplaçons là. Techniquement, nous afficherons la balle sur l'écran, puis nous l'effacerons et ensuite nous la repeindrons dans une position légèrement différente et ceci à chaque image afin de donner l'impression d'un mouvement (tout comme le fonctionnement du mouvement dans les films).</p> +## Définir une boucle de dessin -<h2 id="Définir_une_boucle_de_dessin">Définir une boucle de dessin</h2> +Afin que le dessin soit mis à jour sur le canevas à chaque image, nous allons définir une fonction `draw()` qui sera exécutée en continu et qui utilisera des variables pour les positions des sprites, etc. Pour qu'une fonction s'exécute de façon répétée avec JavaScript, on pourra utiliser les méthodes {{domxref("WindowTimers.setInterval()", "setInterval()")}} ou {{domxref("window.requestAnimationFrame()", "requestAnimationFrame()")}}. -<p>Afin que le dessin soit mis à jour sur le canevas à chaque image, nous allons définir une fonction <code>draw()</code> qui sera exécutée en continu et qui utilisera des variables pour les positions des sprites, etc. Pour qu'une fonction s'exécute de façon répétée avec JavaScript, on pourra utiliser les méthodes {{domxref("WindowTimers.setInterval()", "setInterval()")}} ou {{domxref("window.requestAnimationFrame()", "requestAnimationFrame()")}}.</p> +Supprimez tout le JavaScript que vous avez actuellement dans votre HTML à l'exception des deux premières lignes puis ajoutez ce qui suit en dessous de ces lignes. La fonction `draw()` sera exécutée toutes les 10 millisecondes (environ) grâce à `setInterval` : -<p>Supprimez tout le JavaScript que vous avez actuellement dans votre HTML à l'exception des deux premières lignes puis ajoutez ce qui suit en dessous de ces lignes. La fonction <code>draw()</code> sera exécutée toutes les 10 millisecondes (environ) grâce à <code>setInterval</code> :</p> - -<pre class="brush: js">function draw() { +```js +function draw() { // le code pour dessiner } -setInterval(draw, 10);</pre> +setInterval(draw, 10); +``` -<p>Grâce à la nature infinie de <code>setInterval</code>, la fonction <code>draw()</code> sera appelée toutes les 10 millisecondes, sans arrêt jusqu'à ce que nous y mettions un terme. Maintenant, dessinons la balle — ajoutons le code ci-dessous à notre fonction <code>draw()</code> :</p> +Grâce à la nature infinie de `setInterval`, la fonction `draw()` sera appelée toutes les 10 millisecondes, sans arrêt jusqu'à ce que nous y mettions un terme. Maintenant, dessinons la balle — ajoutons le code ci-dessous à notre fonction `draw()` : -<pre class="brush: js">ctx.beginPath(); +```js +ctx.beginPath(); ctx.arc(50, 50, 10, 0, Math.PI*2); ctx.fillStyle = "#0095DD"; ctx.fill(); ctx.closePath(); -</pre> +``` -<p>Essayez votre code mis à jour maintenant, la balle devrait être repeinte sur chaque image.</p> +Essayez votre code mis à jour maintenant, la balle devrait être repeinte sur chaque image. -<h2 id="Déplacer_la_balle">Déplacer la balle</h2> +## Déplacer la balle -<p>Pour le moment, vous ne voyez pas la balle "repeinte" car elle ne bouge pas. Améliorons tout ça. Pour commencer, au lieu d'une position bloquée à (50,50), nous allons définir un point de départ en bas et au milieu du canevas grâce aux variables <code>x</code> et <code>y</code> que nous utiliserons pour définir la position où le cercle est dessiné.</p> +Pour le moment, vous ne voyez pas la balle "repeinte" car elle ne bouge pas. Améliorons tout ça. Pour commencer, au lieu d'une position bloquée à (50,50), nous allons définir un point de départ en bas et au milieu du canevas grâce aux variables `x` et `y` que nous utiliserons pour définir la position où le cercle est dessiné. -<p>Ajoutez d'abord les deux lignes suivantes au-dessus de votre fonction <code>draw()</code> pour définir <code>x</code> et <code>y</code> :</p> +Ajoutez d'abord les deux lignes suivantes au-dessus de votre fonction `draw()` pour définir `x` et `y` : -<pre class="brush: js">var x = canvas.width/2; +```js +var x = canvas.width/2; var y = canvas.height-30; -</pre> +``` -<p>Ensuite, mettez à jour la fonction <code>draw()</code> afin d'utiliser les variables x et y dans la méthode {{domxref("CanvasRenderingContext2D.arc()","arc()")}} , comme indiqué dans la ligne mise en évidence ci-dessous :</p> +Ensuite, mettez à jour la fonction `draw()` afin d'utiliser les variables x et y dans la méthode {{domxref("CanvasRenderingContext2D.arc()","arc()")}} , comme indiqué dans la ligne mise en évidence ci-dessous : -<pre class="brush: js; highlight:[3]">function draw() { +```js +function draw() { ctx.beginPath(); -<strong> ctx.arc(x, y, 10, 0, Math.PI*2);</strong> + ctx.arc(x, y, 10, 0, Math.PI*2); ctx.fillStyle = "#0095DD"; ctx.fill(); ctx.closePath(); } -</pre> +``` -<p>Nous voici à la partie importante : nous voulons ajouter une valeur à <code>x</code> et <code>y</code> après que chaque image ait été dessinée afin de faire croire que la balle bouge. On définit ces valeurs comme <code>dx</code> et <code>dy</code> avec comme valeurs respectives 2 et -2. Ajoutez le code après la déclaration des variables <code>x</code> et <code>y</code> :</p> +Nous voici à la partie importante : nous voulons ajouter une valeur à `x` et `y` après que chaque image ait été dessinée afin de faire croire que la balle bouge. On définit ces valeurs comme `dx` et `dy` avec comme valeurs respectives 2 et -2. Ajoutez le code après la déclaration des variables `x` et `y` : -<pre class="brush: js">var dx = 2; +```js +var dx = 2; var dy = -2; -</pre> +``` -<p>La dernière chose à faire est de mettre à jour <code>x</code> et <code>y</code> avec nos variables <code>dx</code> et <code>dy</code> sur chaque image, de sorte que la balle sera peinte dans la nouvelle position à chaque nouvelle image. Ajoutez les deux nouvelles lignes, indiquées ci-dessous, à votre fonction <code>draw()</code> :</p> +La dernière chose à faire est de mettre à jour `x` et `y` avec nos variables `dx` et `dy` sur chaque image, de sorte que la balle sera peinte dans la nouvelle position à chaque nouvelle image. Ajoutez les deux nouvelles lignes, indiquées ci-dessous, à votre fonction `draw()` : -<pre class="brush: js">function draw() { +```js +function draw() { ctx.beginPath(); ctx.arc(x, y, 10, 0, Math.PI*2); ctx.fillStyle = "#0095DD"; @@ -81,20 +86,22 @@ var dy = -2; ctx.closePath(); x += dx; y += dy; -}</pre> +} +``` -<p>Enregistrez à nouveau votre code et essayez-le dans votre navigateur. Vous devriez avoir le résultat suivant : ça fonctionne mais on a une trainée laissée par la balle derrière elle :</p> +Enregistrez à nouveau votre code et essayez-le dans votre navigateur. Vous devriez avoir le résultat suivant : ça fonctionne mais on a une trainée laissée par la balle derrière elle : -<p><img alt="" src="ball-trail.png"></p> +![](ball-trail.png) -<h2 id="Effacer_le_canevas_avant_chaque_image_frame">Effacer le canevas avant chaque image (<em>frame</em>)</h2> +## Effacer le canevas avant chaque image (_frame_) -<p>La balle laisse une trace parce que qu'une nouveau cercle est dessiné sur chaque frame sans qu'on enlève le précédent. Pas d'inquiétude, il existe un moyen d'effacer le contenu du canevas : {{domxref("CanvasRenderingContext2D.clearRect()","clearRect()")}}. Cette méthode prend en compte quatre paramètres: les coordonnées x et y du coin supérieur gauche d'un rectangle et les coordonnées x et y du coin inférieur droit d'un rectangle. Toute la zone couverte par ce rectangle sera effacée.</p> +La balle laisse une trace parce que qu'une nouveau cercle est dessiné sur chaque frame sans qu'on enlève le précédent. Pas d'inquiétude, il existe un moyen d'effacer le contenu du canevas : {{domxref("CanvasRenderingContext2D.clearRect()","clearRect()")}}. Cette méthode prend en compte quatre paramètres: les coordonnées x et y du coin supérieur gauche d'un rectangle et les coordonnées x et y du coin inférieur droit d'un rectangle. Toute la zone couverte par ce rectangle sera effacée. -<p>Ajoutez la nouvelle ligne en surbrillance ci-dessous à la fonction <code>draw()</code> :</p> +Ajoutez la nouvelle ligne en surbrillance ci-dessous à la fonction `draw()` : -<pre class="brush: js; highlight:[2]">function draw() { -<strong> ctx.clearRect(0, 0, canvas.width, canvas.height);</strong> +```js +function draw() { + ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.beginPath(); ctx.arc(x, y, 10, 0, Math.PI*2); ctx.fillStyle = "#0095DD"; @@ -103,17 +110,18 @@ var dy = -2; x += dx; y += dy; } -</pre> +``` -<p>Enregistrez votre code et essayez à nouveau. Cette fois, vous verrez la balle se déplacer sans laisser de trace. Toutes les 10 millisecondes, le canvas est effacé, la balle est dessinée sur une position donnée et les valeurs <code>x</code> et <code>y</code> sont mises à jour pour l'image suivante (en anglais, on parle de "<em>frame"</em>).</p> +Enregistrez votre code et essayez à nouveau. Cette fois, vous verrez la balle se déplacer sans laisser de trace. Toutes les 10 millisecondes, le canvas est effacé, la balle est dessinée sur une position donnée et les valeurs `x` et `y` sont mises à jour pour l'image suivante (en anglais, on parle de "_frame"_). -<h2 id="Nettoyer_notre_code">Nettoyer notre code</h2> +## Nettoyer notre code -<p>Dans les prochains articles, nous allons ajouter de plus en plus de d'instructions à la fonction <code>draw()</code>. Mieux vaut donc la garder aussi simple et propre que possible. Commençons par déplacer le code s'occupant de dessiner de la balle vers une fonction séparée.</p> +Dans les prochains articles, nous allons ajouter de plus en plus de d'instructions à la fonction `draw()`. Mieux vaut donc la garder aussi simple et propre que possible. Commençons par déplacer le code s'occupant de dessiner de la balle vers une fonction séparée. -<p>Remplacez la fonction <code>draw()</code> existante par les deux fonctions suivantes :</p> +Remplacez la fonction `draw()` existante par les deux fonctions suivantes : -<pre class="brush: js">function drawBall() { +```js +function drawBall() { ctx.beginPath(); ctx.arc(x, y, 10, 0, Math.PI*2); ctx.fillStyle = "#0095DD"; @@ -126,18 +134,19 @@ function draw() { drawBall(); x += dx; y += dy; -}</pre> +} +``` -<h2 id="Comparez_votre_code">Comparez votre code</h2> +## Comparez votre code -<p>Vous pouvez vérifier le code de cet article avec la démo qui suit et jouer avec pour mieux comprendre comment il fonctionne :</p> +Vous pouvez vérifier le code de cet article avec la démo qui suit et jouer avec pour mieux comprendre comment il fonctionne : -<p>{{JSFiddleEmbed("https://jsfiddle.net/end3r/3x5foxb1/","","395")}}</p> +{{JSFiddleEmbed("https://jsfiddle.net/end3r/3x5foxb1/","","395")}} -<p>Exercice : Essayez de changer la vitesse de la balle en mouvement ou la direction dans laquelle elle se déplace.</p> +Exercice : Essayez de changer la vitesse de la balle en mouvement ou la direction dans laquelle elle se déplace. -<h2 id="Prochaines_étapes">Prochaines étapes</h2> +## Prochaines étapes -<p>Nous avons dessiné nottre balle et elle se déplace mais elle ne cesse de disparaître du bord de notre canevas. Dans le troisième chapitre, nous verrons comment <a href="/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript/Faire_rebondir_la_balle_sur_les_murs">faire rebondir la balle</a> contre les bords.</p> +Nous avons dessiné nottre balle et elle se déplace mais elle ne cesse de disparaître du bord de notre canevas. Dans le troisième chapitre, nous verrons comment [faire rebondir la balle](/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript/Faire_rebondir_la_balle_sur_les_murs) contre les bords. -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/creer_element_canvas_et_afficher", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Faire_rebondir_la_balle_sur_les_murs")}}</p> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/creer_element_canvas_et_afficher", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Faire_rebondir_la_balle_sur_les_murs")}} diff --git a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/paddle_and_keyboard_controls/index.md b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/paddle_and_keyboard_controls/index.md index 27c2478019..45c8e1bfa0 100644 --- a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/paddle_and_keyboard_controls/index.md +++ b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/paddle_and_keyboard_controls/index.md @@ -14,59 +14,65 @@ tags: translation_of: Games/Tutorials/2D_Breakout_game_pure_JavaScript/Paddle_and_keyboard_controls original_slug: Games/Workflows/2D_Breakout_game_pure_JavaScript/Paddle_et_contrôle_clavier --- -<div>{{GamesSidebar}}</div> +{{GamesSidebar}}{{IncludeSubnav("/fr/docs/Games")}} -<div>{{IncludeSubnav("/fr/docs/Games")}}</div> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Faire_rebondir_la_balle_sur_les_murs", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Game_over")}} -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Faire_rebondir_la_balle_sur_les_murs", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Game_over")}}</p> +C'est la **4<sup>e</sup> étape sur** 10 de ce [tutoriel Gamedev Canvas](/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript). Vous pouvez retrouver le code source de cette leçon sur [Gamedev-Canvas-workshop/lesson4.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson04.html). -<p>C'est la <strong>4<sup>e</sup> étape sur</strong> 10 de ce <a href="/fr/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript">tutoriel Gamedev Canvas</a>. Vous pouvez retrouver le code source de cette leçon sur <a class="external external-icon" href="https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson04.html" rel="noopener">Gamedev-Canvas-workshop/lesson4.html</a>.</p> +La balle rebondit librement partout et vous pourriez la regarder indéfiniment... Mais il n'y a pas d'interaction avec le joueur. Ce n'est pas un jeu si vous ne pouvez pas le contrôler ! Nous allons donc ajouter une interaction avec le joueur : une raquette contrôlable. -<p>La balle rebondit librement partout et vous pourriez la regarder indéfiniment... Mais il n'y a pas d'interaction avec le joueur. Ce n'est pas un jeu si vous ne pouvez pas le contrôler ! Nous allons donc ajouter une interaction avec le joueur : une raquette contrôlable.</p> +## Créer une raquette pour frapper la balle -<h2 id="Créer_une_raquette_pour_frapper_la_balle">Créer une raquette pour frapper la balle</h2> +Il nous faut donc une raquette pour frapper la balle. Définissons quelques variables pour cela. Ajoutez les variables suivantes en haut de votre code, près de vos autres variables : -<p>Il nous faut donc une raquette pour frapper la balle. Définissons quelques variables pour cela. Ajoutez les variables suivantes en haut de votre code, près de vos autres variables :</p> - -<pre class="brush: js">var paddleHeight = 10; +```js +var paddleHeight = 10; var paddleWidth = 75; -var paddleX = (canvas.width-paddleWidth)/2;</pre> +var paddleX = (canvas.width-paddleWidth)/2; +``` -<p>Ici, nous définissons la hauteur et la largeur de la raquette et son point de départ sur l'axe des x pour l'utiliser dans les calculs plus loin dans le code. Créons une fonction qui dessinera la raquette sur l'écran. Ajoutez ce qui suit juste en dessous de votre fonction <code>drawBall()</code> :</p> +Ici, nous définissons la hauteur et la largeur de la raquette et son point de départ sur l'axe des x pour l'utiliser dans les calculs plus loin dans le code. Créons une fonction qui dessinera la raquette sur l'écran. Ajoutez ce qui suit juste en dessous de votre fonction `drawBall()` : -<pre class="brush: js">function drawPaddle() { +```js +function drawPaddle() { ctx.beginPath(); ctx.rect(paddleX, canvas.height-paddleHeight, paddleWidth, paddleHeight); ctx.fillStyle = "#0095DD"; ctx.fill(); ctx.closePath(); -}</pre> +} +``` + +## Permettre à l'utilisateur de contrôler la raquette -<h2 id="Permettre_à_lutilisateur_de_contrôler_la_raquette">Permettre à l'utilisateur de contrôler la raquette</h2> +Nous pouvons dessiner la raquette où nous voulons, mais elle doit répondre aux actions de l'utilisateur. Il est temps de mettre en place certaines commandes au clavier. Nous aurons besoin de ce qui suit : -<p>Nous pouvons dessiner la raquette où nous voulons, mais elle doit répondre aux actions de l'utilisateur. Il est temps de mettre en place certaines commandes au clavier. Nous aurons besoin de ce qui suit :<br> - </p> -<ul> - <li>Deux variables pour stocker des informations sur l'état des touches "gauche" et "droite".</li> - <li>Deux écouteurs d'événements pour les événements <code>keydown</code> et <code>keyup</code> du clavier. Nous voulons exécuter un code pour gérer le mouvement de la raquette lorsque des appuis sur les touches.</li> - <li>Deux fonctions gérant les événements <code>keydown</code> et <code>keyup</code> et le code qui sera exécuté lorsque les touches sont pressées.</li> - <li>La possibilité de déplacer la raquette vers la gauche et vers la droite</li> -</ul> -<p>L'état des touches peut être mémorisé dans des variables booléennes comme dans l'exemple ci-dessous. Ajoutez ces lignes près de vos variables :</p> +- Deux variables pour stocker des informations sur l'état des touches "gauche" et "droite". +- Deux écouteurs d'événements pour les événements `keydown` et `keyup` du clavier. Nous voulons exécuter un code pour gérer le mouvement de la raquette lorsque des appuis sur les touches. +- Deux fonctions gérant les événements `keydown` et `keyup` et le code qui sera exécuté lorsque les touches sont pressées. +- La possibilité de déplacer la raquette vers la gauche et vers la droite -<pre class="brush: js">var rightPressed = false; -var leftPressed = false;</pre> +L'état des touches peut être mémorisé dans des variables booléennes comme dans l'exemple ci-dessous. Ajoutez ces lignes près de vos variables : -<p>La valeur par défaut pour les deux est fausse car au début, car les touches ne sont pas enfoncés. Pour être informé des appuis sur les touches, nous allons mettre en place deux écouteurs d'événements. Ajoutez les lignes suivantes juste au-dessus de la ligne setInterval() au bas de votre JavaScript :</p> +```js +var rightPressed = false; +var leftPressed = false; +``` -<pre class="brush: js">document.addEventListener("keydown", keyDownHandler, false); -document.addEventListener("keyup", keyUpHandler, false);</pre> +La valeur par défaut pour les deux est fausse car au début, car les touches ne sont pas enfoncés. Pour être informé des appuis sur les touches, nous allons mettre en place deux écouteurs d'événements. Ajoutez les lignes suivantes juste au-dessus de la ligne setInterval() au bas de votre JavaScript : -<p>Lorsque l'événement <code>keydown</code> est déclenché par l'appui d'une des touches de votre clavier (lorsqu'elles sont enfoncées), la fonction <code>keyDownHandler()</code> est exécutée. Le même principe est vrai pour le deuxième écouteur : les événements <code>keyup</code> activent la fonction <code>keyUpHandler()</code> (lorsque les touches cessent d'être enfoncées). Ajoutez ces lignes à votre code, sous les lignes <code>addEventListener()</code> :</p> +```js +document.addEventListener("keydown", keyDownHandler, false); +document.addEventListener("keyup", keyUpHandler, false); +``` -<pre class="brush: js">function keyDownHandler(e) { +Lorsque l'événement `keydown` est déclenché par l'appui d'une des touches de votre clavier (lorsqu'elles sont enfoncées), la fonction `keyDownHandler()` est exécutée. Le même principe est vrai pour le deuxième écouteur : les événements `keyup` activent la fonction `keyUpHandler()` (lorsque les touches cessent d'être enfoncées). Ajoutez ces lignes à votre code, sous les lignes `addEventListener()` : + +```js +function keyDownHandler(e) { if(e.key == "Right" || e.key == "ArrowRight") { rightPressed = true; } @@ -82,57 +88,63 @@ function keyUpHandler(e) { else if(e.key == "Left" || e.key == "ArrowLeft") { leftPressed = false; } -}</pre> +} +``` -<p>Quand on presse une touche du clavier, l'information est stockée dans une variable. La variable concernée est mis sur <code>true</code>. Quand la touche est relachée, la variable revient à <code>false</code>.</p> +Quand on presse une touche du clavier, l'information est stockée dans une variable. La variable concernée est mis sur `true`. Quand la touche est relachée, la variable revient à `false`. -<p>Les deux fonctions prennent un événement comme paramètre, représenté par la variable <code>e</code>. De là, vous pouvez obtenir des informations utiles : la propriété <code>key</code> contient les informations sur la touche qui a été enfoncée. La plupart des navigateurs utilisent <code>ArrowRight</code> et <code>ArrowLeft</code> pour les touches de flèche gauche/droite, mais nous devons également tester <code>Right</code> and <code>Left</code> pour prendre en charge les navigateurs IE/Edge. Si la touche gauche est enfoncé, la variable <code>leftPressed</code> est mise à <code>true</code>, et lorsqu'elle est relâchée, la variable <code>leftPressed</code> est mise à <code>false</code>. Le même principe s'applique à la touche droite et à la variable <code>RightPressed</code>.</p> +Les deux fonctions prennent un événement comme paramètre, représenté par la variable `e`. De là, vous pouvez obtenir des informations utiles : la propriété `key` contient les informations sur la touche qui a été enfoncée. La plupart des navigateurs utilisent `ArrowRight` et `ArrowLeft` pour les touches de flèche gauche/droite, mais nous devons également tester `Right` and `Left` pour prendre en charge les navigateurs IE/Edge. Si la touche gauche est enfoncé, la variable `leftPressed` est mise à `true`, et lorsqu'elle est relâchée, la variable `leftPressed` est mise à `false`. Le même principe s'applique à la touche droite et à la variable `RightPressed`. -<h3 id="La_logique_du_déplacement_de_la_raquette">La logique du déplacement de la raquette</h3> +### La logique du déplacement de la raquette -<p>Nous avons maintenant mis en place les variables pour stocker les informations sur les touches pressées, les écouteurs d'événements et les fonctions associées. Ensuite, nous allons entrer dans le code pour utiliser tout ce que nous venons de configurer et pour déplacer la palette à l'écran. Dans la fonction <code>draw()</code>, nous vérifierons si les touches gauche ou droite sont pressées lors du rendu de chaque image. Notre code pourrait ressembler à ceci :</p> +Nous avons maintenant mis en place les variables pour stocker les informations sur les touches pressées, les écouteurs d'événements et les fonctions associées. Ensuite, nous allons entrer dans le code pour utiliser tout ce que nous venons de configurer et pour déplacer la palette à l'écran. Dans la fonction `draw()`, nous vérifierons si les touches gauche ou droite sont pressées lors du rendu de chaque image. Notre code pourrait ressembler à ceci : -<pre class="brush: js">if(rightPressed) { +```js +if(rightPressed) { paddleX += 7; } else if(leftPressed) { paddleX -= 7; -}</pre> +} +``` -<p>Si la touche gauche est enfoncée, la raquette se déplacera de sept pixels vers la gauche, et si la droite est enfoncé, la raquette se déplacera de sept pixels vers la droite. Cela fonctionne actuellement, mais la raquette disparaît du bord du canevas si nous maintenons l'une ou l'autre des touches trop longtemps enfoncée. Nous pourrions améliorer cela et déplacer la raquette uniquement dans les limites du canevas en changeant le code comme ceci :</p> +Si la touche gauche est enfoncée, la raquette se déplacera de sept pixels vers la gauche, et si la droite est enfoncé, la raquette se déplacera de sept pixels vers la droite. Cela fonctionne actuellement, mais la raquette disparaît du bord du canevas si nous maintenons l'une ou l'autre des touches trop longtemps enfoncée. Nous pourrions améliorer cela et déplacer la raquette uniquement dans les limites du canevas en changeant le code comme ceci : -<pre class="brush: js">if(rightPressed) { +```js +if(rightPressed) { paddleX += 7; - if (paddleX + paddleWidth > canvas.width){ + if (paddleX + paddleWidth > canvas.width){ paddleX = canvas.width - paddleWidth; } } else if(leftPressed) { paddleX -= 7; - if (paddleX < 0){ + if (paddleX < 0){ paddleX = 0; } -}</pre> +} +``` + +La position de `paddleX` que nous utilisons variera entre `0` sur le côté gauche du canevas et `canvas.width-paddleWidth` sur le côté droit, ce qui fonctionnera exactement comme nous le souhaitons. + +Ajoutez le bloc de code ci-dessus dans la fonction `draw()` en bas, juste au-dessus de l'accolade de fermeture. -<p>La position de <code>paddleX</code> que nous utilisons variera entre <code>0</code> sur le côté gauche du canevas et <code>canvas.width-paddleWidth</code> sur le côté droit, ce qui fonctionnera exactement comme nous le souhaitons.<br> - <br> - Ajoutez le bloc de code ci-dessus dans la fonction <code>draw()</code> en bas, juste au-dessus de l'accolade de fermeture.<br> - <br> - Il ne reste plus qu'à appeler la fonction <code>drawPaddle()</code> depuis la fonction <code>draw()</code>, pour l'afficher réellement à l'écran. Ajoutez la ligne suivante à l'intérieur de votre fonction <code>draw()</code>, juste en dessous de la ligne qui appelle <code>drawBall()</code> :</p> +Il ne reste plus qu'à appeler la fonction `drawPaddle()` depuis la fonction `draw()`, pour l'afficher réellement à l'écran. Ajoutez la ligne suivante à l'intérieur de votre fonction `draw()`, juste en dessous de la ligne qui appelle `drawBall()` : -<pre class="brush: js">drawPaddle(); -</pre> +```js +drawPaddle(); +``` -<h2 id="Comparez_votre_code">Comparez votre code</h2> +## Comparez votre code -<p>Voici le code de référence auquel vous pouvez comparer le vôtre :</p> +Voici le code de référence auquel vous pouvez comparer le vôtre : -<p>{{JSFiddleEmbed("https://jsfiddle.net/end3r/tgn3zscj/","","395")}}</p> +{{JSFiddleEmbed("https://jsfiddle.net/end3r/tgn3zscj/","","395")}} -<p><strong>Exercice: </strong>faites aller la raquette plus vite ou plus lentement, ou changez sa taille.</p> +**Exercice:** faites aller la raquette plus vite ou plus lentement, ou changez sa taille. -<h2 id="Dans_le_prochain_chapitre">Dans le prochain chapitre</h2> +## Dans le prochain chapitre -<p>Maintenant, nous avons quelque chose qui ressemble à un jeu. Le seul problème, c'est que vous pouvez continuer à frapper la balle avec la raquette indéfiniment. Tout cela va changer dans le cinquième chapitre, <a href="/fr/docs/Games/Workflows/Breakout_game_from_scratch/Game_over">Game over</a>, lorsque nous commencerons à ajouter un état de fin de partie pour notre jeu.</p> +Maintenant, nous avons quelque chose qui ressemble à un jeu. Le seul problème, c'est que vous pouvez continuer à frapper la balle avec la raquette indéfiniment. Tout cela va changer dans le cinquième chapitre, [Game over](/fr/docs/Games/Workflows/Breakout_game_from_scratch/Game_over), lorsque nous commencerons à ajouter un état de fin de partie pour notre jeu. -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Faire_rebondir_la_balle_sur_les_murs", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Game_over")}}</p> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Faire_rebondir_la_balle_sur_les_murs", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Game_over")}} diff --git a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/track_the_score_and_win/index.md b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/track_the_score_and_win/index.md index 55ed6a8aa3..0ef6279158 100644 --- a/files/fr/games/tutorials/2d_breakout_game_pure_javascript/track_the_score_and_win/index.md +++ b/files/fr/games/tutorials/2d_breakout_game_pure_javascript/track_the_score_and_win/index.md @@ -4,89 +4,97 @@ slug: Games/Tutorials/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win translation_of: Games/Tutorials/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win original_slug: Games/Workflows/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win --- -<div>{{GamesSidebar}}</div> +{{GamesSidebar}}{{IncludeSubnav("/fr/docs/Games")}} -<div>{{IncludeSubnav("/fr/docs/Games")}}</div> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/detection_colisions", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Mouse_controls")}} -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/detection_colisions", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Mouse_controls")}}</p> +Ceci est la **8<sup>e</sup>** étape de ce [tutoriel Gamedev Canvas](/fr/docs/Games/Workflows/Breakout_game_from_scratch). Vous pouvez trouver le code source tel qu'il devrait être après avoir terminé cette leçon à : [Gamedev-Canvas-workshop/lesson8.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson08.html). -<p>Ceci est la <strong>8<sup>e</sup></strong> étape de ce <a href="/fr/docs/Games/Workflows/Breakout_game_from_scratch">tutoriel Gamedev Canvas</a>. Vous pouvez trouver le code source tel qu'il devrait être après avoir terminé cette leçon à : <a href="https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson08.html">Gamedev-Canvas-workshop/lesson8.html</a>.</p> +Détruire les briques est vraiment cool, mais pour être encore meilleur le jeu pourrait attribuer des points pour chaque brique touchée et compter le score total. -<p>Détruire les briques est vraiment cool, mais pour être encore meilleur le jeu pourrait attribuer des points pour chaque brique touchée et compter le score total.</p> +## Calculer le score -<h2 id="Calculer_le_score">Calculer le score</h2> +Si vous pouvez voir votre score durant le jeu, vous pourrez impressioner vos amis. Vous avez besoin d'une variable pour stocker le score. Ajoutez ce qui suit dans votre JavaScript après le reste de vos variables : -<p>Si vous pouvez voir votre score durant le jeu, vous pourrez impressioner vos amis. Vous avez besoin d'une variable pour stocker le score. Ajoutez ce qui suit dans votre JavaScript après le reste de vos variables : </p> +```js +var score = 0; +``` -<pre class="brush: js">var score = 0;</pre> +Vous avez aussi besoin d'une fonction `drawScore()`, pour créer et mettre à jour l'affichage du score. Ajoutez ce qui suit après la fonction de détection de collision `collisionDetection()`: -<p>Vous avez aussi besoin d'une fonction <code>drawScore()</code>, pour créer et mettre à jour l'affichage du score. Ajoutez ce qui suit après la fonction de détection de collision <code>collisionDetection()</code>:</p> - -<pre class="brush: js">function drawScore() { +```js +function drawScore() { ctx.font = "16px Arial"; ctx.fillStyle = "#0095DD"; ctx.fillText("Score: "+score, 8, 20); -}</pre> +} +``` -<p>Dessiner du texte sur un canvas revient à dessiner une forme. La définition de la police est identique à celle en CSS — vous pouvez définir la taille et le type avec la méthode {{domxref("CanvasRenderingContext2D.font","font()")}}. Puis utilisez {{domxref("CanvasRenderingContext2D.fillStyle()","fillStyle()")}} pour définir la couleur de la police et {{domxref("CanvasRenderingContext2D.fillText","fillText()")}} pour définir la position du texte sur le canevas. Le premier paramètre est le texte lui-même — le code ci-dessus indique le nombre actuel de points — et les deux derniers paramètres sont les coordonnées où le texte est placé sur le canevas.</p> +Dessiner du texte sur un canvas revient à dessiner une forme. La définition de la police est identique à celle en CSS — vous pouvez définir la taille et le type avec la méthode {{domxref("CanvasRenderingContext2D.font","font()")}}. Puis utilisez {{domxref("CanvasRenderingContext2D.fillStyle()","fillStyle()")}} pour définir la couleur de la police et {{domxref("CanvasRenderingContext2D.fillText","fillText()")}} pour définir la position du texte sur le canevas. Le premier paramètre est le texte lui-même — le code ci-dessus indique le nombre actuel de points — et les deux derniers paramètres sont les coordonnées où le texte est placé sur le canevas. -<p>Pour attribuer le score à chaque collision avec une brique, ajoutez une ligne à la fonction <code>collisionDetection()</code> afin d'incrémenter la valeur de la variable score à chaque détection d'une collision. Ajoutez à votre code la ligne mise en évidence ci-dessous :</p> +Pour attribuer le score à chaque collision avec une brique, ajoutez une ligne à la fonction `collisionDetection()` afin d'incrémenter la valeur de la variable score à chaque détection d'une collision. Ajoutez à votre code la ligne mise en évidence ci-dessous : -<pre class="brush: js; highlight:[9]">function collisionDetection() { - for(var c=0; c<brickColumnCount; c++) { - for(var r=0; r<brickRowCount; r++) { +```js +function collisionDetection() { + for(var c=0; c<brickColumnCount; c++) { + for(var r=0; r<brickRowCount; r++) { var b = bricks[c][r]; if(b.status == 1) { - if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) { + if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) { dy = -dy; b.status = 0; - <strong>score++;</strong> + score++; } } } } -}</pre> +} +``` -<p>Appelez la fonction <code>drawScore()</code> dans la fonction <code>draw()</code> pour garder le score à jour à chaque nouvelle frame — ajoutez la ligne suivante dans la fonction <code>draw()</code>, en dessous de l'appel à <code>drawPaddle()</code> :</p> +Appelez la fonction `drawScore()` dans la fonction `draw()` pour garder le score à jour à chaque nouvelle frame — ajoutez la ligne suivante dans la fonction `draw()`, en dessous de l'appel à `drawPaddle()` : -<pre class="brush: js">drawScore();</pre> +```js +drawScore(); +``` -<h2 id="Ajoutez_un_message_de_victoire_lorsque_toutes_les_briques_ont_été_détruites">Ajoutez un message de victoire lorsque toutes les briques ont été détruites</h2> +## Ajoutez un message de victoire lorsque toutes les briques ont été détruites -<p>Le comptage des points fonctionne bien, mais vous ne les compterez pas indéfiniment. Alors qu'en est-il du score lorsque toutes les briques ont été détruites ? Après tout c'est l'objectif principal du jeu. Vous devez donc afficher un message de victoire si toutes les briques ont été détruites. Ajoutez la section mise en évidence dans votre fonction <code>collisionDetection()</code>:</p> +Le comptage des points fonctionne bien, mais vous ne les compterez pas indéfiniment. Alors qu'en est-il du score lorsque toutes les briques ont été détruites ? Après tout c'est l'objectif principal du jeu. Vous devez donc afficher un message de victoire si toutes les briques ont été détruites. Ajoutez la section mise en évidence dans votre fonction `collisionDetection()`: -<pre class="brush: js; highlight:[10,11,12,13]">function collisionDetection() { - for(var c=0; c<brickColumnCount; c++) { - for(var r=0; r<brickRowCount; r++) { +```js +function collisionDetection() { + for(var c=0; c<brickColumnCount; c++) { + for(var r=0; r<brickRowCount; r++) { var b = bricks[c][r]; if(b.status == 1) { - if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) { + if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) { dy = -dy; b.status = 0; score++; - <strong>if(score == brickRowCount*brickColumnCount) { + if(score == brickRowCount*brickColumnCount) { alert("C'est gagné, Bravo!"); document.location.reload(); clearInterval(interval); // Needed for Chrome to end game - }</strong> + } } } } } -}</pre> +} +``` -<p>Grâce à ça, les utilisateurs peuvent réellement gagner le jeu. La fonction <code>document.location.reload()</code> recharge la page et redémarre le jeu au clic sur le bouton d'alerte.</p> +Grâce à ça, les utilisateurs peuvent réellement gagner le jeu. La fonction `document.location.reload()` recharge la page et redémarre le jeu au clic sur le bouton d'alerte. -<h2 id="Comparez_votre_code">Comparez votre code</h2> +## Comparez votre code -<p>Le code réalisé fonctionne et ressemble à cela, au cas où vous voudriez le comparer avec le vôtre : </p> +Le code réalisé fonctionne et ressemble à cela, au cas où vous voudriez le comparer avec le vôtre : -<p>{{JSFiddleEmbed("https://jsfiddle.net/raymondjplante/b3z2Lpu9/","","395")}}</p> +{{JSFiddleEmbed("https://jsfiddle.net/raymondjplante/b3z2Lpu9/","","395")}} -<p><strong>Exercice</strong>: Ajoutez plus de points par brique touchée et indiquez le nombre de points gagnés dans la boîte d'alerte de fin de partie.</p> +**Exercice**: Ajoutez plus de points par brique touchée et indiquez le nombre de points gagnés dans la boîte d'alerte de fin de partie. -<h2 id="Prochaine_étape">Prochaine étape</h2> +## Prochaine étape -<p>Le jeu est plutôt réussi à ce stade. Dans la prochaine leçon, vous le rendrez plus attraynt en ajoutant le <a href="/fr/docs/Games/Workflows/Breakout_game_from_scratch/Mouse_controls">contrôle à la souris</a>.</p> +Le jeu est plutôt réussi à ce stade. Dans la prochaine leçon, vous le rendrez plus attraynt en ajoutant le [contrôle à la souris](/fr/docs/Games/Workflows/Breakout_game_from_scratch/Mouse_controls). -<p>{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/detection_colisions", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Mouse_controls")}}</p> +{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/detection_colisions", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Mouse_controls")}} |