Un esempio di Canvas, Multi Touch e SVG su Internet Explorer 10

Come creare un semplice gioco che combina grafica SVG, interazione multi-touch, e manipolazione di immagini tramite Canvas? Vediamolo insieme in questo articolo
di Antonio Barba pubblicato il 16 Agosto 2013 nel canale WebSegue
Fig. 2 La griglia con le relative dimensioni
Nell’esempio successivo, il codice viene modificato per creare degli oggetti SVG contenenti ciascuno un frammento dell’immagine originale. La modifica è abbastanza semplice, come potete notare:
for (var row = 0; row < NUM_ROWS; row++) { for (var col = 0; col < NUM_COLS; col++) { ctx.drawImage(image, dx*col, dy*row, dx, dy, 0, 0, dx, dy); ctx.strokeRect(0, 0, dx, dy); // Place a border around each tile. var svgImage = document.createElementNS('http://www.w3.org/2000/svg', 'image'); svgImage.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", _canvas.toDataURL()); svgImage.setAttribute('width', dx); svgImage.setAttribute('height', dy); svgImage.setAttribute('x', dx * col); svgImage.setAttribute('y', dy * row); svgImage.correctX = dx * col; svgImage.correctY = dy * row; slicedImageTable.push(svgImage); } } |
Le immagini incapsulate in SVG ci serviranno per due scopi: rendere fluido il layout sfruttando il rendering proporzionale della viewport e sfruttare l’accelerazione hardware per svolgere in scioltezza questo compito altrimenti molto pesante (con aumento delle performance e risparmio di energia). Quindi impostiamo nel CSS l’altezza di html e body al 100% e centriamo l’elemento SVG:
html, body { margin: 0; padding: 0; height: 100% } svg { display: block; margin: 0 auto; } |
La viewport verrà impostata con una dimensione di 400 unità (ci penserà il browser a calcolare il valore in pixel)
<svg width="75%" height="75%" viewbox="0 0 400 400"></svg> |
Indifferentemente dalle dimensioni in pixel dell’elemento SVG, le coordinate al suo interno faranno sempre riferimento alla viewport. La correlazione tra coordinate a schermo e coordinate in viewport può sembrare ostica da digerire, ma cercheremo di dissolvere eventuali dubbi in un articolo futuro, dedicato alle trasformazioni geometriche con relative formule matematiche e spiegazioni dettagliate. Infine disegnamo le tiles all’interno dell’elemento SVG:
function displaySvgImages() { for (var i = 0; i < game.tiles.length; i++) { game.svg.appendChild(game.tiles[i]); } } |
Il prossimo passo consiste nella gestione degli input, e conseguente animazione delle tiles. La tecnica è in realtà molto semplice e consiste nella gestione dei tre principali Pointer Events:
- MSPointerDown (l’utente ha cliccato): salvo in una variabile
temporanea il target presente sotto il puntatore
- MSPointerMove (l’utente muove il dito): applico una matrice di
traslazione all’oggetto SVG cliccato
- MSPointerUP (l’utente rilascia il dito): rilascio la variabile
temporanea e verifico se la posizione della piastrella è corretta
Considerando che posso avere più dita contemporaneamente sullo schermo, la variabile temporanea che tiene traccia delle procedure di drag and drop può essere implementata come un array, in modo da poter memorizzare un numero arbitrario di oggetti e, quindi, di dita sullo schermo con l’unica limitazione dell’hardware del sensore.
Il codice dell’esempio completo è sufficientemente chiaro, anche se troppo
lungo per essere riportato per intero qui, in quanto contiene molto codice
accessorio per gestire il caso in cui il browser usato non supporti MSPointer* e
per gestire punteggi e quant’altro. Pertanto l’invito a leggere il codice
sorgente direttamente dal browser è valido anche per questo esempio.
L’esempio completo è visitabile qui:
http://samples.msdn.microsoft.com/Workshop/samples/touch/example7.html.
3 Commenti
Gli autori dei commenti, e non la redazione, sono responsabili dei contenuti da loro inseriti - infoDevi effettuare il login per poter commentare
Se non sei ancora registrato, puoi farlo attraverso questo form.
Se sei già registrato e loggato nel sito, puoi inserire il tuo commento.
Si tenga presente quanto letto nel regolamento, nel rispetto del "quieto vivere".