2011-10-26 10 views

risposta

25

Quindi vuoi una tela 500x500 per mostrare qualcosa (un livello di gioco) che è veramente 9000x500 circa.

Questo va bene. Quello che fai è pensare alla tela come a un "punto di vista" per una scena più ampia. Traducete la tela (o qualsiasi altra cosa) nel punto appropriato e disegnate tutte le cose rilevanti in quel punto.

Ecco un esempio:

http://jsfiddle.net/hKrrY/

Cliccare sulla tela e tenere premuto il tasto freccia sinistra per vedere la scena che passa, mentre il giocatore punto rosso rimane "fermo".

Come si scorre per la tela 100x100, si vedono oggetti che vengono disegnati in posizioni off-screen come (330,50). La traduzione della tela li porta alla luce.


immagino la sua pena ricordare che questo è dove fanno ottimizzazioni in una tela inizia a importa. L'esempio che ho dato sopra è un modo molto semplicistico di creare una finestra e, mentre il tuo codice progredisce, vorrai pensare sempre di più a ciò che stai disegnando e quanto stai disegnando. Dovrai evitare di disegnare oggetti completamente fuori schermo, ad esempio, e se il tuo gioco o la tua app hanno uno sfondo di 9000x500 probabilmente non vorrai disegnare l'intera cosa ogni volta!

Quindi il concetto è il take-away qui, ma vorrete pensare molto a come lo implementate e quanto lavoro state facendo alla tela. Se si riscontrano problemi di prestazioni nell'app di scorrimento laterale, accertarsi di comunicarcelo :)

+0

Vedere il mio altro commento. Oggi può essere fatto meglio, riducendo i pixel da toccare con javascript e abilitando la modalità pwnage :-) – user1610743

6

Ho sempre trovato più efficiente avvolgere la tela in un div con la larghezza e l'altezza della vista e l'overflow è impostato su nascosto, quindi disegna l'intera tela e scorri il div verso il punto in cui desideri visualizzarlo.

Così l'HTML sarebbe:

<div id='wrapper' style='width: 200px; height: 200px; overflow: hidden;'> 
    <canvas width='1000' height='1000'></canvas> 
</div> 

e il javascript sarebbe qualcosa di simile

function scrollWrapper(x, y){ 
    var wrapper = document.getElementById('wrapper'); 
    wrapper.scrollTop = x; 
    wrapper.scrollLeft = y; 
} 

Poi basta chiamare la funzione con la X e Y che si desidera visualizzare. potresti avvolgerlo in un setTimeout o qualcosa del genere se vuoi spostarti lì invece di saltare lì.

+1

Tuttavia, disegnare l'intera tela deve essere lento. – scottheckel

+2

se si disegna la tela una volta, quindi basta aggiornare ciò che sta cambiando è buono, in particolare se si sta solo tenendo traccia e non si sta effettivamente disegnando ciò che sta cambiando fuori schermo. – hobberwickey

+0

+1 per questo percorso.Per dare un'impressione: il mio movimento di tela 640 * 480px con getImageData e putImageData su requestAnimationFrame ha preso quasi l'80% di un core della CPU (i7 4770k Haswell); utilizzando questo approccio l'ho ridotto a circa il 10%! È vicino a un ordine di grandezza e indipendentemente da ciò che dice il fps, sembra MOLTO più agevole (probabilmente perché l'anti-aliasing dal browser scorre dentro. Esercitazione: crea un DIV più piccolo con overflow: scorri, lega la rotellina del mouse- evento per funzionare con e.preventDefault() e utilizzare .scrollTop! Ciò rende tutto più divertente! – user1610743

Problemi correlati