2010-05-21 233 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