2015-11-28 35 views
5

Sto scrivendo il gioco Falloutish 2 open-source in PHP + HTML + CSS + JavaScript. In questo momento si occupa del motore. Ho questa gif: https://dl.dropboxusercontent.com/u/4258402/nmwarrgb_e.gifJavascript: GIF animata all'URI dei dati

... che voglio convertire in URI di dati. Ho bisogno di farlo perché i browser nascondono le immagini e questo non è in loop, quindi per essere in grado di "eseguirlo di nuovo" quando l'animazione termina e l'unità va in un'altra tessera, ho bisogno di convertirla in URI di dati. Altrimenti sarei costretto a scaricare nuovamente l'immagine più e più volte, ad es. aggiungendo una stringa casuale alla fine del file immagine. Che funziona bene, ma richiede troppo trasferimento e causa lag.

Questo è il codice ho provato ad utilizzare:

var image = new Image(); 

    (..) 

    this.convertImageObjectToDataURI = function (image) { 
       var canvasTemp = document.createElement('canvas'); 
       canvasTemp.width = image.naturalWidth; // or 'width' if you want a special/scaled size 
       canvasTemp.height = image.naturalHeight; // or 'height' if you want a special/scaled size 

       canvasTemp.getContext('2d').drawImage(image, 0, 0); 

       var dataUri = canvasTemp.toDataURL('image/gif'); 

       // Modify Data URI beginning 
       dataUri = "data:image/gif;" + dataUri.substring(15); 
       console.log(dataUri); 

       // Return image as Data URI 
       return dataUri; 
}; 

Purtroppo produce URI dati solo per il primo fotogramma. Ho provato a cercare i plug-in, a leggere su tela HTML, ma sono ancora Non so come convertire il GIF animato nell'URI dei dati. Qualsiasi aiuto sarebbe molto, molto benvenuto!

+0

La gif animata è un'animazione nella tela? Penso che non animare. Questo è il tuo problema. Hai bisogno di convertirlo dinamicamente? Ho detto, se vuoi inserire il codice base64 in una variabile senza caricare le immagini sul tuo server, puoi codificarlo con uno strumento online e non è necessario codificarlo mentre il gioco è in esecuzione. –

+0

Il problema è che ci sono circa 20 000 animazioni gif: -) E la preoccupazione per me è di forzare questa gif a ricominciare tutto da capo, dopo aver finito di giocare per la prima volta. Ah, probabilmente avrò bisogno di attenermi a più richieste con una stringa casuale attaccata alla fine per ingannare il browser. – Rav

+1

OMG, quindi la mia risposta sugli sprites è scartata credo. Ma devi sapere che gli sprite sono la tecnica più utilizzata per le animazioni nei giochi. In bocca al lupo ! –

risposta

1

Credo non ci sia un modo diretto per farlo utilizzando JavaScript. Usando una tela, dovresti disegnare ogni singolo fotogramma su di esso e codificarlo in un file GIF. Questo sembra impossibile usando l'API corrente in quanto non c'è modo di estrarre i singoli frame (tranne l'analisi manuale del file GIF).

È possibile riuscire a scaricare il file GIF binario utilizzando JavaScript (ricordare le restrizioni tra domini di richieste HTTP) e generare un URL di dati con codifica Base64. Ad esempio, è possibile utilizzare this example per ottenere un Uint8Array che è quindi possibile convert to a base64 string.

Probabilmente si dovrebbe considerare di generare gli URL di dati in modo statico, non utilizzando JavaScript. Ad esempio, è possibile utilizzare questo comando di shell per generare l'URL dei dati per il file GIF:

echo "data:image/gif;base64,"`curl --silent 'https://dl.dropboxusercontent.com/u/4258402/nmwarrgb_e.gif' | base64 --wrap=0` 

C'è anche una serie di servizi on-line che genereranno gli URL di dati da file.

2

Non è possibile con javascript leggere i file del server con questa modalità con la compatibilità di tutti i browser, ma ti consiglio di utilizzare sprite invece di gif animate. Uno sprite è un file png (che consente il canale alfa) con tutti i frame separati. Immaginate quel file:

Dots sprite

Come si può vedere, si tratta di un'immagine 600x150 (150x150 ogni fotogramma, 4 fotogrammi). Così è possibile animare con le animazioni CSS come questo:

.dots { 
 
    width: 150px; 
 
    height: 150px; 
 
    background-image: url(http://i.stack.imgur.com/bCHFq.png); 
 
    
 
    -webkit-animation: play .4s steps(4) infinite; 
 
     -moz-animation: play .4s steps(4) infinite; 
 
     -ms-animation: play .4s steps(4) infinite; 
 
     -o-animation: play .4s steps(4) infinite; 
 
      animation: play .4s steps(4) infinite; 
 
} 
 

 
@-webkit-keyframes play { 
 
    from { background-position: 0px; } 
 
    to { background-position: -600px; } 
 
} 
 

 
@-moz-keyframes play { 
 
    from { background-position: 0px; } 
 
    to { background-position: -600px; } 
 
} 
 

 
@-ms-keyframes play { 
 
    from { background-position: 0px; } 
 
    to { background-position: -600px; } 
 
} 
 

 
@-o-keyframes play { 
 
    from { background-position: 0px; } 
 
    to { background-position: -600px; } 
 
} 
 

 
@keyframes play { 
 
    from { background-position: 0px; } 
 
    to { background-position: -600px; } 
 
}
<div class="dots"></div>

Con questo, è possibile regolare i fotogrammi chiave, la velocità, il numero di frame (passi), e la più importante: don sovraccaricare la CPU e la memoria RAM nel client del browser.

Buona fortuna.