Lag et Pong Game i HTML5 med EaselJS

I denne opplæringen lager vi en klone av det klassiske spillet, Pong, i HTML5, ved hjelp av EaselJS-biblioteket. Spillet vil ha flere skjermer, lydeffekter og en (veldig enkel) AI-motstander.

Trinn 1: Kort oversikt

Ved å bruke pre-laget grafikk vil vi kode en underholdende pong spill i HTML5 ved hjelp av EaselJS-biblioteket, som gir et Flash-lignende grensesnitt for HTML5-lerretet. For en introduksjon til EaselJS, se denne Activetuts + artikkelen.

Spilleren vil kunne styre en padle ved hjelp av musen og spille mot motoren mot datamaskinen-kontrolleren for å få poeng.


Trinn 2: Grensesnitt

Et enkelt grensesnitt med en neo-futuristisk stil vil bli brukt; Dette innebærer flere former, knapper, bitmaps og mer.

Grafikken som kreves for denne opplæringen finner du i vedlagte nedlastning.


Trinn 3: Få EaselJS

EaselJS biblioteket vil bli brukt til å bygge vårt spill, sørg for at du leser Starter opplæringsprogram hvis du er ny på dette biblioteket.

Du kan laste ned den nyeste versjonen av EaselJS fra sitt offisielle nettsted. Dette kan imidlertid være uforenlig med koden her, så jeg foreslår at du bruker versjonen av biblioteket som følger med kildedownloaden.


Trinn 4: HTML-struktur

La oss forberede vårt HTML-dokument. Vi starter med det aller grunnleggende, bare en barebones disposisjon:

    pong    

Trinn 5: Skjul mobil høydepunkt

Vi må legge til litt CSS også, for å fjerne standard høydepunktet som brukes når du klikker på et element i en mobil nettleser. Uten dette vil mobilopplevelsen reduseres drastisk.

    pong     

Trinn 6: Javascript-biblioteker

Følgende kode legger til nødvendige javascript-biblioteker for at appen vår skal kunne fungere.

    pong         /

I tillegg til EaselJS bruker vi også TweenJS (for håndtering av skjermoverganger og spillsløyfen) og SoundJS (for lydeffekter).

Main.js er filen vi skal bruke for å holde vår egen JS-kode.


Trinn 7: Ring hovedfunksjon

I de neste linjene kaller vi vår Hoved() funksjon. Dette er funksjonen som vil starte applikasjonen vår; Det vil bli opprettet senere i opplæringen, inne Main.js.

    pong         

Trinn 8: Lerretikett

Et HTML5 lerret er opprettet i denne linjen; Vi tildeler den en ID slik at vi kan referere den senere og også sette bredden og høyden.

    pong          

Trinn 9: Opprett Main.js

La oss starte vår spillopprettelse!

Åpne din foretrukne JavaScript-editor (noen tekstredigerer vil fungere, men du vil ikke ha syntaxutheving) og forberede deg på å skrive koden. Husk å lagre filen som Main.js i prosjektmappen din.


Trinn 10: Definer lærred

Vi starter med å definere alle grafiske og logiske variabler.

De neste variablene representerer HTML-lerretelementet og scenen som vil bli knyttet til den. De scene variabel vil oppføre seg på samme måte som AS3-scenen.

 / * Definer lærred * / var lerret; var scenen;

Trinn 11: Bakgrunn

Denne variabelen lagrer tittelbakgrunnsbildet.

 / * Bakgrunn * / var bgImg = nytt bilde (); var bg;

Trinn 12: Tittelvisning

Dette er tittelvisningen, den første interaktive skjermen som skal vises i vårt spill. Disse variablene lagrer komponentene sine.

 / * Tittelvisning * / var mainImg = nytt bilde (); var hoved; var startBImg = nytt bilde (); var startB; var creditsBImg = nytt bilde (); var creditsB; var TitleView = ny Container ();

Trinn 13: Kreditter

Denne visningen vil vise kreditter, år og opphavsrett til spillet, disse variablene vil bli brukt til å lagre det.

 / * Kreditter * / var creditsViewImg = nytt bilde (); var kreditter;

Trinn 14: Spillvisning

De neste variablene lagrer den enkelte grafikken som vises i spillvisningen:

 / * Spillvisning * / var playerImg = nytt bilde (); var spiller; var ballImg = nytt bilde (); var ball; var cpuImg = nytt bilde (); var cpu; var winImg = nytt bilde (); var vinne; var loseImg = nytt bilde (); var miste;

Trinn 15: Score

Poengverdiene vil bli håndtert av de neste variablene:

 / * Score * / var playerScore; var cpuScore;

Trinn 16: Variabler

Dette er variablene vi skal bruke, les kommentarene i koden for å forstå hva de er for:

 var xSpeed ​​= 5; // Horisontal fart på ballen var ySpeed ​​= 5; // Vertikal hastighet på ballen var gfxLoaded = 0; // brukes som en forhåndslaster, teller de allerede lastede elementene var tkr = nytt objekt; // brukt som en hendelse lytter til Ticker

Trinn 17: Lag lydeffekter

Vi bruker lydeffekter for å forbedre følelsen av spillet. Lyder i dette eksemplet ble opprettet ved hjelp av det utmerkede gratis verktøyet as3sfxr og konvertert til MP3 ved hjelp av Audacity.

Lydene som kreves kan alle bli funnet i kildedownloaden. Hvis du vil lage din egen, trenger du fire:

  • hit.mp3: Spilt når ballen treffer en padle
  • playerScore.mp3: Spilt når de spiller scorer
  • enemyScore.mp3: spilte når fienden scorer
  • wall.mp3: Spilt når ballen treffer topp- eller bunngrensen

Trinn 18: Hovedfunksjon

De Hoved() funksjonen vil være den første som skal utføres når nettsiden er lastet, fordi den er referert til i på Last attributten til HTML-dokumentet (se trinn 7).

Det vil ringe de nødvendige funksjonene for å starte spillet.

 funksjon Hoved () // kode ...

Trinn 19: Link Lerret

Denne koden får HTML-lerret-IDen og kobler den til klassen EaselJS Stage. Dette gjør at scenevarianten oppfører seg som sceneklassen i AS3. Legg til dette til Hoved().

 / * Link Canvas * / canvas = document.getElementById ('Pong'); scene = nytt scenen (lerret);

Trinn 20: Aktiver Mus Hendelser

Mushendelser er deaktivert som standard i EaselJS for å forbedre ytelsen. Siden vi trenger de i spillet, legger vi til følgende linje. Legg til dette til Hoved().

 stage.mouseEventsEnabled = true;

Trinn 21: Last inn lyder

Vi bruker SoundJS for å legge til lyder i spillet vårt; skriv følgende kode for å importere lydene vi skal bruke. Legg til dette til Hoved().

 / * Lyd * / SoundJS.addBatch ([navn: 'hit', src: 'hit.mp3', forekomster: 1, navn: 'playerScore', src: 'playerScore.mp3', forekomster: 1 name: 'enemyScore', src: 'enemyScore.mp3', forekomster: 1, navn: 'vegg', src: 'wall.mp3', forekomster: 1]);

Trinn 22: Last inn grafikk

Denne koden brukes til å forhåndsinstallere grafikken, ved hjelp av en funksjon som vi skal skrive senere. Den setter bildobjektene vi opprettet før, for å peke på de relevante kilde-PNG-filene i dokumentmappen vår.

Et navn er gitt til hver, slik at vi kan oppdage hvilket bilde som lastes inn senere, og endelig fungerer funksjonen som håndterer de lastede bildene..

Legg til dette til Hoved().

 / * Legg inn 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; loseImg.src = 'lose.png'; loseImg.name = 'lose'; loseImg.onload = loadGfx;

Trinn 23: Sett Ticker

Ticker-klassen gir en sentral tikk eller hjerteslag kringkastet med et angitt intervall. Dette kan brukes til å utløse spillsløyfen.

Følgende kode angir bildefrekvensen til 30 og definerer scenen som lytteren til flåttene.

TweenJS-klassen vil lytte til dette krysset for å utføre animasjonene. Legg til dette til Hoved().

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

Trinn 24: Preload-funksjon

Hver gang en grafikk er lastet, kjører denne funksjonen. Det vil tildele hvert bilde til en bitmap-objekt og kontrollere at alle elementene lastes inn før du fortsetter.

 funksjon loadGfx (e) if (e.target.name = 'bg') bg = ny Bitmap (bgImg); hvis (e.target.name = 'main') main = ny Bitmap (mainImg); hvis (e.target.name = 'startB') startB = nytt Bitmap (startBImg); hvis (e.target.name = 'creditsB') creditsB = nytt Bitmap (creditsBImg); hvis (e.target. navn = 'kreditter') credits = ny Bitmap (creditsViewImg); hvis (e.target.name = 'player') spiller = ny Bitmap (playerImg); hvis (e.target.name = 'ball') ball = ny Bitmap (ballImg); hvis (e.target.name = 'cpu') cpu = ny Bitmap (cpuImg); hvis (e.target.name = 'win') win = new Bitmap winImg); hvis (e.target.name = 'lose') lose = new Bitmap (loseImg); gfxLoaded ++; hvis (gfxLoaded == 10) // husk å endre dette hvis du legger til flere bilder addTitleView (); 

Trinn 25: Legg til tittelvisning

Når alle grafikkene er lastet, blir tittelvisningen lagt til scenen ved hjelp av følgende funksjon:

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

Trinn 26: Startknappslyttere

Denne funksjonen legger til de nødvendige lytterne til TitleView knapper (det er en del av addTitleView ()):

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

Trinn 27: Vis kreditt

De studiepoeng skjermen vises når brukeren klikker på kredittknappen; En muselytter er lagt til hele bildet for å fjerne det.

 funksjon showCredits () // Vis Credits credits.x = 480; stage.addChild (sp); stage.update (); Tween.get (kreditter) .to (x: 0, 300); credits.onPress = hideCredits; 

Trinn 28: Skjul kreditt

Når studiepoeng skjermen er klikket den vil bli tweened tilbake og fjernet fra scenen.

 // Skjul Credits funksjon hideCredits (e) Tween.get (credits) .to (x: 480, 300) .call (rmvCredits);  // Fjern Credits-funksjonen rmvCredits () stage.removeChild (credits); 

La oss stoppe her for å teste hva vi har gjort hittil. Klikk her for en milepæl demo.

Husk at noen linjer har blitt kommentert da noen funksjoner ikke er opprettet ennå.

Husk at milepælen er inkludert i kildefilene, så hvis filmen din av en eller annen grunn ikke etterligner denne, sammenlign din kilde til min for å se hva som kan forårsake det.


Trinn 29: Vis spillvisning

Følgende linjer fjerner TitleView fra scenen og legger til GameView elementer til scenen. En muselytter legges til bakgrunnen for å starte spillet når det klikkes.

 funksjon addGameView () // Destroy Menu & Credits skjerm scene.removeChild (TitleView); TitleView = null; kreditter = null; // Legg til spillvisning 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', 'bold 20px Arial', '# A3FF24'); playerScore.maxWidth = 1000; // fikse for Chrome 17 playerScore.x = 211; playerScore.y = 20; cpuScore = ny tekst ('0', 'fet 20px Arial', '# A3FF24'); cpuScore.maxWidth = 1000; // fikse for Chrome 17 cpuScore.x = 262; cpuScore.y = 20; stage.addChild (playerScore, cpuScore, spiller, cpu, ball); stage.update (); // Start Listener bg.onPress = startGame; 

Trinn 30: Spillerbevegelse

Spilleren vil bevege seg sammen med musens vertikale posisjon:

 funksjon movePaddle (e) // Mouse Movement player.y = e.stageY; 

Trinn 31: Start spillet

Denne koden kjøres når spilleren klikker spillbakgrunnen, den legger til muselytteren som utløser funksjonen i forrige trinn, og legger til en ticker for å kontrollere spillsløyfen.

Vær oppmerksom på måten ticker er opprettet på: Det er ekvivalent med en Timer-hendelse i AS3.

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

Trinn 32: Tilbakestill

Når et poeng er scoret (av spilleren eller datamaskinen), vil padlene og ballen returnere til sine opprinnelige posisjoner og spillet vil bli satt på pause:

 funksjon reset () ball.x = 240 - 15; ball.y = 160-15; player.y = 160 - 37.5; cpu.y = 160 - 37,5; stage.onMouseMove = null; // slutte å lytte til musen Ticker.removeListener (tkr); // pause spillet bg.onPress = startGame; 

Trinn 33: Ballbevegelse

Hvis spillet ikke er stoppet, vil ballen flyttes hver ramme ved hjelp av variablene vi opprettet før.

 funksjon oppdatering () // Ball bevegelse ball.x = ball.x + xSpeed; ball.y = ball.y + ySpeed;

Trinn 34: CPU-bevegelse

Denne koden styrer datamaskinens bevegelse; padleen er flyttet på en måte at den vil følge ballen mens den fortsatt har noen feilmargin.

 if (cpu.y < ball.y)  cpu.y = cpu.y + 2.5;  else if(cpu.y > ball.y) cpu.y = cpu.y - 2.5; 

Trinn 35: Veggkollisjoner

Her kontrollerer vi om ballen er på toppen eller bunnen av lerretet; I så fall reverseres den vertikale hastigheten og en lyd spilles.

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

Trinn 36: Scores

Nå venstre og høyre side. Denne koden endrer også poengsummen, kaller tilbakestillingsfunksjonen og spiller en annen lyd avhengig av hvilken side ballen berørte.

 / * CPU Score * / hvis ((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); tilbakestille(); SoundJS.play ( 'playerScore'); 

Trinn 37: Ball-Paddle Kollisjoner

Følgende kode kontrollerer om ballen kolliderer med en padle, ved å sammenligne padleposisjonen til ballens koordinater. Hvis grenseboksene til de to skjærer, er det en kollisjon, så vi reverserer kulehastigheten og spiller en lyd.

 / * Cpu kollisjon * / hvis (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'); 

Trinn 38: Sjekk for Win / Game Over

Du kan endre sluttvilkårene i de neste linjene - den er satt til 10 poeng som standard.

 / * Check for Win * / if (playerScore.text == '10') alert ('win');  / * Sjekk for spill over * / hvis (cpuScore.text == '10') alert ('lose'); 

Trinn 39: Alert

Denne funksjonen stopper spillet og viser et varsel, hvis innhold er avhengig av spillresultatet.

 funksjonalarm (e) Ticker.removeListener (tkr); stage.onMouseMove = null; bg.onPress = null hvis (e == 'win') win.x = 140; win.y = -90; stage.addChild (Win); Tween.get (seier) .to (y: 115, 300);  ellers lose.x = 140; lose.y = -90; stage.addChild (tape); Tween.get (tap) .to (y: 115, 300); 

Trinn 40: Test

Lagre arbeidet ditt (hvis du ikke har det) og åpne HTML-filen i nettleseren for å se spillet ditt!


Konklusjon

Prøv å endre spillets variabler for å lage din egen versjon av spillet!

Jeg håper du likte denne opplæringen, takk for å lese!