Crea un gioco Pong in HTML5 con EaselJS

In questo tutorial creeremo un clone del gioco classico, Pong, in HTML5, usando la libreria EaselJS. Il gioco avrà più schermi, effetti sonori e un (molto semplice) avversario IA.

Passaggio 1: breve panoramica

Usando la grafica pre-creata codificheremo un divertente pong gioco in HTML5 usando la libreria EaselJS, che fornisce un'interfaccia simile a Flash per il canvas HTML5. Per un'introduzione a EaselJS, consulta questo articolo di Activetuts +.

Il giocatore sarà in grado di controllare una pagaia usando il mouse e giocare contro l'avversario del controllore del computer per ottenere punti.


Passaggio 2: interfaccia

Verrà utilizzata una semplice interfaccia con uno stile neo-futuristico; questo comporta più forme, pulsanti, bitmap e altro ancora.

La grafica richiesta per questo tutorial è disponibile nel download allegato.


Passaggio 3: Ottieni EaselJS

La libreria EaselJS verrà utilizzata per costruire il nostro gioco, assicurati di leggere il Iniziare tutorial se sei nuovo in questa libreria.

Puoi scaricare l'ultima versione di EaselJS dal suo sito ufficiale. Tuttavia, questo potrebbe essere incompatibile con il codice qui, quindi suggerisco di usare la versione della libreria che è inclusa nel download del codice sorgente.


Passaggio 4: struttura HTML

Prepariamo il nostro documento HTML. Inizieremo con le nozioni di base, solo uno schema essenziale:

    pong    

Passaggio 5: Nascondi evidenziazione mobile

Dobbiamo aggiungere anche un po 'di CSS, per rimuovere l'evidenziazione predefinita che viene applicata quando si tocca un elemento in un browser mobile. Senza questo, l'esperienza mobile diminuirebbe drasticamente.

    pong     

Passaggio 6: librerie Javascript

Il codice seguente aggiunge le librerie javascript necessarie affinché la nostra app funzioni.

    pong         /

Oltre a EaselJS, utilizzeremo anche TweenJS (per gestire le transizioni dello schermo e il loop di gioco) e SoundJS (per gli effetti sonori).

main.js è il file che useremo per contenere il nostro codice JS.


Passaggio 7: chiama la funzione principale

Nelle linee successive chiamiamo il nostro Principale() funzione. Questa è la funzione che avvierà la nostra applicazione; verrà creato in seguito nel tutorial, all'interno main.js.

    pong         

Step 8: Tag Canvas

Una tela HTML5 viene creata in questa linea; assegniamo un ID in modo che possiamo fare riferimento in seguito e impostare anche la sua larghezza e altezza.

    pong          

Passaggio 9: crea Main.js

Iniziamo la nostra creazione del gioco!

Apri il tuo editor JavaScript preferito (qualsiasi editor di testo funzionerà, ma non avrai l'evidenziazione della sintassi) e preparati a scrivere il codice. Ricordarsi di salvare il file come main.js nella cartella del tuo progetto.


Passaggio 10: Definisci tela

Inizieremo definendo tutte le variabili grafiche e logiche.

Le successive variabili rappresentano l'elemento canvas HTML e lo stage che sarà collegato ad esso. Il palcoscenico la variabile si comporterà in modo simile allo stadio AS3.

 / * Definisci canvas * / var canvas; palco var;

Passaggio 11: sfondo

Questa variabile memorizza l'immagine di sfondo del titolo.

 / * Sfondo * / var bgImg = nuova immagine (); var bg;

Passaggio 12: Vista titolo

Questa è la Vista Titolo, la prima schermata interattiva a comparire nel nostro gioco. Queste variabili memorizzano i suoi componenti.

 / * Vista titolo * / var mainImg = nuova immagine (); var principale; var startBImg = new Image (); var startB; var creditsBImg = new Image (); var creditsB; var TitleView = new Container ();

Passaggio 13: crediti

Questa vista mostrerà i crediti, l'anno e il copyright del gioco, queste variabili saranno utilizzate per memorizzarlo.

 / * Credits * / var creditsViewImg = new Image (); var credits;

Step 14: Game View

Le prossime variabili memorizzano le singole immagini che appaiono nella vista di gioco:

 / * Vista di gioco * / var playerImg = new Image (); giocatore di var; var ballImg = new Image (); palla var; var cpuImg = new Image (); var cpu; var winImg = new Image (); var vince; var loseImg = new Image (); var perdere;

Step 15: Punteggio

I valori del punteggio saranno gestiti dalle seguenti variabili:

 / * Punteggio * / var playerScore; var cpuScore;

Passaggio 16: variabili

Queste sono le variabili che useremo, leggere i commenti nel codice per capire a cosa servono:

 var xSpeed ​​= 5; // Velocità orizzontale della palla var ySpeed ​​= 5; // Velocità verticale della palla var gfxLoaded = 0; // usato come preloader, conta gli elementi già caricati var tkr = new Object; // usato come listener di eventi per il Ticker

Passaggio 17: Crea effetti sonori

Useremo effetti sonori per migliorare la sensazione del gioco. I suoni in questo esempio sono stati creati usando l'eccellente strumento gratuito as3sfxr e convertito in MP3 usando Audacity.

I suoni richiesti possono essere trovati nel download sorgente. Se vuoi crearne uno, avrai bisogno di quattro:

  • hit.mp3: giocato quando la palla colpisce una pagaia
  • playerScore.mp3: giocato quando il giocatore segna
  • enemyScore.mp3: giocato quando il nemico segna
  • wall.mp3: giocato quando la palla colpisce il limite superiore o inferiore

Passaggio 18: Funzione principale

Il Principale() la funzione sarà la prima ad essere eseguita quando la pagina web viene caricata, perché viene indicata nel file onload attributo del documento HTML (vedi passaggio 7).

Chiamerà le funzioni necessarie per iniziare il gioco.

 function Main () // code ...

Passo 19: Link Canvas

Questo codice ottiene l'ID canvas HTML e lo collega alla classe Stage di EaselJS. Questo farà sì che la variabile stage si comporti come la stage class di AS3. Aggiungi questo a Principale().

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

Passaggio 20: abilita gli eventi del mouse

Gli eventi del mouse sono disabilitati per impostazione predefinita in EaselJS per migliorare le prestazioni. Dal momento che abbiamo bisogno di quelli nel gioco, aggiungiamo la seguente riga. Aggiungi questo a Principale().

 stage.mouseEventsEnabled = true;

Passaggio 21: carica i suoni

Useremo SoundJS per aggiungere suoni al nostro gioco; scrivi il seguente codice per importare i suoni che useremo. Aggiungi questo a Principale().

 / * Sound * / SoundJS.addBatch ([name: 'hit', src: 'hit.mp3', istanze: 1, nome: 'playerScore', src: 'playerScore.mp3', istanze: 1, name: 'enemyScore', src: 'enemyScore.mp3', istanze: 1, nome: 'wall', src: 'wall.mp3', istanze: 1]);

Passaggio 22: caricare la grafica

Questo codice è usato per precaricare la grafica, con l'aiuto di una funzione che scriveremo in seguito. Imposta gli oggetti immagine che abbiamo creato in precedenza per puntare ai file PNG sorgente rilevanti nella nostra cartella documenti.

A ciascuno viene dato un nome, in modo che possiamo rilevare quale immagine viene caricata in seguito, e infine viene chiamata la funzione che gestisce le immagini caricate.

Aggiungi questo a Principale().

 / * Carica 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 = 'crediti'; creditsViewImg.onload = loadGfx; playerImg.src = 'paddle.png'; playerImg.name = 'player'; playerImg.onload = loadGfx; ballImg.src = 'ball.png'; ballImg.name = 'palla'; ballImg.onload = loadGfx; cpuImg.src = 'paddle.png'; cpuImg.name = 'cpu'; cpuImg.onload = loadGfx; winImg.src = 'win.png'; winImg.name = 'vinci'; winImg.onload = loadGfx; loseImg.src = 'lose.png'; loseImg.name = 'perdere'; loseImg.onload = loadGfx;

Passaggio 23: Imposta il Ticker

La classe Ticker fornisce una frequenza centralizzata di tick o heartbeat a intervalli regolari. Questo può essere usato per attivare il ciclo di gioco.

Il codice seguente imposta il frame rate su 30 e definisce lo stage come listener per i tick.

La classe TweenJS ascolterà questo segno di spunta per eseguire le animazioni. Aggiungi questo a Principale().

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

Passaggio 24: Funzione di precaricamento

Ogni volta che viene caricato un grafico, questa funzione verrà eseguita. Assegna ogni immagine a un oggetto bitmap e controlla che tutti gli elementi siano caricati prima di procedere.

 function loadGfx (e) if (e.target.name = 'bg') bg = new Bitmap (bgImg); if (e.target.name = 'main') main = new Bitmap (mainImg); if (e.target.name = 'startB') startB = new Bitmap (startBImg); if (e.target.name = 'creditsB') creditsB = new Bitmap (creditsBImg); if (e.target. name = 'credits') credits = new Bitmap (creditsViewImg); if (e.target.name = 'player') player = new Bitmap (playerImg); if (e.target.name = 'ball') ball = new Bitmap (ballImg); if (e.target.name = 'cpu') cpu = new Bitmap (cpuImg); if (e.target.name = 'win') win = new Bitmap ( winImg); if (e.target.name = 'lose') lose = new Bitmap (loseImg); gfxLoaded ++; if (gfxLoaded == 10) // ricorda di cambiare questo se aggiungi altre immagini addTitleView (); 

Passaggio 25: Aggiungi vista titolo

Quando tutti i grafici sono stati caricati, la Vista Titolo viene aggiunta allo stage con la seguente funzione:

 function addTitleView () startB.x = 240 - 31,5; startB.y = 160; startB.name = 'startB'; creditsB.x = 241 - 42; creditiB.y = 200; TitleView.addChild (main, startB, creditsB); stage.addChild (bg, TitleView); stage.update ();

Passaggio 26: avviare i pulsanti di ascolto

Questa funzione aggiunge gli ascoltatori necessari a TitleView pulsanti (fa parte di addTitleView ()):

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

Passaggio 27: Mostra crediti

Il Titoli di coda la schermata viene visualizzata quando l'utente fa clic sul pulsante dei crediti; un ascoltatore del mouse viene aggiunto all'immagine completa per rimuoverlo.

 function showCredits () // Mostra crediti credits.x = 480; stage.addChild (crediti); stage.update (); Tween.get (crediti) .to (x: 0, 300); credits.onPress = hideCredits; 

Passaggio 28: Nascondi crediti

Quando il Titoli di coda viene cliccato sullo schermo, verrà interrotto e rimosso dallo stage.

 // Nascondi la funzione Credits hideCredits (e) Tween.get (credits) .to (x: 480, 300) .call (rmvCredits);  // Remove Credits function rmvCredits () stage.removeChild (credits); 

Fermiamoci qui per testare ciò che abbiamo fatto finora. Clicca qui per una demo milestone.

Tieni presente che alcune righe sono state commentate perché alcune funzioni non sono ancora state create.

Ricorda che la milestone è inclusa nei file sorgente, quindi se per qualche motivo il tuo file non imita questo, confronta la tua sorgente con la mia per vedere cosa potrebbe causare.


Passaggio 29: Mostra vista gioco

Le seguenti righe rimuovono il TitleView dal palco e aggiunge il GameView oggetti sul palco. Un ascoltatore del mouse viene aggiunto allo sfondo, per avviare il gioco quando si fa clic.

 function addGameView () // Destroy Menu & Credits screen stage.removeChild (TitleView); TitleView = null; crediti = null; // Aggiungi Game View 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; // fix per Chrome 17 playerScore.x = 211; playerScore.y = 20; cpuScore = new Text ('0', 'grassetto 20px Arial', '# A3FF24'); cpuScore.maxWidth = 1000; // correzione per Chrome 17 cpuScore.x = 262; cpuScore.y = 20; stage.addChild (playerScore, cpuScore, player, cpu, ball); stage.update (); // Inizia listener bg.onPress = startGame; 

Step 30: Movimento del giocatore

Il giocatore si muoverà insieme alla posizione verticale del mouse:

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

Passo 31: Inizia partita

Questo codice viene eseguito quando il giocatore fa clic sullo sfondo del gioco, aggiunge l'ascoltatore del mouse che attiva la funzione nel passaggio precedente e aggiunge un Ticker per controllare il ciclo di gioco.

Presta attenzione al modo in cui viene creato il ticker: è l'equivalente di un evento Timer in AS3.

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

Passaggio 32: Reimposta

Quando viene segnato un punto (dal giocatore o dal computer), i paddle e la palla ritornano alle loro posizioni originali e il gioco sarà sospeso:

 function reset () ball.x = 240 - 15; ball.y = 160 - 15; player.y = 160 - 37,5; cpu.y = 160 - 37,5; stage.onMouseMove = null; // smettere di ascoltare il mouse Ticker.removeListener (tkr); // mette in pausa il gioco bg.onPress = startGame; 

Step 33: Movimento della palla

Se il gioco non è in pausa, la palla verrà spostata su ogni fotogramma usando le variabili che abbiamo creato prima.

 function update () // Ball Movement ball.x = ball.x + xSpeed; ball.y = ball.y + ySpeed;

Passaggio 34: movimento della CPU

Questo codice controlla il movimento del computer; la pagaia viene spostata in modo che segua la palla pur mantenendo un margine di errore.

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

Passo 35: Collisioni di muri

Qui controlliamo se la palla si trova sul bordo superiore o inferiore della tela; in tal caso, la velocità verticale viene invertita e viene riprodotto un suono.

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

Passo 36: punteggi

Ora i lati sinistro e destro. Questo codice modifica anche il punteggio, chiama la funzione di ripristino e riproduce un suono diverso a seconda del lato toccato dalla palla.

 / * Punteggio CPU * / se ((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); reset(); SoundJS.play ( 'playerScore'); 

Passo 37: Collisioni con la palla-paddle

Il seguente codice controlla se la palla è in collisione con una pagaia, confrontando la posizione della pagaia con le coordinate della palla. Se i riquadri di delimitazione dei due si intersecano, c'è una collisione, quindi invertiamo la velocità x della palla e suoniamo un suono.

 / * Collisione della CPU * / 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'); 

Passaggio 38: Verifica Win / Game Over

È possibile modificare la condizione finale nelle righe successive: è impostata su 10 punti per impostazione predefinita.

 / * Controlla per Win * / if (playerScore.text == '10') alert ('vinci');  / * Verifica Game Over * / if (cpuScore.text == '10') alert ('lose'); 

Passaggio 39: avviso

Questa funzione interrompe il gioco e mostra un avviso, il cui contenuto dipende dal risultato del gioco.

 funzione alert (e) Ticker.removeListener (tkr); stage.onMouseMove = null; bg.onPress = null if (e == 'win') win.x = 140; win.y = -90; stage.addChild (vittoria); Tween.get (win) .to (y: 115, 300);  else lose.x = 140; lose.y = -90; stage.addChild (perdere); Tween.get (perde) .to (y: 115, 300); 

Passaggio 40: test

Salva il tuo lavoro (se non lo hai) e apri il file HTML nel browser per vedere come funziona il tuo gioco!


Conclusione

Prova a modificare le variabili del gioco per creare la tua versione del gioco!

Spero che questo tutorial ti sia piaciuto, grazie per la lettura!