2012-11-27 23 views
7

Sono una specie di nuovo di java. Voglio fare un gioco. Dopo molte ricerche, non riesco a capire come funziona bufferstrategy .. So che le basi .. si crea un'immagine off-screen che in seguito sarà possibile mettere in vostri oggetti di Windows .. Ho ottenuto questoComprendere BufferStrategy

public class Marco extends JFrame { 
    private static final long serialVersionUID = 1L; 
    BufferStrategy bs; //create an strategy for multi-buffering. 

    public Marco() { 
     basicFunctions(); //just the clasics setSize,setVisible,etc 
     createBufferStrategy(2);//jframe extends windows so i can call this method 
     bs = this.getBufferStrategy();//returns the buffer strategy used by this component 
    } 

    @Override 
    public void paint(Graphics g){ 
     g.drawString("My game",20,40);//some string that I don't know why it does not show 
     //guess is 'couse g2 overwrittes all the frame.. 
     Graphics2D g2=null;//create a child object of Graphics 
     try{ 
     g2 = (Graphics2D) bs.getDrawGraphics();//this new object g2,will get the 
     //buffer of this jframe? 
     drawWhatEver(g2);//whatever I draw in this method will show in jframe, 
     //but why?? 
     }finally{ 
     g2.dispose();//clean memory,but how? it cleans the buffer after 
     //being copied to the jframe?? when did I copy to the jframe?? 
     } 
     bs.show();//I never put anything on bs, so, why do I need to show its content?? 
     //I think it's a reference to g2, but when did I do this reference?? 
    } 

    private void drawWhatEver(Graphics2D g2){ 
     g2.fillRect(20, 50, 20, 20);//now.. this I can show.. 
    } 
    } 

Non lo so .. Lo studio da molto tempo ormai .. e senza fortuna .. Non lo so .. forse è tutto lì, ed è davvero chiaro e semplice, e io Sono solo troppo stupido per vederlo ..

Grazie per tutto l'aiuto .. :)

risposta

18

Ecco come funziona:

  1. Il JFrame costruisce un BufferStrategy quando si chiama createBufferStrategy(2);. Lo BufferStrategy sa che appartiene a quella specifica istanza di JFrame. Lo stai recuperando e memorizzandolo nel campo bs.
  2. Quando arriva il momento di disegnare le tue cose, stai recuperando uno Graphics2D da bs. Questo oggetto Graphics2D è associato a uno dei buffer interni di proprietà di bs. Mentre disegni, tutto va in quel buffer.
  3. Quando infine chiamate bs.show(), bs, il buffer appena creato diventerà il buffer corrente per JFrame. Sa come farlo perché (vedi punto 1) sa cosa è in servizio a JFrame.

Questo è tutto ciò che sta succedendo.

A titolo di commento al codice ... è necessario modificare un po 'la routine di disegno. Invece di questo:

try{ 
    g2 = (Graphics2D) bs.getDrawGraphics(); 
    drawWhatEver(g2); 
} finally { 
     g2.dispose(); 
} 
bs.show(); 

si dovrebbe avere un ciclo come questo:

do { 
    try{ 
     g2 = (Graphics2D) bs.getDrawGraphics(); 
     drawWhatEver(g2); 
    } finally { 
      g2.dispose(); 
    } 
    bs.show(); 
} while (bs.contentsLost()); 

che salvaguardino contro cornici tampone perduti, che, secondo the docs, può accadere di tanto in tanto.

+0

Perché è necessario disporre() prima di mostrare() il buffer? Presumo che l'oggetto grafico abbia solo la funzionalità grafica, ma quando non è necessario "rilasciamo gli strumenti e le risorse" e mostri la nostra immagine bufferizzata? –

+1

@someFolk - Non deve essere fatto in questo ordine; la chiamata a 'bs.show()' potrebbe essere spostata all'interno del blocco 'try'. Ma non c'è una ragione particolare per farlo ed è buona pratica rilasciare le risorse di sistema non appena non sono necessarie. –