2 Stimmen

repaint() Fehler. Meine repaint-Methode blinkt nur den Bildschirm

Ich glaube, ich habe herausgefunden, woher mein Problem kommt. Wenn ich repaint() auskommentiere, bekomme ich das, was ich normalerweise bekommen würde. Ich habe einen Bildschirm mit einer Rennstrecke, die ich mit Rechtecken und 2 Autos erstellt habe. Offensichtlich sieht nichts so aus, als würde es sich bewegen, weil ich repaint() auskommentiert habe. Wenn ich es so ausführe, wie es ist, macht mein Programm eines von zwei Dingen. Entweder es funktioniert nicht oder es blinkt etwa 3 bis 5 Mal und hört dann auf. Wenn ich sleep() auskommentiere, blinkt das Programm einfach weiter, bis ich es beende. Die Autos bewegen sich, wie sie sollen. Ich weiß nicht, was ich falsch mache. Ich kann auch den Code für die eigentliche Strecke einfügen, wenn Sie möchten. Er ist einfach viel zu lang und ich denke, ich habe es auf das hier eingegrenzt.

private class MoveTwo extends Thread{
    public void run(){
        //infinite loop
        while(true){
            try{
                repaint();//Refresh Screen
                if(playerTwoSpeed<=5) playerTwoSpeed+=.2;//slow acceleration

                playerTwo.y-=playerTwoSpeed;
                Thread.sleep(100);//Delay
            } catch(Exception e){
                break;//Stop if there is an error
            }
        }
    }
}

Hier ist es:

public void paint(Graphics g){
    super.paint(g);
    g.setColor(Color.DARK_GRAY);
    g.fillRect(0, 0, WIDTH, HEIGHT);

    //Turn Border green when we draw.
    g.setColor(Color.GREEN);

    //fill rectangles.
    g.fillRect(left.x, left.y, left.width, left.height);
    g.fillRect(right.x, right.y, right.width, right.height);
    g.fillRect(top.x, top.y, top.width, top.height);
    g.fillRect(bottom.x, bottom.y, bottom.width, bottom.height);
    g.fillRect(center.x, center.y, center.width, center.height);
    g.fillRect(obstacle.x, obstacle.y, obstacle.width, obstacle.height);
    g.fillRect(obstacle2.x, obstacle2.y, obstacle2.width, obstacle2.height);
    g.fillRect(obstacle3.x, obstacle3.y, obstacle3.width, obstacle3.height);
    g.fillRect(obstacle4.x, obstacle4.y, obstacle4.width, obstacle4.height);
    g.fillRect(obstacle5.x, obstacle5.y, obstacle5.width, obstacle5.height);

    g.setColor(Color.WHITE);//Change color to white.
    g.fillRect(outerStart.x, outerStart.y, outerStart.width, outerStart.height);
    g.fillRect(innerStart.x, innerStart.y, innerStart.width, innerStart.height);

    g.setColor(Color.YELLOW);
    g.fillRect(finish.x, finish.y, finish.width, finish.height);

    //Player one is blue
    g.setColor(Color.BLUE);
    g.fill3DRect(playerOne.x, playerOne.y, playerOne.width, playerOne.height, true);

    g.setColor(Color.RED);
    g.fill3DRect(playerTwo.x, playerTwo.y, playerTwo.width, playerTwo.height, true);

}

2voto

Snicolas Punkte 37333

Sie verwenden wahrscheinlich eine Überschreibung einer Paint-Methode aus einer JFrame-Unterklasse. Dies führt auf vielen Betriebssystemen zu Blinkern als J

Außerdem solltest du eine bessere Kontrolle über deinen Thread in Betracht ziehen, eine while truc-Schleife ist... schwer zu stoppen :)

Sie sollten ein boolesches Flag und eine Methode verwenden, um es auf true oder false zu setzen.

Herzliche Grüße,
Stéphane

0voto

Ammar Punkte 2357

Sie sollten die doppelte Pufferung verwenden, um flüssige Animationen zu erhalten.

JComponent.setDoubleBuffered(boolean flag);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X