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:

part6

Contrôler le jouer avec le clavier

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.

Sautons

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.

part7

Pluie d’étoiles

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 :)

part8

Touche finale

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.

part9

Conclusion

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.

Conclusion de la traduction

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.