2013-04-01 10 views

risposta

34

Utilizzare window.animationFrame, il cugino basato sul futuro del tradizionale window.requestAnimationFrame.

Dart si è spostato per utilizzare Future e Stream come modi più orientati agli oggetti per gestire operazioni asincrone. Il callback basato su callback (vecchio 'n sballato) requestAnimationFrame viene sostituito dal futuro (nuova hotness) animationFrame.

Ecco un esempio:

import 'dart:html'; 

gameLoop(num delta) { 
    // do stuff 
    window.animationFrame.then(gameLoop); 
} 

void main() { 
    window.animationFrame.then(gameLoop); 
} 

La firma del animationFrame assomiglia:

Future<num> animationFrame(); 

Si noti come animationFrame restituisce un futuro che completa con un num, che detiene una "ad alte prestazioni timer "simile a window.performance.now(). Lo num è un delta crescente in modo monotono tra ora e quando la pagina è iniziata. Ha una risoluzione di microsecondi.

The Future termina proprio prima che il browser riguardi il disegno della pagina. Aggiorna lo stato del tuo mondo e disegna tutto quando questo Futuro è completato.

È necessario richiedere un nuovo futuro da animationFrame su ogni frame, se si desidera che l'animazione o il ciclo continui. In questo esempio, i registri gameLoop() vengono notificati sul fotogramma dell'animazione successivo.

BTW c'è un pacchetto di pub denominato game_loop, che potrebbe risultare utile.

+0

Questo link game_loop dà un 404 – Tgwizman

+0

Ecco la posizione corretta http://pub.dartlang.org/packages/game_loop – Tgwizman

+1

Come viene interrotto il file requestAnimationFrame? Osservando la fonte, il animationFrame basato su Future crea un completamento che viene attivato utilizzando il callback requestAnimationFrame originale (vecchio 'n busted)? – paulecoyote

Problemi correlati