Créer un jeu de Pong en HTML5 avec EaselJS

Dans ce tutoriel, nous allons créer un clone du jeu classique, Pong, en HTML5, à l'aide de la bibliothèque EaselJS. Le jeu aura plusieurs écrans, effets sonores et un adversaire (très simple) de l'IA.

Étape 1: bref aperçu

En utilisant des graphiques prédéfinis, nous allons programmer Pong jeu en HTML5 à l'aide de la bibliothèque EaselJS, qui fournit une interface de type Flash pour le canevas HTML5. Pour une introduction à EaselJS, voir cet article Activetuts +.

Le joueur pourra contrôler une raquette à l'aide de la souris et jouer contre l'adversaire du contrôleur de l'ordinateur pour obtenir des points..


Étape 2: interface

Une interface simple avec un style néo-futuriste sera utilisée; cela implique plusieurs formes, boutons, bitmaps et plus.

Les graphiques nécessaires à ce tutoriel sont disponibles dans le téléchargement ci-joint..


Étape 3: Obtenez EaselJS

La bibliothèque EaselJS sera utilisée pour construire notre jeu, assurez-vous de lire le Commencer tutoriel si vous êtes nouveau dans cette bibliothèque.

Vous pouvez télécharger la dernière version d’EaselJS depuis son site officiel. Cependant, cela peut être incompatible avec le code ici, je vous suggère donc d'utiliser la version de la bibliothèque fournie avec le téléchargement source..


Étape 4: Structure HTML

Préparons notre document HTML. Nous allons commencer par les bases, juste un aperçu de base:

    Pong    

Étape 5: Masquer le surlignage mobile

Nous devons également ajouter un peu de CSS pour supprimer la mise en évidence par défaut appliquée lorsque vous appuyez sur un élément dans un navigateur mobile. Sans cela, l'expérience mobile diminuerait considérablement.

    Pong     

Étape 6: bibliothèques Javascript

Le code suivant ajoute les bibliothèques javascript nécessaires au bon fonctionnement de notre application..

    Pong         /

Outre EaselJS, nous utiliserons également TweenJS (pour la gestion des transitions d’écran et la boucle de jeu) et SoundJS (pour les effets sonores)..

Main.js est le fichier que nous utiliserons pour contenir notre propre code JS.


Étape 7: appelez la fonction principale

Dans les lignes suivantes, nous appelons notre Principale() une fonction. C’est la fonction qui lancera notre application; ça va être créé plus tard dans le tutoriel, à l'intérieur Main.js.

    Pong         

Étape 8: étiquette en toile

Un canevas HTML5 est créé dans cette ligne; nous lui attribuons un identifiant afin que nous puissions le référencer plus tard et définir sa largeur et sa hauteur.

    Pong          

Étape 9: Créer Main.js

Commençons notre création de jeu!

Ouvrez votre éditeur JavaScript préféré (tout éditeur de texte fonctionnera, mais vous n'aurez pas la coloration syntaxique) et préparez-vous à écrire le code. N'oubliez pas de sauvegarder le fichier sous Main.js dans votre dossier de projet.


Étape 10: Définir le canevas

Nous allons commencer par définir toutes les variables graphiques et logiques.

Les variables suivantes représentent l'élément de canevas HTML et l'étape qui sera liée à celui-ci. le étape variable se comportera de la même manière que l’étape AS3.

 / * Définir Canvas * / var canvas; stade var;

Étape 11: Contexte

Cette variable stocke l'image de fond du titre.

 / * Arrière-plan * / var bgImg = new Image (); var bg;

Étape 12: Vue du titre

Ceci est la vue du titre, le premier écran interactif à apparaître dans notre jeu. Ces variables stockent ses composants.

 / * Vue du titre * / var mainImg = new Image (); var principal; var startBImg = new Image (); var startB; var creditsBImg = new Image (); var créditsB; var TitleView = new Container ();

Étape 13: Crédits

Cette vue montrera le générique, l'année et le copyright du jeu, ces variables seront utilisées pour le stocker..

 / * Crédits * / var creditsViewImg = new Image (); crédits var;

Étape 14: Affichage du jeu

Les variables suivantes stockent les graphiques individuels qui apparaissent dans la vue du jeu:

 / * Vue du jeu * / var playerImg = new Image (); var player; var ballImg = new Image (); balle de var; var cpuImg = new Image (); var cpu; var winImg = new Image (); var gagner; var perdImg = new Image (); var perdre;

Étape 15: Score

Les valeurs de score seront traitées par les variables suivantes:

 / * Score * / var playerScore; var cpuScore;

Étape 16: Variables

Ce sont les variables que nous allons utiliser, lisez les commentaires dans le code pour comprendre à quoi ils servent:

 var xSpeed ​​= 5; // vitesse horizontale de la balle var ySpeed ​​= 5; // Vitesse verticale de la balle var gfxLoaded = 0; // utilisé en tant que préchargeur, compte les éléments déjà chargés var tkr = new Object; // utilisé comme écouteur d'événement pour le ticker

Étape 17: Créer des effets sonores

Nous utiliserons des effets sonores pour améliorer le ressenti du jeu. Les sons de cet exemple ont été créés à l'aide de l'excellent outil gratuit as3sfxr et convertis au format MP3 à l'aide d'Audacity..

Les sons nécessaires peuvent tous être trouvés dans le téléchargement source. Si vous voulez créer le vôtre, vous en aurez besoin de quatre:

  • hit.mp3: joué lorsque la balle frappe une raquette
  • playerScore.mp3: joué quand les scores des joueurs
  • ennemiScore.mp3: joué quand l'ennemi marque
  • wall.mp3: joué lorsque le ballon frappe la limite supérieure ou inférieure

Étape 18: Fonction principale

le Principale() La fonction sera la première à s'exécuter lors du chargement de la page Web, car elle est mentionnée dans le en charge attribut du document HTML (voir l'étape 7).

Il appellera les fonctions nécessaires pour commencer le jeu.

 fonction Main () // code…

Étape 19: Lien de la toile

Ce code obtient l'ID de canevas HTML et le lie à la classe EaselJS Stage. Cela fera que la variable stage se comportera comme la classe stage dans AS3. Ajouter ceci à Principale().

 / * Link Canvas * / canvas = document.getElementById ('Pong'); stage = new Stage (toile);

Étape 20: Activer les événements de souris

Les événements de souris sont désactivés par défaut dans EaselJS pour améliorer les performances. Puisque nous avons besoin de ceux du jeu, nous ajoutons la ligne suivante. Ajouter ceci à Principale().

 stage.mouseEventsEnabled = true;

Étape 21: Charger les sons

Nous utiliserons SoundJS pour ajouter des sons à notre jeu. écrivez le code suivant pour importer les sons que nous allons utiliser. Ajouter ceci à Principale().

 / * Sound * / SoundJS.addBatch ([name: 'hit', src: 'hit.mp3', instances: 1, name: 'playerScore', src: 'playerScore.mp3', instances: 1, nom: 'ennemiScore', src: 'ennemiScore.mp3', instances: 1, nom: 'mur', src: 'wall.mp3', instances: 1]);

Étape 22: Charger les graphiques

Ce code est utilisé pour précharger les graphiques, à l'aide d'une fonction que nous écrirons plus tard. Il définit les objets Image que nous avons créés précédemment pour qu'ils pointent vers les fichiers PNG source pertinents de notre dossier de documents..

Un nom est attribué à chacun pour que nous puissions détecter quelle image est chargée plus tard, et enfin la fonction qui gère les images chargées est appelée.

Ajouter ceci à Principale().

 / * Charge GFX * / bgImg.src = 'bg.png'; bgImg.name = 'bg'; bgImg.onload = loadGfx; mainImg.src = 'main.png'; mainImg.name = 'main'; mainImg.onload = loadGfx; startBImg.src = 'startB.png'; startBImg.name = 'startB'; startBImg.onload = loadGfx; creditsBImg.src = 'creditsB.png'; creditsBImg.name = 'creditsB'; creditsBImg.onload = loadGfx; creditsViewImg.src = 'credits.png'; creditsViewImg.name = 'credits'; creditsViewImg.onload = loadGfx; playerImg.src = 'paddle.png'; playerImg.name = 'player'; playerImg.onload = loadGfx; ballImg.src = 'ball.png'; ballImg.name = 'ball'; ballImg.onload = loadGfx; cpuImg.src = 'paddle.png'; cpuImg.name = 'cpu'; cpuImg.onload = loadGfx; winImg.src = 'win.png'; winImg.name = 'win'; winImg.onload = loadGfx; lostImg.src = 'lost.png'; lostImg.name = 'lost'; lostImg.onload = loadGfx;

Étape 23: Définir le ticker

La classe Ticker fournit une émission centralisée de ticks ou de pulsations à un intervalle défini. Cela peut être utilisé pour déclencher la boucle de jeu.

Le code suivant définit la cadence d'images sur 30 et définit l'étape en tant qu'auditeur des ticks..

La classe TweenJS écoutera cette coche pour exécuter les animations. Ajouter ceci à Principale().

 / * Ticker * / Ticker.setFPS (30); Ticker.addListener (scène);

Étape 24: Fonction de préchargement

Chaque fois qu'un graphique est chargé, cette fonction sera exécutée. Il assignera chaque image à un objet bitmap et vérifiera que tous les éléments sont chargés avant de continuer..

 function loadGfx (e) if (e.target.name = 'bg') bg = nouveau Bitmap (bgImg); if (e.target.name = 'main') main = nouveau Bitmap (mainImg); if (e.target.name = 'startB') startB = new Bitmap (startBImg); if (e.target.name = 'creditsB') creditsB = nouveau Bitmap (creditsBImg); if (e.target. name = 'credits') credits = new Bitmap (creditsViewImg); if (e.target.name = 'player') player = nouveau Bitmap (playerImg); if (e.target.name = 'ball') ball = new Bitmap (ballImg); if (e.target.name = 'cpu') cpu = nouveau Bitmap (cpuImg); if (e.target.name = 'win') win = nouveau Bitmap ( winImg); if (e.target.name = 'perdre') perdre = nouveau Bitmap (perdreImg); gfxLoaded ++; if (gfxLoaded == 10) // n'oubliez pas de changer cela si vous ajoutez plus d'images addTitleView (); 

Étape 25: Ajouter la vue du titre

Lorsque tous les graphiques sont chargés, la vue du titre est ajoutée à la scène à l'aide de la fonction suivante:

 fonction addTitleView () startB.x = 240 - 31.5; startB.y = 160; startB.name = 'startB'; créditsB.x = 241 - 42; créditsB.y = 200; TitleView.addChild (main, startB, creditsB); stage.addChild (bg, TitleView); stage.update ();

Étape 26: Bouton Démarrer les auditeurs

Cette fonction ajoute les auditeurs nécessaires à la TitleView boutons (il fait partie de addTitleView ()):

 startB.onPress = addGameView; creditsB.onPress = showCredits; 

Étape 27: Afficher les crédits

le Crédits l’écran s’affiche lorsque l’utilisateur clique sur le bouton des crédits; un écouteur de souris est ajouté à l'image complète pour l'enlever.

 function showCredits () // Afficher les crédits crédits.x = 480; stage.addChild (crédits); stage.update (); Tween.get (crédits) .to (x: 0, 300); credits.onPress = hideCredits; 

Étape 28: masquer les crédits

Quand le Crédits l'écran est cliqué, il sera interpolé et retiré de la scène.

 // Hide Credits function hideCredits (e) Tween.get (crédits) .to (x: 480, 300) .call (rmvCredits);  // Supprimer les crédits function rmvCredits () stage.removeChild (crédits); 

Arrêtons-nous ici pour tester ce que nous avons fait jusqu'à présent. Cliquez ici pour une démonstration de jalon.

Gardez à l'esprit que certaines lignes ont été commentées car certaines fonctions n'ont pas encore été créées..

Rappelez-vous que le jalon est inclus dans les fichiers source. Si, pour une raison quelconque, votre fichier ne reproduit pas celui-ci, comparez votre source à la mienne pour voir ce qui pourrait en être la cause..


Étape 29: Afficher la vue de jeu

Les lignes suivantes suppriment le TitleView de la scène et ajoute le GameView articles à la scène. Un écouteur de souris est ajouté à l'arrière-plan, pour démarrer le jeu lorsque l'utilisateur clique dessus.

 function addGameView () // Ecran Détruire le menu et les crédits stage.removeChild (TitleView); TitleView = null; crédits = null; // Ajouter la vue du jeu player.x = 2; player.y = 160 - 37,5; cpu.x = 480-25; cpu.y = 160 - 37,5; ball.x = 240-15; ball.y = 160 - 15; // Score playerScore = new Text ('0', 'Arial gras 20px', '# A3FF24'); playerScore.maxWidth = 1000; // correctif pour Chrome 17 playerScore.x = 211; playerScore.y = 20; cpuScore = nouveau texte ('0', 'Arial gras 20px', '# A3FF24'); cpuScore.maxWidth = 1000; // correctif pour Chrome 17 cpuScore.x = 262; cpuScore.y = 20; stage.addChild (playerScore, cpuScore, joueur, cpu, balle); stage.update (); // Démarrer le programme d'écoute bg.onPress = startGame; 

Étape 30: Mouvement du joueur

Le joueur se déplacera avec la position verticale de la souris:

 function movePaddle (e) // Déplacement de la souris player.y = e.stageY; 

Étape 31: Démarrer le jeu

Ce code est exécuté lorsque le joueur clique sur l'arrière-plan du jeu, il ajoute l'écouteur de souris qui déclenche la fonction à l'étape précédente et ajoute un ticker pour contrôler la boucle de jeu..

Faites attention à la façon dont le ticker est créé: c'est l'équivalent d'un événement Timer dans AS3.

 fonction startGame (e) bg.onPress = null; stage.onMouseMove = movePaddle; Ticker.addListener (tkr, false); tkr.tick = update; 

Étape 32: réinitialiser

Lorsqu'un point est marqué (par le joueur ou l'ordinateur), les palettes et la balle reviendront à leurs positions d'origine et la partie sera mise en pause:

 fonction reset () ball.x = 240 - 15; ball.y = 160 - 15; player.y = 160 - 37,5; cpu.y = 160 - 37,5; stage.onMouseMove = null; // cesse d'écouter la souris Ticker.removeListener (tkr); // met en pause le jeu bg.onPress = startGame; 

Étape 33: Mouvement du ballon

Si le jeu n'est pas en pause, la balle sera déplacée de chaque image en utilisant les variables créées précédemment..

 function update () // Mouvement de balle ball.x = ball.x + xSpeed; ball.y = ball.y + ySpeed;

Étape 34: Mouvement du processeur

Ce code contrôle le mouvement de l'ordinateur. la pagaie est déplacée de manière à suivre la balle tout en ayant une marge d'erreur.

 si (cpu.y < ball.y)  cpu.y = cpu.y + 2.5;  else if(cpu.y > ball.y) cpu.y = cpu.y - 2,5; 

Étape 35: Collisions murales

Ici, nous vérifions si la balle est au bord supérieur ou inférieur de la toile; si c'est le cas, la vitesse verticale est inversée et un son est joué.

 si ((ball.y) < 0)  ySpeed = -ySpeed; SoundJS.play('wall');;//Up if((ball.y + (30)) > 320) ySpeed ​​= -ySpeed; SoundJS.play ('wall');; // bas

Étape 36: Scores

Maintenant les côtés gauche et droit. Ce code modifie également le score, appelle la fonction de réinitialisation et joue un son différent en fonction du côté du ballon touché.

 / * Score CPU * / if ((ball.x) < 0)  xSpeed = -xSpeed; cpuScore.text = parseInt(cpuScore.text + 1); reset(); SoundJS.play('enemyScore');  /* Player Score */ if((ball.x + (30)) > 480) xSpeed ​​= -xSpeed; playerScore.text = parseInt (playerScore.text + 1); réinitialiser(); SoundJS.play ('playerScore'); 

Étape 37: Collisions balle-pagaie

Le code suivant vérifie si la balle entre en collision avec une raquette, en comparant la position de la raquette aux coordonnées de la balle. Si les contours des deux intersections se croisent, il y a collision, alors nous inversons la vitesse x de la balle et jouons un son..

 / * Collision de l'unité centrale * / if (ball.x + 30> cpu.x && ball.x + 30 < cpu.x + 22 && ball.y >= cpu.y && ball.y < cpu.y + 75)  xSpeed *= -1; SoundJS.play('hit');  /* Player collision */ if(ball.x <= player.x + 22 && ball.x > player.x && ball.y> = player.y && ball.y < player.y + 75)  xSpeed *= -1; SoundJS.play('hit'); 

Étape 38: Vérifiez que Win / Game Over est terminé

Vous pouvez modifier la condition de fin dans les lignes suivantes - elle est définie sur 10 points par défaut.

 / * Recherchez Win * / if (playerScore.text == '10') alert ('win');  / * Vérifier la fin du jeu * / if (cpuScore.text == '10') alert ('lost'); 

Étape 39: alerte

Cette fonction arrêtera le jeu et affichera une alerte dont le contenu dépend du résultat du jeu..

 alerte de fonction (e) Ticker.removeListener (tkr); stage.onMouseMove = null; bg.onPress = null si (e == 'gagner') win.x = 140; win.y = -90; stage.addChild (victoire); Tween.get (win) .to (y: 115, 300);  else perdre.x = 140; perdre.y = -90; stage.addChild (perdre); Tween.get (perdre) .to (y: 115, 300); 

Étape 40: test

Enregistrez votre travail (si vous ne l'avez pas déjà fait) et ouvrez le fichier HTML dans le navigateur pour que votre jeu fonctionne!


Conclusion

Essayez de modifier les variables du jeu pour créer votre propre version du jeu.!

J'espère que vous avez aimé ce tutoriel, merci d'avoir lu!