2010-05-21 84 views
0

請告訴我錯了我的applet代碼不呈現雙緩衝correctly.I我試圖 和trying.But未能獲得solution.Plz PLZ有人告訴我什麼是錯我的代碼。的java雙緩衝問題

import java.applet.* ; 
import java.awt.* ; 
import java.awt.event.* ; 


public class Ball extends Applet implements Runnable 
{ 
    // Initialisierung der Variablen 
    int x_pos = 10;  // x - Position des Balles 
    int y_pos = 100; // y - Position des Balles 
    int radius = 20; // Radius des Balles 

    Image buffer=null; 
    //Graphics graphic=null; 

    int w,h; 

    public void init() 
    { 
     Dimension d=getSize(); 
     w=d.width; 
     h=d.height; 

     buffer=createImage(w,h); 
     //graphic=buffer.getGraphics(); 

     setBackground (Color.black); 

    } 

    public void start() 
    { 
     // Schaffen eines neuen Threads, in dem das Spiel lไuft 
     Thread th = new Thread (this); 
     // Starten des Threads 
     th.start(); 
    } 

    public void stop() 
    { 

    } 

    public void destroy() 
    { 

    } 

    public void run() 
    { 
     // Erniedrigen der ThreadPriority um zeichnen zu erleichtern 
     Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 

     // Solange true ist lไuft der Thread weiter 
     while (true) 
     { 
      // Verไndern der x- Koordinate 
      repaint(); 

      x_pos++; 
      y_pos++; 
      //x2--; 
      //y2--; 

      // Neuzeichnen des Applets 


      if(x_pos>410) 
       x_pos=20; 

      if(y_pos>410) 
       y_pos=20; 

      try 
      { 

       Thread.sleep (30); 
      } 
      catch (InterruptedException ex) 
      { 
       // do nothing 
      } 

      Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 
     } 
    } 

    public void paint (Graphics g) 
    { 

     Graphics screen=null; 

     screen=g; 
     g=buffer.getGraphics(); 

     g.setColor(Color.red); 


     g.fillOval(x_pos - radius, y_pos - radius, 2 * radius, 2 * radius); 


     screen.drawImage(buffer,0,0,this); 

    } 


    public void update(Graphics g) 
    { 

     paint(g); 
    } 

} 

我應該make.When什麼改變屏幕外的圖像繪製以前的形象也留在screen.How擦除從屏幕前面的圖像?

+0

對於初學者來說,你可以停止發佈示例代碼與10點空的方法。 – 2010-05-21 07:56:27

+1

嗨羅塞爾。你只接受29個問題中的33%。你真的收到20個問題的無法解答嗎?請檢查一下,並在您的文章中更換「plz plz plz」,以瞭解有關哪些功能無法正常工作的更多詳細信息。那麼你可能有更好的機會接收答案。 – chiccodoro 2010-05-21 08:01:45

+0

好的,我發現我的問題。我創建了一個新的圖像緩衝區= createImage(w,h); 'screen.drawImage(buffer,0,0,this)'後面的' ';'然後清理問題就解決了。但是現在出現了另一個問題,我的移動球也在閃爍。所以我想知道是否在這裏執行雙緩衝。如何檢查這個,任何人都可以幫忙? – russell 2010-05-21 09:39:04

回答

1

看起來你之間沒有清理你的緩衝圖像繪製。

g.setColor(Color.red); 
    g.fillOval(x_pos - radius, y_pos - radius, 2 * radius, 2 * radius); 

    screen.drawImage(buffer,0,0,this); 

    g.setColor(Color.green); 
    g.fillOval(x_pos - radius, y_pos - radius, 2 * radius, 2 * radius); 

其中提請紅球和抹布它綠色算賬,所以你看到前人的精力一顆紅球留下綠色足跡:你可以通過改變你的代碼進行測試。用你的背景色代替綠色就可以了。

+0

我應用了您的建議,但問題仍然存在。事實 g.setColor(Color.green);這是因爲錯誤類型。它應該已被評論。問題是前一張圖片保留在屏幕上/新寫入的圖片位於上一張圖片上,而不是空白圖片。如何解決此問題? – russell 2010-05-21 09:23:21

+0

@russell,我的建議覆蓋紅球與另一種顏色,所以下一次迭代它不應該被顯示(使用綠色留下線索,背景色躲球)您的解決方案創建一個新的緩衝圖像等於覆蓋具有默認顏色的圖像。您的問題可能是由透明背景而非透明顏色清除的結果嗎? – rsp 2010-05-21 11:33:25

+0

我無法理解你的疑問句!不過那不是我終於成爲了能夠通過設置 >> screen.drawImage(緩衝區,0,0,this)來消除閃爍一個problem.Because; screen.drawImage(buffer,0,0,null);你非常感謝你的幫助。希望下次你也能幫助我。 – russell 2010-05-21 15:37:22

1

您還沒有結算兩次渲染之間的緩衝區。

如何使用你的背景顏色(黑色?)加入

g.fillRect(0, 0, buffer.getWidth(), buffer.getHeight()); 

,呼籲g.setColor(Color.RED); g.fillOval...過嗎?

+0

我用過它,但問題仍然存在,仍然是球。隨着尾巴移動,我不知道我還能做什麼! – russell 2010-05-21 09:26:22