AWT Performance und Bug behebung[brauche Hilfe]

ostylk

Mitglied
Hi,

Ich habe mal ein PingPong programmiert mit dem AWT und es funktioniert auch.
Nur der Bildschirm flackert, weil ich zu oft repaint(); aufrufe :D und ich weiß nicht wie ich das reduzieren soll ohne das der Ball komisch rumspringt und da habe ich noch ein Bug das der Ball manchmal durch die Wand des Players durch glitscht und ich habe für die beiden Probleme keine Lösung gefunden :(.Ich hoffe ihr könnt mir mal helfen den Code zu verbessern.Bitte seit nicht so streng das ist mein erstes Grafikprogramm mit dem AWT und mein erstes Game.Ich poste mal den Code

PingPong.java (Hauptklasse)
Java:
package de.ostylk.pingpong;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class PingPong extends Frame implements KeyListener{
	static Random r = new Random(200);
	public static int xBall = r.nextInt(200);
	public static int yLinks = 200;
	public static int yRechts = 200;
	public static int yBall = r.nextInt(200);
	public static int winner = 0;
	static SpielStarten ss = new SpielStarten();
	public static void main(String[] args) {	
		ss.start();
		
	}
	public PingPong() {
		super("Ping Pong");
		addWindowListener(new WindowClosingAdapter(true));
		setSize(700,500);
		setVisible(true);
		setBackground(Color.BLACK);
		addKeyListener(this);
	}
	public void paint(Graphics g)
	{
		g.setColor(Color.WHITE);
		g.fillRect(10, yLinks, 20, 80);
		g.fillRect(670, yRechts, 20, 80);
		g.fillOval(xBall, yBall, 20, 20);
		if(winner == 1) {
			g.drawString("Player 1 hat gewonnen", 350,350);
			g.drawString("Drücken sie Enter zum Neustart", 350, 360);
		}
		else if(winner == 2) {
			g.drawString("Player 2 hat gewonnen", 350,350);
			g.drawString("Drücken sie Enter zum Neustart", 350, 360);
		}
	}
	public void keyPressed(KeyEvent event) {
		if(event.getKeyCode() == KeyEvent.VK_S) {
			if(yLinks >= 450) {
				return;
			}
			yLinks += 50;
			repaint();
		}
		if(event.getKeyCode() == KeyEvent.VK_W) {
			if(yLinks <= 30) {
				return;
			}
			yLinks -= 50;
			repaint();
		}
		if(event.getKeyCode() == KeyEvent.VK_UP) {
			if(yRechts <= 30) {
				return;
			}
			yRechts -= 50;
			repaint();
		}
		if(event.getKeyCode() == KeyEvent.VK_DOWN) {
			if(yRechts >= 450) {
				return;
			}
			yRechts += 50;
			repaint();
		}
		if(event.getKeyCode() == KeyEvent.VK_ENTER) {
			ss.bol1 = false;
			ss.bol2 = false;
			ss.win = 0;
			yLinks = 200;
			yRechts = 200;
			xBall = r.nextInt(200);
			yBall = r.nextInt(200);
			winner = 0;
			System.out.println(ss.win);
		}
	}
	public void keyReleased(KeyEvent event) {
		
		
	}
	public void keyTyped(KeyEvent event) {
		
	}

}

WindowClosingAdapter.java

Java:
package de.ostylk.pingpong;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class WindowClosingAdapter extends WindowAdapter{
	private boolean exitSystem;
	
	public WindowClosingAdapter(boolean exitSystem) {
		this.exitSystem = exitSystem;
	}
	public WindowClosingAdapter() {
		this(false);
	}
	public void windowClosing(WindowEvent event) {
		event.getWindow().setVisible(false);
		event.getWindow().dispose();
		if(exitSystem) {
			System.exit(0);
		}
	}
}

SpielStarten.java (steuert denn Spiel ablauf)

Java:
package de.ostylk.pingpong;

public class SpielStarten extends Thread{
	PingPong pp = new PingPong();
	boolean bol1 = false;
	boolean bol2 = false;
	int win = 0;
	public SpielStarten() {
		Timer t = new Timer();
		t.start();
	}
	class Timer extends Thread{
		synchronized public void run() {
			while(true) {
				pp.repaint();
				try {
					Thread.sleep(60);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
		}
	}
	//Das Spiel
	synchronized public void run () {
		while(true) {
			//Hier wird in den Ball bewegung eingehaucht :D
			if(!bol1 && !bol2) {
				
				pp.xBall += 1;
				pp.yBall -= 1;
				
				try {
					if(gewinner() == 1) {
						pp.winner = 1;
						
					}
					else if(gewinner() == 2) {
						pp.winner = 2;
						
					}
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			else if (!bol1 && bol2) {
				
				pp.xBall += 1;
				pp.yBall += 1;
				
				try {
					if(gewinner() == 1) {
						pp.winner = 1;
						
					}
					else if(gewinner() == 2) {
						pp.winner = 2;
						
					}
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			else if(bol1 && !bol2) {
				
				pp.xBall -= 1;
				pp.yBall -= 1;
				
				try {
					if(gewinner() == 1) {
						pp.winner = 1;
						
					}
					else if(gewinner() == 2) {
						pp.winner = 2;
						
					}
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			else if(bol1 && bol2) {
				
				pp.xBall -= 1;
				pp.yBall += 1;
				
				try {
					if(gewinner() == 1) {
						pp.winner = 1;
						
					}
					else if(gewinner() == 2) {
						pp.winner = 2;
						
					}
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			//Hier wird der Ball in die Richtige abgeprallt
			if(pp.yBall <= 30 && !bol1) {
				bol2 = true;
			}
			else if(pp.yBall >= 470 && !bol1) {
				bol2 = false;
			}
			else if(pp.yBall <= 30 && bol1) {
				bol2 = true;
			}
			else if(pp.yBall >= 470 && bol1) {
				bol2 = false;
			}
			//Der Spieler
			else if(pp.xBall == 650 && pp.yBall >= pp.yRechts && pp.yBall <= (pp.yRechts + 40)) {
				bol1 = true;
				if(bol2) {
					bol2 = true;
				}
				else if(!bol2) {
					bol2 = false;
				}
			}
			else if(pp.xBall == 40 && pp.yBall >= pp.yLinks && pp.yBall <= (pp.yLinks + 40)) {
				bol1 = false;
				if(bol2) {
					bol2 = true;
				}
				else if(!bol2) {
					bol2 = false;
				}
			}
		}
	}
	public int gewinner() {
		
			if(pp.xBall >= 730) {
				win = 1;
			}
			if(pp.xBall <= 1) {
				win = 2;
			}
		
		return win;
	}
}
 

MrClave

Bekanntes Mitglied
Mit solchen Dingen kenne ich mich leider nicht aus, allerdings kann ich dir einen YouTuber ans Herz legen, der diese Probleme durchgegangen ist.

Kanal von Brotcrunsher - YouTube

Sowohl Kollisionsabfragen, als auch das mit dem flackernden Bild (was man wohl anhand timeSinceLastFrame beheben kann) kannst du dort finden.
 

njans

Top Contributor
Also du solltest erstmal lieber JFrame, also SWING verwenden, das verwendet double buffering von Natur aus, weswegen dein Flackern (dort wird auch nicht paint() sondern paintComponent() überschrieben).
Das sollte dann generell dein Problem erstmal lösen.
Was dein Problem mit der Kollision angeht: Ich habe mir deinen code nicht durchgelesen, ich werde mir das vielleicht später mal anschauen.

P.S.
setVisible(true); ist immer der letzte Aufruf, da dort das ganze Rendering beginnt, wenn du nachträglich etwas änderst, wird das erst beim nächsten repaint gemacht. Dein Konstruktor musst du mal umordnen. Ebenfalls gehört so etwas nicht in den Konstruktor, sondern sollte extern aufgerufen werden.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
missy72 JavaFX Performance / ImageView in TableView über TimeLine AWT, Swing, JavaFX & SWT 1
L JavaFX ListCell Performance AWT, Swing, JavaFX & SWT 10
E Swing Miserable Performance beim Ändern der Hintergrundfarbe von JLabels AWT, Swing, JavaFX & SWT 3
W Swing Performance bei Griderstellung verbessern AWT, Swing, JavaFX & SWT 15
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
I JavaFX Graphics Performance AWT, Swing, JavaFX & SWT 2
S Swing Performance bei Verschachtelung problematisch AWT, Swing, JavaFX & SWT 0
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
T Swing Allgemeines Problem mit der Performance bei DragAndDrop AWT, Swing, JavaFX & SWT 2
T Prüfen ob 2 JLabel übereinander liegen. Performance Problem. AWT, Swing, JavaFX & SWT 5
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
B Performance-Probleme AWT, Swing, JavaFX & SWT 17
D DefaultTableCellRenderer - Performance AWT, Swing, JavaFX & SWT 3
hdi Swing [Umfrage] Swing Performance AWT, Swing, JavaFX & SWT 27
B 2D-Grafik BufferedImage Performance AWT, Swing, JavaFX & SWT 3
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
Hausmeister JTable mit Bildern - Performance AWT, Swing, JavaFX & SWT 5
J JTree Performance AWT, Swing, JavaFX & SWT 2
Developer_X Swing Graphics2D translate zerstört performance AWT, Swing, JavaFX & SWT 2
hdi Swing JTable: Mein CellRenderer ist ein Performance-Killer? AWT, Swing, JavaFX & SWT 7
J Performance bei mouseMoved(...) AWT, Swing, JavaFX & SWT 4
L JFreeChart - Performance bei PNG-Erstellung AWT, Swing, JavaFX & SWT 5
P seltsame Performance Probleme bei 2 Guis abhängig vom Aufruf AWT, Swing, JavaFX & SWT 8
G Performance beim Zeichnen erhöhen? AWT, Swing, JavaFX & SWT 21
hdi bitte um performance ratschläge AWT, Swing, JavaFX & SWT 31
G performance fragen zu AWT, Swing AWT, Swing, JavaFX & SWT 14
T (Java 6) Thumbnails in JFileChooser - Performance steigern? AWT, Swing, JavaFX & SWT 3
hdi schlechte performance bei simplem swing AWT, Swing, JavaFX & SWT 9
G Probleme mit Performance bei einer Tabelle AWT, Swing, JavaFX & SWT 16
M Performance SWT ??? AWT, Swing, JavaFX & SWT 8
D performance problem: paintcomponent, alphacomp, bufferedImag AWT, Swing, JavaFX & SWT 10
P SWT: StyledText Performance steigern? AWT, Swing, JavaFX & SWT 2
T Performance Problem bei BufferedImage AWT, Swing, JavaFX & SWT 3
P SWT Performance : "Text" - Ausgabe beschleunigen ? AWT, Swing, JavaFX & SWT 21
O performance g2d.drawImage() AWT, Swing, JavaFX & SWT 17
D Performance Probleme Jtable AWT, Swing, JavaFX & SWT 4
N Performance (BufferStrategy?) AWT, Swing, JavaFX & SWT 2
F Problem mit Transparenz, MouseEvents und Performance AWT, Swing, JavaFX & SWT 3
O LookAndFeel und Performance AWT, Swing, JavaFX & SWT 7
W Performance verbessern AWT, Swing, JavaFX & SWT 2
S TableCellRenderer, Performance AWT, Swing, JavaFX & SWT 9
S Performance-Problem: JTextArea als Logging-Window AWT, Swing, JavaFX & SWT 8
W JavaFX CSS und Vererbung - ich brauche nochmal etwas Nachhilfe AWT, Swing, JavaFX & SWT 28
J 2D-Grafik Brauche Erklärung von Methode AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
V Swing Brauche Hilfe mit Label AWT, Swing, JavaFX & SWT 3
K Swing Brauche Hilfe AWT, Swing, JavaFX & SWT 6
D Ambitioniertes Projekt - Brauche Stichworte AWT, Swing, JavaFX & SWT 4
D Swing Wozu brauche ich getContentPane()? AWT, Swing, JavaFX & SWT 2
S Ich brauche eine Idee: Animation mit teil eines Bildes AWT, Swing, JavaFX & SWT 16
L Mein Kopf dreht sich... Brauche Hilfe beim GUI gestalten AWT, Swing, JavaFX & SWT 10
J Brauche ganz dringend Hilfe!!! AWT, Swing, JavaFX & SWT 5
S Brauche genaustes Verstaendnis ueber JTextField AWT, Swing, JavaFX & SWT 3
M brauche Hilfe um Einträge aus Jlist zu löschen AWT, Swing, JavaFX & SWT 4
W Brauche Swing-Experten AWT, Swing, JavaFX & SWT 4
P Welchen Listener brauche ich? AWT, Swing, JavaFX & SWT 7
G Welche Swing-Version brauche ich . AWT, Swing, JavaFX & SWT 6
S Wann brauche ich die prepareRenderer() Methode ? AWT, Swing, JavaFX & SWT 2
D Brauche einfachen HTML Editor AWT, Swing, JavaFX & SWT 2
M Ich habe Werte und Brauche Grafik! AWT, Swing, JavaFX & SWT 3
G Leider trotz allem kein Icon :( Brauche Hilfe AWT, Swing, JavaFX & SWT 3
G Selbstprogrammierter Editor - brauche Hilfe AWT, Swing, JavaFX & SWT 5
M Brauche nur den Pfad zum Speichern AWT, Swing, JavaFX & SWT 8
M Brauche Hilfe zum Einbinden von eigener Schrfitart AWT, Swing, JavaFX & SWT 3
S Brauche Hilfe mit JFrame - NullPointerException AWT, Swing, JavaFX & SWT 7
K Ich brauche GridBagLayout Hilfe AWT, Swing, JavaFX & SWT 4
S Frame, brauche dringend hilfe AWT, Swing, JavaFX & SWT 4
M Konsolenprg-Ausgabe in GUI geleitet - Brauche ich Threads? AWT, Swing, JavaFX & SWT 2
N ProgressBar --> brauche Hilfe AWT, Swing, JavaFX & SWT 4
N Brauche Layout-Hilfe AWT, Swing, JavaFX & SWT 3
N Brauche Layout Hilfe AWT, Swing, JavaFX & SWT 9
Z Bei Problem mit Java Swing brauche dringende Hilfe AWT, Swing, JavaFX & SWT 3
O Brauche ich einen neuen Frame? AWT, Swing, JavaFX & SWT 2
V Brauche Hilfe beim Steuern des Sichtbereiches eines JPanel AWT, Swing, JavaFX & SWT 2
D Zoom problem!!! (brauche screenshot...) plz help thx AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben