Voici la suite de la traduction du tutoriel écrit par Alvin Ourad et Richard Davey.
Elle commence dans ce premier article
Puis se poursuit avec ce second article
Alors que le troisiĂšme article est lĂ Logiquement, il y a eu ce quatriĂšme article
Nous en étions resté au moment ou le joueur tombait en ignorant le sol que nous avions créé.
La raison est simple : nous ne testons pas encore la collision entre le sol et le joueur.
Nous avons dĂ©jĂ indiquĂ© Ă Phaser que notre sol et nos plateformes Ă©taient inamovibles. Si nous ne lâavions pas fait, le joueur les aurait rencontrĂ©, aurait marquĂ© un temps dâarrĂȘt, puis tous les Ă©lements se seraient dispersĂ©s.
A moins dâindiquer le contraire, le Sprite du sol est un objet physique qui peut se dĂ©placer (appellĂ© aussi corps dynamique) et quand le joueur le percute, les forces rĂ©sultantes sont appliquĂ©es au sol, et les deux objects modifient leur vĂ©locitĂ©s et le sol se met Ă tomber lui aussi.
Donc, pour permettre au joueur dâentrer en collision et dâutiliser les propriĂ©tĂ©s physiques, nous devons ajouter un test de collision dans la fonction update :
function update() {
game.physics.arcade.collide(player, platforms);
}
La fonction update est appelée par la boucle de jeu toutes les frames. La fonction Physics.collide est celle qui fait toute la magie. Elle utilise deux objets pour tester la collision et les sépare. Dans notre cas, nous lui passons notre Sprite de joueur et le Group de plateformes. Cette fonction est suffisament maline pour vérifier la collision avec chaque membre du Group. Cet appel va donc vérifier les collisions avec le sol et les plateformes.
Le résultat est une plateforme solide:

GĂ©rer les collisions, câest bien beau, mais nous avons besoin de faire bouger le joueur. Peut ĂȘtre ĂȘtes vous tentĂ©s de plonger dans la documentation et chercher comment ajouter des event et les Ă©couter, mais ce nâest pas utile ici.
Phaser inclus un gestionnaire de clavier et un des avantages de lâutiliser est cette petite fonction bien pratique :
cursors = game.input.keyboard.createCursorKeys();
Cela va peupler lâobjet cursors avec quatre propriĂ©tĂ©s : up , down , left , right (NdT : haut, bas, gauche, droite) qui sont des instances des objets Phaser.key. Tout ce quâil nous reste Ă faire est dâaller vĂ©rifier ces instances Ă chaque boucle :
// Reset the players velocity (movement)
player.body.velocity.x = 0;
if (cursors.left.isDown)
{
// Move to the left
player.body.velocity.x = -150;
player.animations.play('left');
}
else if (cursors.right.isDown)
{
// Move to the right
player.body.velocity.x = 150;
player.animations.play('right');
}
else
{
// Stand still
player.animations.stop();
player.frame = 4;
}
// Allow the player to jump if they are touching the ground.
if (cursors.up.isDown && player.body.touching.down)
{
player.body.velocity.y = -350;
}
MĂȘme si nous venons dâajouter pas mal de code, cela devrait rester assez lisible.
La premiÚre chose que nous faisons est de réinitialiser la vélocité horizontale du Sprite.
Nous vĂ©rifions ensuite si la flĂšche vers le bas est appuyĂ©e. Si câest le cas, nous appliquons une vĂ©locitĂ© horizontale nĂ©gative et nous dĂ©clenchons lâanimation de course Ă gauche.
Si Ă la place nous avons la touche flĂšche vers la droite appuyĂ©e, nous faisons exactement lâinverse.
En remettant Ă zĂ©ro la vĂ©locitĂ© et en la modifiant de cette façon Ă chaque frame , cela crĂ©e un mouvement de type âstoppe-repartâ.
Le Sprite du joueur ne bougera que lorsquâune touche est appuyĂ©e et sâarrĂȘte immĂ©diatement quand ce nâest plus le cas.
Phaser vous permet de crĂ©er des mouvements plus complexes, avec de lâinertie et de lâaccĂ©lĂ©ration, mais nous nous satisferons de notre mouvement pour ce jeu.
La derniĂšre portion de code remet le sprite du joueur avec la frame 4 si aucune touche nâest appuyĂ©e. La frame 4 dans la feuille de Sprite est celle oĂč le joueur vous regarde, immobile.
La derniĂšre portion de code ajoute la possibilitĂ© de sauter. La touche flĂȘche vers le haut sera la touche de saut et nous testons si elle est appuyĂ©e.
MalgrĂ© tout, nous testerons Ă©galement si le joueur touche le sol, sinon il pourait sauter alors quâil serait dĂ©jĂ dans les airs.
Si ces deux conditions sont respectées, nous appliquons une vélocité verticale de 350 pixel/sec.
Le joueur retombera vers le sol automatiquement grùce à la valeur de gravité que nous lui appliquons.
Essayez de jouer avec des valeurs plus ou moins grandes que 350 pour voir lâeffet produit.

Il est grand temps de donner un but à notre petit jeu. Faisons pleuvoir des étoiles sur la scÚne et permettons au joueur de les ramasser.
Pour y parvenir, nous allons crĂ©er un Group appelĂ© âstarsâ et nous le peuplerons. Dans notre fonction create , nous ajoutons le code suivant (qui peut ĂȘtre vu dans le fichier part8.html)
stars = game.add.group();
stars.enableBody = true;
// Here we'll create 12 of them evenly spaced apart
for (var i = 0; i < 12; i++)
{
// Create a star inside of the 'stars' group
var star = stars.create(i * 70, 0, 'star');
// Let gravity do its thing
star.body.gravity.y = 6;
// This just gives each star a slightly random bounce value
star.body.bounce.y = 0.7 + Math.random() * 0.2;
}
Le procĂ©dĂ© utilisĂ© est similaire Ă celui que nous avons utilisĂ© pour le Group de plateformes. En utilisant lâinstruction de boucle for de Javascript, nous indiquons que nous crĂ©ons 12 Ă©toiles dans notre jeu.
Elles ont une coordonnée x de i * 70 , ce qui signifie que nous les répartissons équitablement dans la scÚne tous les 70 pixels.
Comme pour le joueur, nous leur donnons une gravitĂ© pour quâelles tombent, et une valeur de bounce (NdT : rebond) pour quâelle rebondissent un peu quand elles touchent les plateformes.
Le rebond bounce a une valeur entre 0 (pas de rebond du tout) et 1 (rebond total). Les notres rebondiront avec une valeur entre 0,7 et 0,9. Si nous executions le code tel que, les Ă©toiles tomberaient et passeraient Ă travers le bas du jeu. Pour arrĂȘter ce phĂ©nomĂšne, nous devons vĂ©rifier les collisions entre les Ă©toiles et les plaformes au sein de notre boucle for :
game.physics.arcade.collide(stars, platforms);
Nous en profiterons pour tester si le joueur et les Ă©toiles ne partagent pas la mĂȘme zone de jeu.
game.physics.arcade.overlap(player, stars, collectStar, null, this);
Cela indique Ă Phaser quâil doit vĂ©rifier les recoupements entre le joueur et chacune des Ă©toiles du Group. Sâil trouve un recoupement, il passe ces Ă©lĂ©ments Ă la fonction âcollecStarâ
function collectStar (player, star) {
// Removes the star from the screen
star.kill();
}
LâĂ©toile est alors simplement Ă©liminĂ©e par lâinstruction kill , ce qui a pour effet de la retirer de lâaffichage. Le jeu a donc maintenant un joueur qui peut librement se ballader, sauter, bondir des plateformes et ramasser les Ă©toiles qui tombent du ciel.
Pas mal pour quelques lignes de code que lâon peut qualifier dâassez lisibles :)

La derniĂšre petite modification que nous allons faire va consister Ă ajouter un score.
Pour cela, nous allons utiliser un objet Phaser.Text.
Nous crĂ©erons deux nouvelles variables, une qui contiendra le score actuel et lâautre lâobjet texte lui mĂȘme :
var score = 0;
var scoreText;
Le scoreText est paramétré dans la fonction create :
scoreText = game.add.text(16, 16, 'score: 0', { fontSize: '32px', fill: '#000' });
Les deux premiers paramĂštres 16,16 reprĂ©sentent les coordonnĂ©es dâaffichage du texte. âscore: 0â est la chaĂźne par dĂ©faut qui sera affichĂ©e et lâobjet qui suit contient la taille de la fonte et sa couleur de remplissage. En ne prĂ©cisant pas la fonte, nous allons en fait utiliser celle que le navigateur choisira par dĂ©faut, ce qui correspond Ă Arial sous Windows par exemple.
Nous allons devoir ensuite modifier la fonction collectStar pour que lorsque le joueur attrape une étoile son score augmente et le texte est mis à jour pour refléter ce changement :
function collectStar (player, star) {
// Removes the star from the screen
star.kill();
// Add and update the score
score += 10;
scoreText.text = 'Score: ' + score;
}
Donc 10 points seront ajoutés pour chaque étoile et le texte du score scoreText est mis à jour avec le nouveau total.
Si vous ouvrez le fichier part9.html vous verrez le jeu au final.

Vous avez appris comment crĂ©er un Sprite avec des propriĂ©tĂ©s physiques, Ă contrĂŽler son dĂ©placement et le faire interagir avec dâautres objets dans un petit jeu.
Il y a beaucoup dâautres choses que vous pouvez rĂ©aliser pour lâamĂ©liorer, par exemple ajouter une fin ou un but. Pourquoi ne pas ajouter des pieux quâil faudrait Ă©viter ? Vous pourriez crĂ©er un nouveau Group âspikesâ (NdT: pieux) et vĂ©rifier les collisions avec le joueur, puis vous feriez disparaitre le joueur au lieu du pieu. Ou pour un style de jeu non violent, faire du jeu une course contre la montre et simplement dĂ©fier les joueurs de ramasser les Ă©toiles le plus vite possible.
Nous avons inclus dâautres ressources graphiques dans le fichier zip de ce tutoriel pour vous inspirer.
Avec lâaide de ce que vous avez appris dans ce tutoriel et les plus de 250 exemples Ă votre disposition, vous devrier alors aboir de solides fondations pour un projet futur.
Mais comme toujours, si vous avez des questions, si vous avez besoin dâun conseil ou si vous souhaitez partager vos travaux, nâhĂ©sitez pas Ă demander de lâaide dans le forum Phaser.
Jâajouterai que comme toujours, je rĂ©pond avec plaisir aux commentaires et emails.
Merci de votre patience et si je vois quâil y a des motivĂ©s pour continuer lâaventure, je prendrai un peu de temps pour rĂ©diger une suite Ă ce tutoriel.
Qui sait, Alvin ou Richard feront alors une traduction anglaise ;)
Amusez vous, codez comme des fous, Ă bientĂŽt.