2012-08-12 17 views
6

Prima di tutto, dirò che il contesto qui è Actionscript 3.0 (IDE: Flashbuilder) insieme allo Starling Framework.Rendering mappa tile AS3 (con migliaia di tile)

Quindi, voglio creare una mappa affiancata che possa essere utilizzata per un platform o qualcosa di simile.

Voglio usare piastrelle di 8x8 pixel su uno stage da 800x600 pixel, e il problema che sto avendo è che non so come aggiungere questi oggetti di piastrelle 7500+ allo stage senza ridurre drasticamente il framerate.

Ho scoperto che il calo delle prestazioni deriva dall'aggiunta di ogni piastrella allo stage, non dall'inizializzazione di ogni oggetto Tile.

So che non sto dando molte informazioni specifiche, ma quello che chiedo è se c'è un modo standardizzato per disegnare migliaia di oggetti statici sul palco senza una perdita di prestazioni. Sento che c'è un modo, e devo ancora trovarlo.

Aggiornamento:

Dopo tutto il vostro gentile aiuto, ho trovato quello che sembra essere una grande soluzione. All'inizio volevo implementare la soluzione di Amy, usando copyPixels() e draw() per creare dati bitmap di grandi dimensioni per l'intera mappa e quindi renderizzarli sullo schermo. Poi, però, volevo sapere se c'era un equivalente Starling a questo, perché tutto sarebbe stato molto più semplice se non avessi dovuto mescolare Starling con Native Flash.

Grazie ad Amy, ho esaminato ancora una volta la classe RenderTexture di Starling e ho scoperto che usando i suoi metodi "drawBundled()" e "draw()", avrei potuto facilmente disegnare tutte le tessere in una RenderTexture, e quindi metti il ​​RenderTexture in un'immagine (Starling's Image Class) e poi aggiungi questa immagine allo schermo.

Questa soluzione è un milione di volte più veloce delle sciocche soluzioni lente che ho provato prima, con sprite livellanti e simili. È più veloce sia nel suo tempo di inizializzazione e sembra che non ci sia alcun calo nel framerate mentre l'immagine del renderTexture è sullo schermo.

L'unica cosa che voglio testare è se è facile aggiornare la grafica di una tessera durante il gameplay. Supponiamo che, se l'acqua si diffonde da una fonte (o qualcosa del genere) e una tessera "Erba" dovesse diventare una tessera "Acqua", la RenderTexture e la sua immagine sarebbero in grado di cambiare il loro aspetto senza una sorta di ritardo o di singhiozzo delle prestazioni. Lo metterò alla prova presto.

Grazie a tutti per il vostro aiuto!

risposta

9

Non aggiungere che molti oggetti sul palco. Invece, crea un BitmpaData delle dimensioni del tuo stage e usa copyPixels() o draw() per disegnarlo. Here's an article che dovrebbe iniziare. Puoi quindi prendere in considerazione i concetti che hai appreso in quel post e imparare tutto ciò di cui hai bisogno per fare ciò che non è coperto (flashandmath.com ha un sacco di buoni tutorial sulla manipolazione dei pixel)

+0

Grazie, un punto di partenza come questo che mi spinge nella giusta direzione è proprio quello di cui avevo bisogno! – Brucef

+0

Prego :) –

+0

ora devo solo capire come utilizzare gli oggetti di visualizzazione flash nativi funziona con Starling Framework ... – Brucef

3

È necessario gestire le tessere che devono essere aggiunte e rimosse mentre ci si sposta nel gioco. Aggiungi solo tessere stage con 800 px al centro dello schermo. Una volta che la tessera è oltre 800 px dal centro rimuovila. Ciò dovrebbe mantenere tutto senza intoppi. In bocca al lupo.

oppure guarda in disegno/copia le tue tessere in una bitmap. Fonderesti fondamentalmente le tue tessere sulla nuova bitmap. Ecco un esempio da Adobe:

import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.geom.Rectangle; 
import flash.geom.Point; 

var bmd1:BitmapData = new BitmapData(40, 40, false, 0x000000FF); 
var bmd2:BitmapData = new BitmapData(80, 40, false, 0x0000CC44); 

var rect:Rectangle = new Rectangle(0, 0, 20, 20); 
var pt:Point = new Point(10, 10); 
bmd2.copyPixels(bmd1, rect, pt); 

var bm1:Bitmap = new Bitmap(bmd1); 
this.addChild(bm1); 
var bm2:Bitmap = new Bitmap(bmd2); 
this.addChild(bm2); 
bm2.x = 50; 

More Info on the bitmapData class. I think copyPixels is what you are after.

+0

Che funzionerebbe in una situazione diversa, ma qui il problema non è che ho bisogno di aggiungere/rimuovere tessere mentre la telecamera si muove, ma che le tessere sono così piccole che io Non so come creare il numero necessario per riempire lo schermo (7500) senza perdere prestazioni immensamente. – Brucef

+0

quante piastrelle uniche ci sono? Non potresti campionare i bitmapData della tessera e copiarli tutti in una bitmap. In questo modo stai solo creando un'immagine ma da più fonti di tile. – Boyd

+0

Ci sono pochissime tessere uniche (meno di 16), e sembra che funzioni, ma non capisco appieno il modo di implementare qualcosa del genere. – Brucef