java double buffering problem
Whats wrong with my applet code which does not render double buffering correctly.I am trying and trying.But failed to get a solution.Plz Plz someone tell me whats wrong with my code.
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=b开发者_JAVA技巧uffer.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);
}
}
what change should i make.When offscreen image is drawn the previous image also remain in screen.How to erase the previous image from the screen??
It looks like you do not cleanup your buffer image between draws. You could test this by changing your code to:
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);
Which draws the red ball and wipes it green afterwards, so you sould see a red ball leaving a green trail. Replacing the green color by your background color would do the trick.
You are not clearing the buffer between two renderings.
How about adding
g.fillRect(0, 0, buffer.getWidth(), buffer.getHeight());
using your background color (black?), before calling g.setColor(Color.RED); g.fillOval...
?
精彩评论