проблема двойной буферизации Java - PullRequest
0 голосов
/ 21 мая 2010

Что не так с моим кодом апплета, который неправильно отображает двойную буферизацию. Я пытаюсь и пытается. Но не удалось найти решение. Пожалуйста, кто-нибудь, скажите мне, что не так с моим кодом.

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);
    }

}

Какое изменение я должен сделать. Когда нарисовано закадровое изображение, предыдущее изображение также остается на экране. Как стереть предыдущее изображение с экрана ??

Ответы [ 2 ]

1 голос
/ 21 мая 2010

Похоже, вы не очищаете буферное изображение между рисованиями. Вы можете проверить это, изменив код на:

    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);

Который рисует красный шар и затем вытирает его зеленым, так что вы можете увидеть красный шар, оставляющий зеленый след. Замена зеленого цвета на цвет фона поможет вам.

1 голос
/ 21 мая 2010

Вы не очищаете буфер между двумя визуализациями.

Как насчет добавления

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

используя свой цвет фона (черный?), Прежде чем звонить g.setColor(Color.RED); g.fillOval...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...