Java Pong Probleme

Dreadslayer

Mitglied
Hallo zusammen

Ich arbeite zurzeit gerade an einer eigenen Version von Pong in Java. Für die Visualisierung verwende ich das AWT.

Es haben sich nun jedoch gewisse Fragen ergeben, von welchen ich mir erhoffte hier einige Antworten zu erhalten.

Zur Steuerung des Spielbalkens verwende ich den KeyListener, folgender Code:

Java:
public void keyPressed(KeyEvent a){
	if(a.getKeyCode()==KeyEvent.VK_UP){
		cpos = cpos-cspeed;
		if(cpos<=pwidth){ cpos = pwidth+1; }
		repaint(620,cpos,cwidth,cpos+clength+cspeed);
	}
	if(a.getKeyCode()==KeyEvent.VK_DOWN){
		cpos = cpos+cspeed;
		if(cpos>=fwidth+pwidth-clength){ cpos = fwidth+pwidth-clength; }
		repaint(620,cpos-cspeed,cwidth,cpos+clength+cspeed);
	}
}
cpos: Position des Cursors/Balkens (obere, linke Ecke des rect), clength/cwidth: Länge/Breite des Cursors, cspeed: Cursorgeschwindigkeit (Anzahl Pixel pro Schritt)
fwidth: Spielfeldbreite, pwidth: Distanz bis zum Spielfeldbeginn

Es funktioniert prinzipiell auch, leider hat dies 2 gravierende Nachteile:
1. Es muss wohl zuerst erkannt werden, dass die Taste gedrückt bleibt. Folglich geht es einen kleinen aber entscheidenden Moment, bis sich der Balken zu bewegen beginnt. Dies ist sehr störend beim Spielen.
2. Muss die Geschwindigkeit mit den Anzahl Pixeln pro Schritt geregelt werden, was zu einer Art "Ruckeln" des Balkens führt je höher die Geschwindkeit wird.

Wäre toll wenn Ihr mir hierzu irgendwelche Tipps und/oder Verbesserungsvorschläge habt!?


Desweiteren sollte der Balken ja über eine Kollisionsabfrage verfügen, so wie die Spielfeldränder. An denen habe ich lediglich "Einfallswinkel = Ausfallswinkel" programmiert. Wenn ich jedoch Spiele wie Pong o.ä. spiele, so scheint es irgendeine Formel für den Balken zu geben, welche den Ausfallswinkel beinflusst. Anscheinend wird dieser irgendwie mit Einfallswinkel, Ort des Auftreffens und Balkengeschwindigkeit berechnet. Weiss jemand mehr darüber? Oder hat jemand eine Idee?


Zu guter letzt strauchle ich noch sehr mit der "Geschwindigkeit" des ganzen Spieles. Beim Spielball wird zwischen jeder Berechnung der nächsten Position des Balles eine Thread.sleep(x) initiiert. Die nächste Position kann immer nur ein Pixel direkt neben der aktuellen Position sein. Folglich geht ein Schritt in eine schräge Richtung, z.B. 45° (immer Pixel oben rechts), gleich lange wie z.B. 0°, also gerade. 45° sollte aber Wurzel 2 mal länger gehen. Beim Balken wird die Geschwindigkeit ganz anders gesteuert, siehe oben. Eine einheitliche Lösung wäre aber wünschenswert, nur weis ich nicht genau wie diese umzusetzen wäre.

Über Antworten würde ich mich ausgesprochen freuen :)

MfG
Dread
 
S

SlaterB

Gast
zu 1. + 2.:

1.
mach dich nicht abhängig von der Anzahl der keyPressed-Events und der Verzögerung zwischen den ersten und dem zweiten,
beim ersten Event setzt du den Zustand gedrückt auf true,
bei release auf false, der Rest passiert intern automatisch
2.
das Ruckeln hängt nur von der Anzahl der repaints() ab (was bei Swing aber eher begrenzt ist), vom Spieltakt,
berechne 20x pro Sekunde die Position neu, die Geschwindigkeit + Position dürfen dann auch Komma-Werte sein, die genau gespeichert werden, gemalt wird an der Position, die aktuell am nächsten liegt

du brauchst also einen Thread, der nebenher läuft,
im Spieletutorial
http://www.ralf-bauer.org/java/tutorial/Tutorial.zip
ist das auf den ersten Seiten auch so erklärt, wie ich grad noch mal nachgeschaut habe,
sogar mit den booleans bei keyPressed() + keyReleased()
 
Zuletzt bearbeitet von einem Moderator:

Dreadslayer

Mitglied
Vielen Dank für deine Antwort!

Das Tutorial hilft auf jeden Fall weiter. Ich habe mit dessen Hilfe auch bereits einige Schwächen meines Programmes entdeckt, welche ich nun gedenke auszumerzen. U.a. das Geschwindigkeitsproblem.

Falls jedoch jemand noch eine Idee bzgl. der "Abprallformel" beim Balken hat wäre ich sehr froh :)

MfG
Dread
 

Quaxli

Top Contributor
Laß die Abprall-Formel erst mal weg und schau' daß Du eine einfache Version performant zum Laufen kriegst. Danach kannst Du den Schläger immer noch upgraden. ;)
 

Dreadslayer

Mitglied
@Quaxli: Ich habe ja bereits eine Version performant am Laufen. Mit "Geschwindigkeitsproblemen" meine ich die Geschwindigkeitssynchronisierung von Ball&Balken. Nichtsdestrotrotz darf mir jemand die Formel verrraten, auch wenn das Programm nicht perfekt ist. ;)

@Landei: Ich bewege mich zurzeit noch auf GUI-Neuland. Mit AWT wurde ich eingeführt, es sollte als Übung dienen.
 

Quaxli

Top Contributor
Ich habe in der Mittagspause mal auf die Schnelle was zusammen geklopft.
Es sind nur ein paar wenige Klassen mit vielen unschönen Dingen darin, wie z. B. direkter Zugriff auf Klassenvariablen, etc.. Außerdem habe ich weitgehend auf Methoden verzichtet, in denen ich sonst Sachen zusammen fasse, wie z. B. eine Methode doLogic(..) in der diese Funktion für alle Objekte aufgeführt wird. Usw und so fort. Also bitte nicht auf den Programmierstil achten, das ist jetzt wirklich nur quick & dirty hingeschmissen.

Aber es sind mal ein paar Verbesserungen drin, wie z. B. Swing statt AWT und den KeyListener habe ich auch angepaßt. Kommentare gibt's auch nicht. Da hatte ich nicht die Zeit und so lernst Du mehr :D:D:D

Das Ganze ist bei mir auf jeden Fall lauffähig. Guck's Dir an und wenn Du Fragen hast, frage.
Oder guck in mein Tutorial in der Signatur. Das meiste habe ich von den Objekten dort auf die Schnelle raus geklaut.


Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Rectangle2D;
import javax.swing.*;



public class Pong extends JPanel implements Runnable, KeyListener{

	private static final long	serialVersionUID	= 1L;
	JFrame frame;
	Ball ball;
	Bat bat;
	
	boolean up = false;
	boolean down = false;

	public static void main(String[] args) {
    new Pong();
	}
	
	public Pong(){
		setPreferredSize(new Dimension(400,300));
		
		frame = new JFrame("Pong");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setUndecorated(true);
		frame.add(this);
		frame.pack();
		frame.addKeyListener(this);
		frame.setVisible(true);
		
		ball = new Ball(195,195,10,10,this);
		ball.dx = 70;
		ball.dy = 70;
		
		bat = new Bat(350,200,10,50,this);
		
		Thread t = new Thread(this);
		t.start();
	}

	public void run() {
		
		long delta = 0;
		long last = System.nanoTime();
		
		while(frame.isVisible()){
			
			delta = System.nanoTime() - last;
			last = System.nanoTime();
			
			if(up){
				bat.dy = -120;
			}
			
			if(down){
				bat.dy = 120;
			}
			
			if(!up && !down){
				bat.dy = 0;
			}
			
			ball.doLogic(delta);
			bat.doLogic(delta);
			
			ball.move(delta);
			bat.move(delta);
			
			if(ball.intersects(bat)){
				ball.collide();
			}
			
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {}
			repaint();
		}
		
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		ball.drawBall(g);
		bat.drawBat(g);
		
	}

	public void keyPressed(KeyEvent e) {
		
		if(e.getKeyCode()==KeyEvent.VK_UP){
			up = true;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down = true;
		}
		
	}

	public void keyReleased(KeyEvent e) {
		
		if(e.getKeyCode()==KeyEvent.VK_UP){
			up = false;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down = false;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
			frame.dispose();
		}
	}

	public void keyTyped(KeyEvent e) {
		
	}

}

class Mover extends Rectangle2D.Double {

	private static final long	serialVersionUID	= 1L;
  double dx;
  double dy;
  double modx = 1000000000;
  double mody = 1000000000;
	Pong parent;
  
	public Mover(double mx, double my, double mw, double mh, Pong p){
		super(mx,my,mw,mh);
		parent = p;
	}
	
  public void move(long delta) {
    
    if(dx!=0){
      x += dx*(delta/modx);
    }
    
    if(dy!=0){
      y += dy*(delta/mody);
    }

  }
  
  public void doLogic(long delta){
  	
  	
  	
  }

}

class Ball extends Mover{

	private static final long	serialVersionUID	= 1L;
	
	public Ball(double mx, double my, double mw, double mh, Pong p) {
		super(mx, my, mw, mh, p);

	}	
	
	public void doLogic(long delta){
    super.doLogic(delta);
    
		if(x<0){
			x = 0;
			dx *= -1;
		}
		
		if(y<0){
			y = 0;
			dy *= -1;
		}
		
		if(y+height>parent.getHeight()){
			y = parent.getHeight()-height;
			dy *= -1;
		}
		
		if(x+width>parent.getWidth()){
			x = parent.getWidth()-width;
			dx *= -1;
		}
	}
	
	public void drawBall(Graphics g){
		g.setColor(Color.BLUE);
		g.fillOval((int)x,(int)y,(int)width,(int)height);
	}
	
	public void collide(){
		dx *= -1;
		x = parent.bat.getX()-width;
	}
	
}

class Bat extends Mover{
	
	private static final long	serialVersionUID	= 1L;

	public Bat(double mx, double my, double mw, double mh, Pong p) {
		super(mx, my, mw, mh, p);

	}	
	
	public void doLogic(long delta){
    super.doLogic(delta);
    
		if(y<0){
			y = 0;
			dy = 0;
		}
		
		if(y>parent.getHeight()){
			y = parent.getHeight();
			dy = 0;
		}
		
	}
	
	public void drawBat(Graphics g){
		g.setColor(Color.RED);
		g.fillRect((int)x,(int)y,(int)width,(int)height);
	}
	
	
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Pong java.lang.StackOverflowError Spiele- und Multimedia-Programmierung 3
L Java Ping Pong Spiele- und Multimedia-Programmierung 1
xFearofdarkness Feinde überlappen sich in Java Spiel Spiele- und Multimedia-Programmierung 3
A Minecraft Java Buch fehlermeldung Spiele- und Multimedia-Programmierung 61
yakazuqi Minecraft java.lang.Error: Watchdog Spiele- und Multimedia-Programmierung 3
L Fehler bei "Nochmal Spielen" (Java) Spiele- und Multimedia-Programmierung 1
N Minecraft Java Error Spiele- und Multimedia-Programmierung 6
M "Java Datei" Cannot be resolved to a variable Spiele- und Multimedia-Programmierung 2
1Spinne Minecraft Fabric Modding Java Error Spiele- und Multimedia-Programmierung 2
Joris Minecraft Minecraft Java Server Spiele- und Multimedia-Programmierung 6
Shanic Minecraft Minecraft Forge Server "Falsche Java Version" Spiele- und Multimedia-Programmierung 6
O Browser-basiertes online Pokerspiel mit Java Spiele- und Multimedia-Programmierung 1
M Spiel Mühle-Programmierung Java Spiele- und Multimedia-Programmierung 9
G VST-Plugins in Java verwenden Spiele- und Multimedia-Programmierung 0
P Audio Visualizer mit OpenGL in Java? Spiele- und Multimedia-Programmierung 4
P Snake Java Hilfe Spiele- und Multimedia-Programmierung 4
D Minecraft [Minecraft] Java Start Fehler (Core-Dump) Spiele- und Multimedia-Programmierung 1
T Welche packages aus der java api doku ist hilfreich zur Android Spieleprogrammierung Spiele- und Multimedia-Programmierung 2
A Programmieren eines Memorys mit Java (in Eclipse) Spiele- und Multimedia-Programmierung 5
L Sound in Java Spiel Spiele- und Multimedia-Programmierung 5
C Java findet FluidSynth nicht Spiele- und Multimedia-Programmierung 2
I Java Andere Fenster in Borderless-Mode setzen Spiele- und Multimedia-Programmierung 16
leon_krys Java-Bußgeldrechner Spiele- und Multimedia-Programmierung 5
G [Java/KryoNet/LibGDX] Mutliplayer Packet Frage Spiele- und Multimedia-Programmierung 2
P Website mit Java Backend? Spiele- und Multimedia-Programmierung 1
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
J Fertigungstechnik.. PLS HALP.. Quellcode vom Text in java-Klasse speichern Spiele- und Multimedia-Programmierung 2
E Kalah Java Implementation Spiele- und Multimedia-Programmierung 1
G [Java] Vereinfachung von Boolean Abfragen Spiele- und Multimedia-Programmierung 3
G [LibGDX/Java] ArrayList Object Speicher Spiele- und Multimedia-Programmierung 3
T Java 3D Spiele- und Multimedia-Programmierung 2
A Spielfelder erstellen mit Jogl Java durch ein Koordinaten Array Spiele- und Multimedia-Programmierung 1
J Java Buttons Spiele- und Multimedia-Programmierung 6
T Java Kalender Spiele- und Multimedia-Programmierung 5
Ice4P4rty Java Optische Oberfläche Spiele- und Multimedia-Programmierung 2
MABY Eine mp3 Datei in Java abspielen Spiele- und Multimedia-Programmierung 14
D Java Bomberman Probleme java.lang.NullPointerException Spiele- und Multimedia-Programmierung 1
N Spiele-Menü in Java Spiele- und Multimedia-Programmierung 9
J HDMI Ausgänge mit Java programmieren? Spiele- und Multimedia-Programmierung 18
H Yu-Gi-Oh! Mit Java was tun? Spiele- und Multimedia-Programmierung 6
G Component System Java 2D Game LibGDX Spiele- und Multimedia-Programmierung 6
C Java aus Klasse rausgehen Spiele- und Multimedia-Programmierung 2
MaxG. Java Internet Radio Spiele- und Multimedia-Programmierung 6
G [Java Server] Allgemeine Frage zum Thema Networking in Videospielen Spiele- und Multimedia-Programmierung 15
P java.lang.NoClassDefFoundError: in Greenfoot Spiele- und Multimedia-Programmierung 0
G Java Achsen invertieren Spiele- und Multimedia-Programmierung 2
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
$ Einstieg in Java Game Development Spiele- und Multimedia-Programmierung 11
BraunBerry Java Game Pixel "einfärben" Spiele- und Multimedia-Programmierung 6
BraunBerry Java Game verbesserte Kollisionserkennung Spiele- und Multimedia-Programmierung 18
BraunBerry Java Game Waypoint System Spiele- und Multimedia-Programmierung 3
S Hilfe bei Java Gui Spiele- und Multimedia-Programmierung 2
D Java sound pulseaudio Spiele- und Multimedia-Programmierung 0
David Schwarzbeck Java 3 dimensionale Kollisions Abfrage Spiele- und Multimedia-Programmierung 2
M Gesellschaftsspiel Mühle in Java programmieren Spiele- und Multimedia-Programmierung 3
beatles Java Minesweeper - OS X und Win7 Unterschied Spiele- und Multimedia-Programmierung 2
D Minecraft Java JDK installiert - Minecraft läuft nichtmehr in 64 Bit Spiele- und Multimedia-Programmierung 2
E TMX - Dateien in Java laden Spiele- und Multimedia-Programmierung 1
K Erstellen eines Fotoalbums mit Java Spiele- und Multimedia-Programmierung 8
windl MoviePlayer in Java Spiele- und Multimedia-Programmierung 0
S 2D-Render Probleme LWJGL 2 (Java) Spiele- und Multimedia-Programmierung 1
F Klausurersatz: Ein Java-Programm erstellen und dieses präsentieren. Spiele- und Multimedia-Programmierung 2
E Java Jump and Run Map zu groß Spiele- und Multimedia-Programmierung 14
P java lwjgl Game Spiele- und Multimedia-Programmierung 0
J programm mit java-plugin Spiele- und Multimedia-Programmierung 2
D Java Webgame, welche Frameworks oder Techs sind von Nöten? Spiele- und Multimedia-Programmierung 5
P Java 2D Bug? Spiele- und Multimedia-Programmierung 8
T Problem mit Eclipse (java)-(minecraft) Spiele- und Multimedia-Programmierung 3
R Java App sendet Midi Daten über Flash Spiele- und Multimedia-Programmierung 3
O Java Zeile aus Textdatei zufällig ausgeben Spiele- und Multimedia-Programmierung 8
K Bestes Bildformat für Spielegrafiken und deren Einbindung in Java Spiele- und Multimedia-Programmierung 2
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Spiele- und Multimedia-Programmierung 1
T Alle Referenzen zu einer Klasse aus Java Bytecode ersetzt, JVM sucht trotzdem diese Klasse Spiele- und Multimedia-Programmierung 1
J Java Kollisionsabfrage Spiele- und Multimedia-Programmierung 21
Flo. android java tastatureingaben abfangen. Spiele- und Multimedia-Programmierung 1
J Java Steuerberechnung hilfe Spiele- und Multimedia-Programmierung 17
C Export als .jar funktioniert nicht richtig (JAVA 3D) Spiele- und Multimedia-Programmierung 5
P Java Grafiken mit Rechnungen verknüpfen Spiele- und Multimedia-Programmierung 4
U Minecraft Mit Java auf Minecraft Server anmelden Spiele- und Multimedia-Programmierung 11
F Das sag mir einer Java ist plattform unabhänig ! Spiele- und Multimedia-Programmierung 10
C virtueller stereomix (java sound API) Spiele- und Multimedia-Programmierung 0
S Engine2D - Java 2D Engine Spiele- und Multimedia-Programmierung 20
J Java Game performance Probleme Spiele- und Multimedia-Programmierung 7
C Java Kollisionserkennung Spiele- und Multimedia-Programmierung 4
U Blender in Java Spiele- und Multimedia-Programmierung 8
J Java Fussballspiel Player-KI in der Bewegungsphase Spiele- und Multimedia-Programmierung 4
K Java 15/Slide/Boss Puzzle Spiele- und Multimedia-Programmierung 2
T Java 3D - Step oder IGES Spiele- und Multimedia-Programmierung 1
H 3D Spiele mit Java - Diskussion Spiele- und Multimedia-Programmierung 35
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
M Bilder in Java Spiele- und Multimedia-Programmierung 7
A Minecraft Java Ubuntu Minecraft Server startet nicht - ERROR (SIGSEGV) Spiele- und Multimedia-Programmierung 7
N Minecraft java lernen minecraft Spiele- und Multimedia-Programmierung 20
J 2d Ansicht mit Java 3d Spiele- und Multimedia-Programmierung 13
F Abbyy finereader aus java starten, Ergebnis zurück? Spiele- und Multimedia-Programmierung 2
P Zeichenübungen mit Java Spiele- und Multimedia-Programmierung 4
M Minecraft weitere Java Entwickler für minecraft projekt gesucht Spiele- und Multimedia-Programmierung 0
I Minecraft Java programmierungs fehler "MineCraft" Spiele- und Multimedia-Programmierung 6
J Java 2D Sicht Spiele- und Multimedia-Programmierung 13
H wma Datei abspielen: java.io.IOException: Resetting to invalid mark Spiele- und Multimedia-Programmierung 11

Ähnliche Java Themen

Neue Themen


Oben