Créez un jeu de tir spatial simple en HTML5 avec EaselJS

L'année dernière, je vous ai montré comment créer un jeu de tir avec Flash et AS3. Avec la popularité croissante de HTML5 (et ses capacités), voyons comment faire de même avec HTML5, JavaScript et EaselJS..


Aperçu du résultat final

Jetons un coup d'œil au résultat final sur lequel nous allons travailler:


Cliquez pour jouer à la démo.


Étape 1: bref aperçu

En utilisant des sprites prédéfinis, nous coderons un jeu divertissant Tireur de l'espace jeu en HTML5 avec la librairie EaselJS.

Le joueur sera capable de contrôler un vaisseau spatial et de tirer plusieurs ennemis tout en voyageant dans l'espace.


Étape 2: interface

Une interface simple et futuriste sera utilisée, elle implique des bitmaps et plus. J'ai utilisé une excellente bibliothèque de sprites dans la démonstration de ce tutoriel, ils font partie du logiciel gratuit Sinistar Clone Graphics.

Les ressources d’interface requises pour 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 EaselJS depuis son site officiel.


Étape 4: Structure HTML

Préparons notre document HTML, c'est une structure HTML simple pour commencer à écrire notre application. Enregistrer ceci sous Shooter.html.

    Tireur    

Étape 5: Masquer Mobile Hightlight

Ajoutons aussi un peu de CSS, cette ligne supprimera la surbrillance par défaut lorsque vous appuyez sur un élément à l'aide d'un navigateur mobile; sans cela, l'expérience mobile diminuerait considérablement.

    Tireur     

Étape 6: Bibliothèques JavaScript

Le code suivant ajoute les bibliothèques JavaScript nécessaires pour que notre application fonctionne..

    Tireur         

Main.js est le fichier que nous allons utiliser pour stocker toutes nos propres fonctions pour le jeu. Créez-le maintenant et enregistrez-le dans le même dossier que Shooter.html. Vous devrez également télécharger les bibliothèques EaselJS répertoriées..


Étape 7: appelez la fonction principale

Dans les lignes suivantes, nous appelons notre fonction principale; c'est la fonction qui va démarrer notre application, elle sera créée plus tard dans notre code JavaScript.

    Tireur         

Étape 8: Élément de toile

Le canevas est ajouté dans cette ligne. Nous assignons un identifiant pour le référencer plus tard et aussi pour définir sa largeur et sa hauteur..

    Tireur          

Étape 9: Démarrer le JavaScript

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 en surbrillance) et préparez-vous à écrire votre superbe jeu. Ouvrez le Main.js fichier que vous avez créé précédemment.


É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 manière similaire à la scène dans un projet Flash AS3.)

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

Étape 11: Contexte

Les variables suivantes stockent les images d'arrière-plan. Deux images en mosaïque sont utilisées pour créer un arrière-plan défilant à l'infini.

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

Étape 12: expédier

C'est le vaisseau qui sera utilisé comme personnage ou héros.

 / * Ship * / var sImg = new Image (); navire var;

Étape 13: Ennemi

Plusieurs ennemis seront sur la scène; ils l'utiliseront comme graphique source.

 / * Enemy * / var eImg = new Image ();

Étape 14: Patron

Un boss sera présent dans le jeu, plus gros et avec plus de santé que les autres ennemis. Ces variables sont utilisées pour l'instancier.

 / * Boss * / var bImg = new Image (); patron de var;

Étape 15: Des vies

L'icône "vie". Trois vies sont données au début et vous en perdez une lorsque vous êtes frappé par un ennemi.

 / * Lives * / var lImg = new Image ();

Étape 16: balles

C'est ton arme: tire des balles sur les ennemis pour les tuer. Cette variable stocke l'image source.

 / * Bullets * / var bltImg = new Image ();

Étape 17: Graphiques d'alerte

Deux alertes sont utilisées dans le jeu, une pour savoir quand vous gagnez et une pour quand vous perdez. Nous verrons plus tard comment déterminer une victoire ou une défaite dans ce tutoriel..

 / * Alerte * / var winImg = new Image (); var perdImg = new Image (); var gagner; var perdre;

Étape 16: Variables

Ce sont les variables que nous allons utiliser, lisez les commentaires dans le code pour en savoir plus à leur sujet. Certains de leurs noms sont explicites et n'ont donc aucun commentaire.

 var vies = new Container (); // stocke les vies gfx var bullets = new Container (); // stocke les balles gfx var ennemis = new Container (); // stocke les ennemis gfx var bossHealth = 20; score var; var gfxLoaded = 0; // utilisé en tant que préchargeur, compte les éléments déjà chargés var centerX = 160; var centerY = 240; var tkr = new Object (); // utilisé comme écouteur de ticker var timerSource; // référence une méthode setInterval

Étape 17: Sons

Nous utiliserons des effets sonores pour améliorer le ressenti du jeu. Vous pouvez trouver les sons utilisés dans cet exemple sur Soungle.com en utilisant les mots-clés. espace, explosion et laser.


É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 appelle les fonctions nécessaires pour démarrer le jeu. Nous allons créer ces fonctions dans les prochaines étapes - tout de l’étape 19 à l’étape 23 devrait entrer dans cette fonction.

 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.

 / * Link Canvas * / canvas = document.getElementById ('Tireur'); 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; comme nous avons besoin de ceux du jeu, nous ajoutons la ligne suivante.

 stage.mouseEventsEnabled = true;

Étape 21: Charger les sons

Nous utiliserons SoundJS pour ajouter des sons à notre jeu. SoundJS addBatch La méthode utilise un tableau de trois paramètres pour chaque appel:

  • prénom: Le nom de l'instance que vous voulez donner au son - ceci sera utilisé pour jouer le son plus tard.
  • src: L'URL du fichier son.
  • les instances: Le nombre d'instances pouvant être lues en même temps.
 / * Son * / SoundJS.addBatch ([nom: 'boss', src: 'boss.mp3', instances: 1, nom: 'exploité', src: 'explo.mp3', instances: 10, nom: 'shot', src: 'shot.mp3', instances: 10]);

É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 pointe chaque objet Image que nous avons créé précédemment vers le fichier source PNG dans notre dossier de documents. Un nom est attribué pour détecter quelle image est chargée et, enfin, la fonction qui gère les images chargées est appelée.

 / * Charge GFX * / bgImg.src = 'bg.png'; bgImg.name = 'bg'; bgImg.onload = loadGfx; bg2Img.src = 'bg2.png'; bg2Img.name = 'bg2'; bg2Img.onload = loadGfx; sImg.src = 'ship.png'; sImg.name = 'ship'; sImg.onload = loadGfx; eImg.src = 'ennemi1.png'; eImg.name = 'ennemi'; eImg.onload = loadGfx; bImg.src = 'boss.png'; bImg.name = 'boss'; bImg.onload = loadGfx; lImg.src = 'live.png'; lImg.name = 'live'; lImg.onload = loadGfx; bltImg.src = 'bullet.png'; bltImg.name = 'bullet'; bltImg.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 un "tick" centralisé, diffusé à un intervalle défini. Nous pouvons utiliser ses cocher() fonction pour exécuter certains codes à une fréquence régulière.

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.

 / * 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 affectera chaque image à un objet bitmap et vérifiera que tous les éléments sont chargés avant de procéder à l'appel. addGameView.

 function loadGfx (e) if (e.target.name = 'bg') bg = nouveau bitmap (bgImg); if (e.target.name = 'bg2') bg2 = nouveau bitmap (bg2Img); if (e.target.name = 'ship') ship = new Bitmap (sImg); gfxLoaded ++; if (gfxLoaded == 9) addGameView (); 

Étape 25: Ajouter une vue de jeu

Lorsque tous les graphiques sont chargés, le addGameView la fonction est appelée. Cette fonction ajoutera le vaisseau, le compteur de vies, le score et les arrière-plans à la scène..

 fonction addGameView () ship.x = centerX - 18.5; ship.y = 480 + 34; / * Ajouter des vies * / pour (var i = 0; i < 3; i++)  var l = new Bitmap(lImg); l.x = 248 + (25 * i); l.y = 463; lives.addChild(l); stage.update();  /* Score Text */ score = new Text('0', 'bold 14px Courier New', '#FFFFFF'); score.maxWidth = 1000; //fix for Chrome 17 score.x = 2; score.y = 476; /* Second Background */ bg2.y = -480; /* Add gfx to stage and Tween Ship */ stage.addChild(bg, bg2, ship, enemies, bullets, lives, score); Tween.get(ship).to(y:425, 1000).call(startGame); 

Étape 26: Déplacer le navire

Le vaisseau du joueur sera contrôlé par la souris, et nous utilisons cette fonction pour gérer cela:

 fonction moveShip (e) ship.x = e.stageX - 18.5; 

e.stageX fait référence à la coordonnée x de la souris, et cette fonction est appelée à chaque déplacement de la souris.


Étape 27: Tirez

Notre navire sera capable de tirer des balles pour se détruire et se protéger de ses ennemis. Cette fonction s'exécutera chaque fois que l'utilisateur cliquera sur la scène et placera une balle devant le vaisseau qui sera ensuite déplacée par le mettre à jour() une fonction. Il joue également un son de tir.

 fonction shoot () var b = new Bitmap (bltImg); b.x = ship.x + 13; b.y = ship.y - 20; bullets.addChild (b); stage.update (); SoundJS.play ('shot'); 

Étape 28: Ajouter une fonction ennemie

Ce ne serait pas un tireur sans quelque chose à tirer. Voici un setInterval () est utilisé pour créer un ennemi toutes les 1000 millisecondes (vous pouvez modifier cette valeur à l’étape suivante) qui est ensuite déplacé par le mettre à jour() une fonction.

 fonction addEnemy () var e = new Bitmap (eImg); e.x = Math.floor (Math.random () * (320 - 50)) e.y = -50 ennemis.addChild (e); stage.update (); 

Étape 29: Démarrer le jeu

Ces lignes ajouteront les auditeurs nécessaires à la scène et à la minuterie; cela inclut les événements de souris, les événements chronométrés (via setInterval) et les événements Ticker qui mettront à jour le jeu chaque image.

 fonction startGame () stage.onMouseMove = moveShip; bg.onPress = shoot; bg2.onPress = shoot; Ticker.addListener (tkr, false); tkr.tick = update; timerSource = setInterval ('addEnemy ()', 1000); 

Étape 30: Déplacer l'arrière-plan

L'arrière-plan est déplacé chaque image pour simuler un voyage dans l'espace; lorsque l'image-objet d'arrière-plan inférieure atteint la limite d'étape, elle est déplacée vers le haut, créant une boucle infinie.

 function update () / * Déplacer l'arrière-plan * / bg.y + = 5; bg2.y + = 5; si (bg.y> = 480) bg.y = -480;  sinon si (bg2.y> = 480) bg2.y = -480; 

Étape 31: Déplacez les balles

Les lignes de code suivantes vérifient s’il ya des puces dans l’étape; si c'est le cas, les balles sont déplacées vers le haut.

 / * Déplacer les puces * / pour (var i = 0; i < bullets.children.length; i++)  bullets.children[i].y -= 10; 

Étape 32: Supprimer les balles hors scène

Ajoutons quelques lignes pour détecter la position de la balle et utilisons-la pour détruire une balle lorsqu'elle n'est plus visible..

 / * Déplacer les puces * / pour (var i = 0; i < bullets.children.length; i++)  bullets.children[i].y -= 10; /* Remove Offstage Bullets */ if(bullets.children[i].y < - 20)  bullets.removeChildAt(i);  

Étape 33: Afficher le patron

Nous allons ajouter un grand méchant boss au jeu. Lorsque l'utilisateur atteint un certain score, le patron apparaîtra:

 / * Afficher le boss * / if (parseInt (score.text)> = 500 && boss == null) boss = new Bitmap (bImg); SoundJS.play ('boss'); boss.x = centerX - 90; boss.y = -183; stage.addChild (patron); Tween.get (boss) .to (y: 40, 2000) // interpelle le boss sur l'aire de jeu

Étape 34: Déplacer les ennemis

Les ennemis, comme les balles, sont également déplacés de chaque image. Ce code trouve tous les ennemis dans la scène en utilisant le ennemis conteneur, et les déplace chaque 5px vers le bas.

 / * Move Enemies * / pour (var j = 0; j < enemies.children.length; j++)  enemies.children[j].y += 5;

Étape 35: Éliminer les ennemis hors de la scène

Nous vérifions également les positions des ennemis pour les détruire lorsqu'ils ne sont plus visibles..

 / * Move Enemies * / pour (var j = 0; j < enemies.children.length; j++)  enemies.children[j].y += 5; /* Remove Offstage Enemies */ if(enemies.children[j].y > 480 + 50) ennemis.removeChildAt (j); 

Étape 36: Puce - Collision ennemie

Les balles dans le conteneur sont testées pour la collision avec les ennemis; lorsque cela se produit, les deux sont retirés de la scène, un son est joué et la partition est mise à jour.

 pour (var k = 0; k < bullets.children.length; k++)  /* Bullet - Enemy Collision */ if(bullets.children[k].x >= ennemis.children [j] .x && bullets.children [k] .x + 11 < enemies.children[j].x + 49 && bullets.children[k].y < enemies.children[j].y + 40)  bullets.removeChildAt(k); enemies.removeChildAt(j); stage.update(); SoundJS.play('explo'); score.text = parseFloat(score.text + 50); 

Étape 37: Puce - Collision de boss

Le code suivant gère les collisions de boss, il utilise la même méthode que celle utilisée dans la boucle de collision balle-ennemi. Ici nous utilisons le bossHealth variable pour déterminer quand le boss est vaincu.

 / * Bullet - Collision de boss * / if (boss! = Null && bullets.children [k] .x> = boss.x && bullets.children [k] .x + 11 < boss.x + 183 && bullets.children[k].y < boss.y + 162)  bullets.removeChildAt(k); bossHealth--; stage.update(); SoundJS.play('explo'); score.text = parseInt(score.text + 50);  

Étape 38: Navire - Collision ennemie

Ici, nous vérifions si un ennemi entre en collision avec le navire du joueur; si c'est le cas, un son est joué, une vie est supprimée et le navire est animé.

 / * Navire - collision ennemie * / if (ennemis.hitTest (ship.x, ship.y) || ennemis.hitTest (ship.x + 37, ship.y)) ennemis.removeChildAt (j); vies.removeChildAt (lives.length); ship.y = 480 + 34; Tween.get (navire) .to (y: 425, 500) SoundJS.play ('explo'); 

Étape 39: Vérifier la victoire ou la perte

Le joueur gagne lorsque le boss perd toute sa santé et perd si toutes leurs vies sont perdues. Les lignes suivantes détectent ces situations et appellent une fonction d’alerte en utilisant le paramètre correct..

 / * Vérifier le gain * / if (boss! = Null && bossHealth <= 0)  alert('win');  /* Check for lose */ if(lives.children.length <= 0)  alert('lose');  

Étape 40: alerte

L'alerte affiche les informations du joueur sur le statut de la partie. il est montré quand un événement de jeu est atteint. Il supprime les écouteurs du jeu et affiche le message approprié.

 function alert (e) / * Supprimer les écouteurs * / stage.onMouseMove = null; bg.onPress = null; bg2.onPress = null; Ticker.removeListener (tkr); tkr = null; timerSource = null; / * Afficher le message correct * / if (e == 'win') win = new Bitmap (winImg); win.x = centerX - 64; win.y = centerY - 23; stage.addChild (victoire); stage.removeChild (ennemis, patron);  else lost = new Bitmap (lostImg); perdre.x = centreX - 64; perdre.y = centreY - 23; stage.addChild (perdre); stage.removeChild (ennemis, bateau);  bg.onPress = function () window.location.reload ();; bg2.onPress = function () window.location.reload ();; stage.update (); 

Étape 41: 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 HTML5 fonctionne!


Conclusion

Vous avez appris à créer un jeu Space Shooter avec toutes ses fonctionnalités de base. Essayez de l’étendre en utilisant ce que vous connaissez déjà. Un bon début serait de faire en sorte que les ennemis ou le patron ripostent au joueur.

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