Swing Snake repaint() "flackern"

Status
Nicht offen für weitere Antworten.

eQuest

Mitglied
Hallo Community,

ich habe Snake in Java programmiert. Steht zurzeit noch in den Kinderschuhen, aber die Steuerung & Bewegung funktioniert schonmal. Probleme habe ich jetzt noch mit dem zeichnen.

Dazu folgendes:
Ich habe also das Programm geschrieben, ausprobiert und voila, funktioniert. Ich kann die Schlange mit den Pfeiltasten herumsteuern. Aufgefallen ist mir halt dann, dass das, was vorher gezeichnet wurde, nicht verschwindet. "Achso, repaint vergessen..". Also schnell in den Thread ein repaint() gepackt und Run. Was ich dann sah, machte mir etwas stutzig. Am Besten kann man es wohl mit "flackern" beschreiben. Also so wie ich das erkennen konnte, wurde immer wieder neu gezeichnet, nur man sah die Schlange nur kurz aufflackern oder sogar nur einzelne Punkte o0
Ahm ja, ich dachte vl. ist es das DoubleBuffering und setzte dieses auf true.. denkste ...

Tja, soweit bin ich nun =\ Ich werde ma etwas Code posten, damit ihr euch das ma anschaun könnt. Wenn mir wer helfen könnte, wär das klasse :)

JPanel - Land:

Code:
public class Land extends JPanel{
	
	public void paint(Graphics g){
		Iterator<Punkt> it = Spiel.list.listIterator();
		Punkt temp;
		Startpunkt sp=(Startpunkt) it.next();
		Richtung dir_sp = sp.getDir();
		int x = sp.getX(), y = sp.getY(), tempx, tempy;
		
		if(dir_sp == Richtung.RIGHT)
			sp.setX(x+10);
		else if(dir_sp == Richtung.DOWN)
			sp.setY(y+10);
		else if(dir_sp == Richtung.LEFT)
			sp.setX(x-10);
		else if(dir_sp == Richtung.UP)
			sp.setY(y-10);
		
		g.drawOval(sp.getX(), sp.getY(), 10, 10);
		
		while(it.hasNext()){
			temp=it.next();
			tempx=temp.getX();
			tempy=temp.getY();
			temp.setX(x);
			temp.setY(y);
			x=tempx;
			y=tempy;
			g.drawOval(temp.getX(), temp.getY(), 10, 10);
		}
		
	}

}

MainThread - while(true)

Code:
		while(true){
			jf.repaint();
			land.paint(jf.getGraphics());
			
			//Verzögern
			try {
				Thread.sleep(sleeptime);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}

Wenn mehr benötigt wird, einfach sagen, glaube das sind so die wichtigsten Sachen.
 

icarus2

Top Contributor
Wenn man eine Klasse von JPanel ableitet überschreibt man nicht paint(), sonderen paintComponent und ruft dort super.paintComponent() auf.

Sollte etwas so aussehen:

[Java]
protected void paintComponent(Graphics g){

super.paintComponent(g);

//Restliche Anweisungen
}
[/Java]
 
Zuletzt bearbeitet:

eQuest

Mitglied
Er hat oben bereits geschrieben, dass er das versucht hat ;-)

Stimmt :D

Ich bin jetzt leider etwas überfragt, folgendes könnte ich mir noch vorstellen:

Du hast in deiner list noch die alten Werte drin, sodass dass die alten Punkte der Schlange auch gezeichnet werden.

Ne, das ist nicht der Fall. Die Werte werden in paintComponent() überschrieben.

Aber danke erstma für die Beiträge, hoffe wir kommen noch dahinter ^^"
 

andre111

Bekanntes Mitglied
> Die Werte werden in paintComponent() überschrieben.
Daran kann das flackern auch liegen, wenn du in paintComponent() die neuen Werte berechnest, da das auch eine gewisse Zeit in Anspruch nimmt und dadurch das Zeichnen verzögert wird.
Die ganzen Berechnung solten in deiner Game-Loop (MainThread) gemacht werden und in paintComponent() sollte nur gezeichnet werden.
 
Zuletzt bearbeitet:

eQuest

Mitglied
habe es jetzt folgendermaßen umgebaut:
Leider ist der Fehler noch nicht behoben :(

paintComponent()
Code:
public void paintComponent(Graphics g, int x, int y){
				
		g.drawOval(x, y, 10, 10);
			
	}

MainThread - while(true)
Code:
while(true){
			
			it=Spiel.list.listIterator();
			sp=(Startpunkt) it.next();
			dir_sp=sp.getDir();
			x=sp.getX();
			y=sp.getY();
			
			if(dir_sp == Richtung.RIGHT)
				sp.setX(x+10);
			else if(dir_sp == Richtung.DOWN)
				sp.setY(y+10);
			else if(dir_sp == Richtung.LEFT)
				sp.setX(x-10);
			else if(dir_sp == Richtung.UP)
				sp.setY(y-10);
			
			jf.repaint();
			
			while(it.hasNext()){
				temp=it.next();
				tempx=temp.getX();
				tempy=temp.getY();
				temp.setX(x);
				temp.setY(y);
				x=tempx;
				y=tempy;
				land.paintComponent(jf.getGraphics(), sp.getX(), sp.getY());
			}

			//Verzögern
			try {
				Thread.sleep(sleeptime);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
 

andre111

Bekanntes Mitglied
Du musst in Land paintComponent(Graphics) überschreiben und nicht eine eigenen Methode paintComponent(Graphics, int, int) definieren. Dann kannst du in deiner Main-Loop nur noch land.repaint() aufrufen.
Wie du in paintComponent von Land an die benötigten Werte (Koordinaten) zum Zeichnen kommst musst du dir halt überlegen.
Folgendes Tutorial sollte für die Grundstruktur von so einem Spiel auch recht hilfreich sein:
Spieleprogrammierung Tutorial
 

Marco13

Top Contributor
...
land.paintComponent(jf.getGraphics(), sp.getX(), sp.getY());
...
Falls du da nicht Dinge machst, die du nicht machen solltest, solange du nich weißt, dass du da vermutlich Dinge machst, die du nicht machen solltest, machst du da etwas, was man nicht machen sollte: Man sollte fast NIE auf einer Component "getGraphics" aufrufen!

Poste am besten mal ein bißchen mehr Code. (Ideal ist was kleines compilierbares)
 

eQuest

Mitglied
@andree111
danke dir, ich hab mir das runtergeladen und ma aufmerksam durchgelesen. Habe mein Programm nach dieser Vorlage umgeschrieben und voila, funktioniert perfekt ohne flackern ! :)

Danke auch an die Anderen für die Beteiligung ;)

Werde jetzt weitermachen und Snake ausbauen, falls wieder Fragen auftauchen erlaube ich es mir, die hier zu posten ;P
 

eQuest

Mitglied
nein nicht ganz, ich verstehe immer noch nicht, warum es bei der alten Methode geflackert hat. Aber nicht so wichtig, jetz weiß ich ja, wie man das umgeht :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Snake - Spiel AWT, Swing, JavaFX & SWT 27
L Snake in Java KeyListener Problem AWT, Swing, JavaFX & SWT 30
T Snake ...Problem AWT, Swing, JavaFX & SWT 8
V Snake - Spielverlauf nicht flüssig AWT, Swing, JavaFX & SWT 11
J Snake AWT, Swing, JavaFX & SWT 4
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben