Creați un joc Simple Space Shooter în HTML5 cu EaselJS

Anul trecut, ți-am arătat cum să creezi un joc de tip "shoot-up" cu Flash și AS3. Cu creșterea popularității (și capabilităților) HTML5, să aruncăm o privire asupra modului de a face același lucru cu HTML5, JavaScript și EaselJS.


Rezultatul final al rezultatelor

Să aruncăm o privire asupra rezultatului final pe care îl vom strădui:


Faceți clic pentru a reda demonstrația.


Pasul 1: Prezentare succintă

Folosind sprite pre-fabricate vom codifica o distracție Space Shooter joc în HTML5 utilizând biblioteca EaselJS.

Jucătorul va putea să controleze o navă spațială și să tragă mai mulți dușmani în timp ce călătoresc în spațiu.


Pasul 2: Interfața

O interfață simplă și futuristă va fi utilizată, aceasta implică bitmap-uri și multe altele. Am folosit o mare bibliotecă sprite în demo-ul acestui tutorial, acestea fac parte din grafica gratuită a Clostronului de Clonare.

Resursele de interfață necesare pentru acest tutorial pot fi găsite în descărcarea atașată.


Pasul 3: Obțineți Java

Biblioteca EaselJS va fi utilizată pentru a construi jocul nostru, asigurați-vă că citiți Noțiuni de bază tutorial dacă sunteți nou în această bibliotecă.

Puteți descărca programul EaselJS de pe site-ul său oficial.


Pasul 4: Structura HTML

Să pregătim documentul HTML, este o structură HTML simplă pentru a începe să scriem aplicația noastră. Salvați ca Shooter.html.

    trăgător    

Pasul 5: Ascundeți opțiunea Mobile Hightlight

Să adăugăm și un pic de CSS, această linie va elimina evidența implicită când atingeți un element utilizând un browser mobil; fără aceasta, experiența mobilă ar scădea drastic.

    trăgător     

Pasul 6: Bibliotecile JavaScript

Următorul cod adaugă bibliotecile JavaScript necesare pentru ca aplicația noastră să funcționeze.

    trăgător         

Main.js este fișierul pe care îl vom folosi pentru a stoca toate funcțiile proprii pentru joc. Creați-o acum și salvați-o în același director ca și Shooter.html. De asemenea, va trebui să descărcați bibliotecile EaselJS enumerate.


Pasul 7: Apelați funcția principală

În liniile următoare, numim funcția noastră principală; aceasta este funcția care va începe aplicarea, va fi creată mai târziu în codul nostru JavaScript.

    trăgător         

Pasul 8: Element de panza

Canvasul este adăugat în această linie. Atribuiți un ID pentru ao referi mai târziu și, de asemenea, setați lățimea și înălțimea acestuia.

    trăgător          

Pasul 9: Pornirea JavaScript-ului

Să începem crearea jocului nostru!

Deschideți editorul JavaScript preferat (orice editor de text va funcționa, dar nu veți avea o evidențiere a sintaxei) și vă pregătiți să scrieți jocul minunat. Deschide Main.js fișier creat mai devreme.


Pasul 10: Definiți canvasul

Vom începe prin definirea tuturor variabilelor grafice și logice.

Următoarele variabile reprezintă elementul HTML canvas și stadiul care va fi legat la acesta. (The etapă variabilă se va comporta în mod similar cu etapa într-un proiect AS3 Flash.)

 / * Definiți Canvas * / var canvas; var etapă;

Pasul 11: Contextul

Următoarele variabile stochează imaginile de fundal. Două imagini cu ceramică sunt folosite pentru a crea un fundal infinit de defilare.

 / * Fundal * / var bgImg = Imagine nouă (); var bg; var bg2Img = imagine nouă (); var bg2;

Pasul 12: Nave

Aceasta este nava care va fi utilizată ca personaj de jucător sau erou.

 / * Nava * / var sImg = Imagine nouă (); vapor var;

Pasul 13: Enemy

Multi dușmani vor fi pe scenă; ei vor folosi acest lucru ca graficul sursă.

 / * Enemy * / var eImg = Imagine nouă ();

Pasul 14: Boss

Un sef va fi prezent în joc, mai mare și cu mai multă sănătate decât ceilalți dușmani. Aceste variabile sunt folosite pentru ao instanți.

 / * Boss * / var bImg = Imagine nouă (); var șef;

Pasul 15: Locuiește

Pictograma "viață". Trei vieți sunt date la început, iar tu pierzi unul când ești lovit de un inamic.

 / * Vieți * / var lImg = Imagine nouă ();

Pasul 16: Gloanțe

Aceasta este arma ta: gloanțe de foc la dușmani să-i omoare. Această variabilă stochează imaginea sursă.

 / * Gloanțe * / var bltImg = imagine nouă ();

Pasul 17: Alertă grafică

Două alerte sunt folosite în joc, unul pentru când câștigi și unul pentru când pierzi. Vom vedea cum să determinăm o victorie sau o pierdere mai târziu în acest tutorial.

 / * Alertă * / var winImg = Imagine nouă (); var loseImg = imagine nouă (); var câștiga; var pierde;

Pasul 16: Variabile

Acestea sunt variabilele pe care le vom folosi, citiți comentariile din cod pentru a afla mai multe despre ele. Unele dintre numele lor sunt explicative și nu au nici un comentariu.

 var vie = nou Container (); // stochează viețile gfx var bullets = container nou (); // stochează gloanțele gfx var enemies = new Container (); // stochează dușmanii gfx var bossHealth = 20; var scor; var gfxLoaded = 0; // folosită ca preloader, numără elementele deja încărcate var centerX = 160; var centerY = 240; var tkr = obiect nou (); // folosit ca un Ticker listener var timerSource; // face referire la o metodă setInterval

Pasul 17: Sunete

Vom folosi efecte sonore pentru a spori sentimentul jocului. Puteți găsi sunetele folosite în acest exemplu pe Soungle.com utilizând cuvintele cheie spaţiu, explozie și cu laser.


Pasul 18: Funcția principală

Principal() funcția va fi prima care se execută atunci când pagina web este încărcată, deoarece este menționată în onload atributul documentului HTML (a se vedea Pasul 7).

Se numește funcțiile necesare pentru a începe jocul. Vom crea aceste funcții în pașii următori - totul de la Pasul 19 la Pasul 23 ar trebui să meargă în interiorul acestei funcții.

 funcția principal () // cod ...

Pasul 19: Link Canvas

Acest cod primește ID-ul canalului HTML și îl leagă de clasa EaselJS Stage. Aceasta va face ca variabila de scena sa se comporte ca si clasa de scena in AS3.

 / * Canvas Link * / canvas = document.getElementById ("Shooter"); etapa = etapa nouă (panza);

Pasul 20: Activați evenimentele mouse-ului

Evenimentele mouse-ului sunt dezactivate implicit în programul EaselJS pentru a îmbunătăți performanța; deoarece avem nevoie de cei din joc, adăugăm următoarea linie.

 stage.mouseEventsEnabled = true;

Pasul 21: Încărcați sunete

Vom folosi SoundJS pentru a adăuga sunete la jocul nostru. SoundJS lui addBatch metoda folosește o serie de trei parametri pentru fiecare apel:

  • Nume: Numele instanței pe care doriți ca sunetul să îl aibă - acesta va fi folosit pentru a reda sunetul mai târziu.
  • src: Adresa URL a fișierului de sunet.
  • instanțe: Numărul de instanțe care pot fi redate în același timp.
 / * Sound * / SoundJS.addBatch ([nume: 'boss', src: 'boss.mp3', instanțe: 1, name: 'explo', src: 'explo.mp3' name: 'shot', src: 'shot.mp3', instanțe: 10]);

Pasul 22: Încărcați grafica

Acest cod este folosit pentru a preîncărca grafica cu ajutorul unei funcții pe care o vom scrie ulterior. Ea indică fiecare obiect Imagine pe care l-am creat anterior în fișierul PNG sursă în dosarul nostru de documente. Se dă un nume pentru a detecta ce imagine este încărcată și, în fine, este apelată funcția care gestionează imaginile încărcate.

 / * Încărcați 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 = 'navă'; sImg.onload = loadGfx; eImg.src = 'enemy1.png'; eImg.name = "inamic"; eImg.onload = loadGfx; bImg.src = 'boss.png'; bImg.name = 'șef'; 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 = 'câștiga'; winImg.onload = loadGfx; pierImg.src = 'pier.png'; loseImg.name = 'pierde'; loseImg.onload = loadGfx;

Pasul 23: Setați Ticker

Clasa Ticker oferă o "bifă" centralizată, difuzată la un interval de timp stabilit. Putem folosi tick () funcția de a rula anumite coduri la o frecvență obișnuită.

Următorul cod stabilește rata cadrelor la 30 și definește etapa ca ascultător pentru căpușe.

Clasa TweenJS va asculta această bifă pentru a realiza animațiile.

 / * Ticker * / Ticker.setFPS (30); Ticker.addListener (etapa);

Pasul 24: Funcția de preîncărcare

De fiecare dată când este încărcat un grafic, această funcție va funcționa. Acesta va atribui fiecare imagine unui obiect bitmap și va verifica dacă toate elementele sunt încărcate înainte de a continua apelul addGameView.

 funcția loadGfx (e) if (e.target.name = 'bg') bg = Bitmap nou (bgImg); dacă (e.target.name = 'bg2') bg2 = Bitmap nou (bg2Img) dacă (e.target.name = 'navă') ship = Bitmap nou (sImg); gfxLoaded ++; dacă (gfxLoaded == 9) addGameView (); 

Pasul 25: Adăugați vizualizarea jocului

Când sunt încărcate toate graficele addGameView se numește funcția. Această funcție va adăuga nava, trăiește contra, scor și fundaluri pe scenă.

 funcția addGameView () ship.x = centerX - 18.5; ship.y = 480 + 34; / * Adauga Lives * / pentru (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); 

Pasul 26: Deplasați nava

Nava jucătorului va fi controlată de mouse și vom folosi această funcție pentru a face față:

 funcția moveShip (e) ship.x = e.stageX - 18.5; 

e.stageX se referă la coordonatele x ale mouse-ului și această funcție este apelată ori de câte ori mouse-ul sa mutat.


Pasul 27: Trageți

Nava noastră va fi capabilă să tragă gloanțe pentru a distruge și a se proteja de dușmani. Această funcție va funcționa de fiecare dată când utilizatorul face clic pe scenă și va plasa un glonț în fața navei, care va fi ulterior mutat de către Actualizați() funcţie. De asemenea, redă un sunet de fotografiere.

 funcția shoot () var b = Bitmap nou (bltImg); b.x = navăx + 13; b.y = navă - 20; bullets.addChild (b); stage.update (); SoundJS.play ( 'shot'); 

Pasul 28: Adăugați funcția de inamic

Nu ar fi un shooter fără ceva de filmat. Aici, a setInterval () este folosit pentru a crea un inamic la fiecare 1000 de milisecunde (puteți schimba această valoare în pasul următor) care este mai târziu mutat de către Actualizați() funcţie.

 funcția addEnemy () var e = Bitmap nou (eImg); e.x = Math.floor (Math.random () * (320 - 50)) e.y = -50 inamici.addChild (e); stage.update (); 

Pasul 29: Începeți jocul

Aceste linii vor adăuga ascultătorii necesari la scenă și cronometru; acest lucru include evenimentele mouse-ului, evenimentele temporizate (prin setInterval) și Evenimente Ticker care vor actualiza jocul în fiecare cadru.

 funcția startGame () stage.onMouseMove = moveShip; bg.onPress = trage; bg2.onPress = trage; Ticker.addListener (tkr, fals); tkr.tick = actualizare; timerSource = setInterval ('addEnemy ()', 1000); 

Pasul 30: mutați fundalul

Fundalul este mutat la fiecare cadru pentru a simula călătoria spațiului; când sprite de fond inferior atinge limita de etapă, este mutat înapoi la început, creând o buclă infinită.

 actualizare funcție () / * mutați fundal * / bg.y + = 5; bg2.y + = 5; dacă (bg.y> = 480) bg.y = -480;  altfel dacă (bg2.y> = 480) bg2.y = -480; 

Pasul 31: mutați gloanțele

Următoarele linii de cod verifică dacă există gloanțe în stadiu; dacă este așa, gloanțele sunt deplasate în sus.

 / * Mutați gloanțe * / pentru (var i = 0; i < bullets.children.length; i++)  bullets.children[i].y -= 10; 

Pasul 32: Îndepărtați gloanțele din culise

Să adăugăm câteva linii pentru a detecta poziția bulletului și să folosim acest lucru pentru a distruge un glonț când nu mai este vizibil.

 / * Mutați gloanțe * / pentru (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);  

Pasul 33: Arată Șeful

Vom adăuga un mare sef rău la joc. Când utilizatorul atinge un anumit punctaj, șeful va apărea:

 / * Afișați seful * / dacă (parseInt (score.text)> = 500 && boss == null) boss = Bitmap nou (bImg); SoundJS.play ( 'boss'); boss.x = centerX - 90; boss.y = -183; stage.addChild (sef); Tween.get (seful) .to (y: 40, 2000) // adăugați șeful pe zona de redare

Pasul 34: Deplasați dușmanii

Dușmanii, ca și gloanțele, se mișcă, de asemenea, pe fiecare cadru. Acest cod găsește toți inamicii din stadiu folosind inamici container și le mută fiecare câte 5px în jos.

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

Pasul 35: Îndepărtați dușmanii în afara etapei

De asemenea, verificăm pozițiile dușmanilor pentru a le distruge atunci când nu mai sunt vizibile.

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

Pasul 36: Coliziunea bulletului - inamicului

Gloanțele din container sunt testate pentru coliziune cu dușmanii; când se întâmplă acest lucru, ambele sunt scoase din scenă, se aude un sunet și scorul este actualizat.

 pentru (var k = 0; k < bullets.children.length; k++)  /* Bullet - Enemy Collision */ if(bullets.children[k].x >= copii inamici [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); 

Pasul 37: Coliziunea bullet-boss

Următorul cod se ocupă de ciocnirile sefului, utilizează aceeași metodă folosită în buclă de coliziune a dușmanului. Aici folosim bossHealth variabilă pentru a determina când șeful este învins.

 / * Bullet - Boss Collision * / dacă (șeful! = 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);  

Pasul 38: Coliziunea navei - inamice

Aici verificăm dacă un dușman se ciocnește cu nava jucătorului; dacă se întâmplă, se aude un sunet, se elimină o viață și nava este animată.

 / * Nava - Coliziunea inamicii * / if (enemies.hitTest (ship.x, ship.y) || enemies.hitTest (nav.x + 37, ship.y)) enemies.removeChildAt (j); lives.removeChildAt (lives.length); ship.y = 480 + 34; Tween.get (navă) .to (y: 425, 500) SoundJS.play ('explo'); 

Pasul 39: Verificați dacă ați câștigat sau ați pierdut

Jucătorul câștigă atunci când șeful își pierde toată sănătatea și pierde dacă pierd toate viețile proprii. Următoarele linii detectează acele situații și apelează o funcție de alertă utilizând parametrul corect.

 / * Verificați pentru câștig * / dacă (șeful! = Null && bossHealth <= 0)  alert('win');  /* Check for lose */ if(lives.children.length <= 0)  alert('lose');  

Pasul 40: Alertă

Alerta afișează informațiile jucătorului despre starea jocului; este afișat când se ajunge la un eveniment de joc. Elimină ascultătorii jocului și afișează mesajul corespunzător.

 funcția de alertă (e) / * Remove Listeners * / stage.onMouseMove = null; bg.onPress = null; bg2.onPress = null; Ticker.removeListener (TKR); tkr = null; timerSource = null; / * Afișarea mesajului corect * / if (e == 'win') win = Bitmap nou (winImg); win.x = centerX - 64; win.y = centerY - 23; stage.addChild (câștig); stage.removeChild (inamici, sef);  altceva lose = Bitmap nou (loseImg); lose.x = centerX - 64; pier.y = centerY - 23; stage.addChild (pierd); stage.removeChild (dușmani, nave);  bg.onPress = funcția () window.location.reload ();; bg2.onPress = funcția () window.location.reload ();; stage.update (); 

Pasul 41: Testați



Salvați-vă munca (dacă nu ați făcut-o) și deschideți fișierul HTML din browser pentru a vedea că jocul dvs. HTML5 funcționează!


Concluzie

Ați învățat cum să creați un joc Shooter spațial cu toate caracteristicile sale de bază, încercați să îl extindeți folosind ceea ce deja știți. Un început bun ar fi ca inamicii sau șeful să tragă înapoi la jucător.

Sper că ți-a plăcut acest tutorial, mulțumesc pentru lectură!