Verständnishilfe - Netzwerk Spiel (Sockets)

Raziell

Bekanntes Mitglied
Hallo zusammen,
bräuchte ein bisschen Unterstützung und Hilfe von euch bei der Programmierung
eines Netzwerk-Spiels (angelehnt an ein MMORPG) mit Hilfe von Sockets.

Meine Vorstellung:

1. Der Client sendet eine Tastendruck an den Server (Bsp.: l, r ,u ,o)
2. Der Server kennt natürlich die Position des Spielers und berechnet ständig die neue Position
3. Es soll eine Klasse Player geben, welche dann z.B. Attribute wie x und y Position des Spielers hat.
4. Der Server hat dann für jeden Spieler ein Objekt der Klasse Player z.B. in einem Vector gespeichert.
5. Der Server soll dann eine Klasse haben, welche z.B. alle 30ms die neuen x und y Position aller Spieler an alle Clients sendet.

Die Frage wäre jetzt, wie ich dieses Update der Spielerpositionen aufbauen sollte?
Ich habe mir das ganze jetzt in etwa so vorgestellt:

Ich durchlaufe alle Spieler, hole mir deren ID sowie x und y Position und baue meinen
String so zusammen. Der sendDates() Methode übergebe ich diesen String.
Die sendDates() Methode durchläuft alle verbundenen Sockets und sendet den String an
jeden Client.

Java:
		String playerCoordinates = "";
		for (int i = 0; i < players.size(); i++) {
			playerCoordinates += players.elementAt(i).getID() + ":" + players.elementAt(i).getXPos() + ":" + players.elementAt(i).getYPos() + ";";
		}
		server.sendDates(playerCoordinates);

Macht das ganze so Sinn oder wird der String die Leitung verstopfen? Dieser kann ja dann
durchaus, bei vielen Spielern auch etwas länger ausfallen ;)


Vielen Dank im Voraus

Grüße
 
G

Gast2

Gast
Die Frage wäre jetzt, wie ich dieses Update der Spielerpositionen aufbauen sollte?
Asynchron - wirst um Threads nicht herum kommen

ein UDP-Port nimmt die Bewegungswünsche der Spieler entgegen ... der Berechnungs-Thread berechnet permanent die neue Position auf Grund der Wünsche ... die neuen Positionen sendet er via UDP wieder zurück

hand, mogel
 

Raziell

Bekanntes Mitglied
ein UDP-Port nimmt die Bewegungswünsche der Spieler entgegen ... der Berechnungs-Thread berechnet permanent die neue Position auf Grund der Wünsche ... die neuen Positionen sendet er via UDP wieder zurück

Also derzeit habe ich serverseitig sowieso einen Thread für jede Socketverbindung,
welcher ständig auf eingehende Informationen horcht. Dazu wird serverseitig ein weiterer Thread
für jeden Spieler kommen, welcher permanent die Statusänderungen durchführt.

Ich arbeite mit TCP (Diskussionen darüber sind hier: http://www.java-forum.org/netzwerkprogrammierung/98523-verstaendinsfrage-spieleprogrammierung-datagrammsocket.html zu finden)

Die Frage ist ob es Sinn macht, den Updateprozess der Koordinaten vom Server an die Clients
so aufzubauen wie ich es geschildert habe?


Grüße
 

Raziell

Bekanntes Mitglied
Hallo zusammen,

ich habe ein paar Probleme und weiss nicht wie ich sie lösen soll.
Die Probleme beziehen sich auf folgendes:

Derzeigt bewegt sich der Spieler clientseitig und sendet die Änderung der Bewegungsrichtung
an den Server (bzw. ein Stopp, wenn er sich nicht mehr bewegt).
Der Server kennt natürlich die Position des Spielers und berechnet ständig die neue Position.

Das ganze läuft serverseitig in eta so ab:

Java:
package de.game.server.logic.player;

import de.game.globalObjects.GSocket;

public class Player_Update_Thread extends Thread {

	private GSocket playerSocket = null;
	private double pos = 1.8;
	private String direction = "s";
	private double x = 0;
	private double y = 0;

	public Player_Update_Thread(GSocket playerSocket) {
		this.playerSocket = playerSocket;
		x = playerSocket.getX();
		y = playerSocket.getY();
		start();
	}

	@Override
	public void run() {
		while (true) {
			while (!direction.equals("s")) {
				updatePosition();
			}
		}
	}

	public void updatePosition() {
		if (direction.equals("l")) {
			playerSocket.setX(x -= pos);
		}
		if (direction.equals("r")) {
			playerSocket.setX(x += pos);
		}
		if (direction.equals("u")) {
			playerSocket.setY(y -= pos);
		}
		if (direction.equals("d")) {
			playerSocket.setY(y += pos);
		}
		//		System.out.println("x Pos @ Server: " + playerSocket.getX());
		//		System.out.println("y Pos @ Server: " + playerSocket.getY());
		try {
			Thread.sleep(30);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public void setPosition(String content) {
		direction = content;
	}

}

Der Server sendet alle 30ms ein Positionsupdate an alle Clients.

Das große Problem ist jetzt unter anderem, dass ich nicht weiss
wie ich mich serverseitig bewegen soll. Auf Clientseite sind es in etwa 1,8 Pixel oder was auch immer (mit Rectangle2D.Double errechnet) pro 30ms.
Wenn ich jetzt serverseitig sage das er alle 30ms die Position in die jeweilige
Richtung ändern soll bis ein Stop kommt, dann haut das mit den Position auf clientseite nicht wirklich hin.
Die Differenzen liegen dann immer so bei 5-11 Pixel. Das heisst ich müsste dann bei jedem
Serverupdate die Position auf Clientseite korrigieren.

Kann mir jmd. helfen bei dem Problem?

Danke und viel Grüße im Voraus
 
Zuletzt bearbeitet:
G

Gast2

Gast
vergiss die Pixel ... rechne auf Serverseite mit Koordinaten ... der Client rechnet das dann wieder in Pixel um
 

Raziell

Bekanntes Mitglied
Hm also ich rechne ja beidseitig mit Koordinaten. Und zwar erbt mein Sprite von Rectangle2D.Double. Die Position wird dann mit setX() und setY() gesetzt.
 

Raziell

Bekanntes Mitglied
Hallo zusammen,
ich habe da noch ein Problem, für das ich einfach keine Lösung finde.
Und zwar geht es immernoch um das serverseitige berechnen der Koordinaten. Ich rechne ja auf Clientseite mit Rectangle2D.Double. Aber wie soll ich serverseitig rechnen? Wenn ich mich auf Client-Seite um etwa 1,8 bewege, um wieviel soll ich mich denn dann serverseitig bewegen?

Wenn ich einfach sage das er serverseitig auch ca. 1,8 innerhalb von 30ms bewegt, dann laggt
er über Internet ganz schön rum, da die Serverposition sich einfach zu sehr von der Clientposition
unterscheidet.

Das ganze Problem wird ja auch in meinem vierten Post beschrieben.

Danke im Voraus
 
Zuletzt bearbeitet:
G

Gast2

Gast
Du bewegst Dich auf dem Server um X Units ... dann bewegst Du Dich auf dem Client um X Units ... somit ist die Bewegung erstmal gleich ... anschließend bildest Du die Bewegung auf die Darstellung ab ... Du bewegst Dich also um Y Pixel ... die Abbildung von X Units auf Y Pixel sollte eine einfache Skalierung sein
 

Raziell

Bekanntes Mitglied
Hm sorry ich verstehs leider nicht so ganz,
also ich dachte mir das es so abläuft, das ich z.B. auf clientseite links drücke und
mich dann sagen wir mal auf gut glück links bewege. Währenddessen berechnet der
Server, der vom Client die Bewegungsrichtung erhalten hat die neue Position. Der Server schickt dann
beispielsweise alle 30ms die neuen Positionen aller Clients an alle Clients. Die Clients korriegieren dann
ihre Positionen und passen Sie den Positionen vom Server an.
Ist mein Gedanke so richtig? Wie kriege ich denn das ganze so synchronisiert, dass die Positionen auf clientseite mit der berechneten Bewegung auf serverseite möglichst gleich sind. Ohne das die Spieler rumzucken.

Meinst du das ich mich auf clientseite nicht auf Gut Glück sondern erst auf Antwort vom Server bewegen soll?

Grüße
 

Raziell

Bekanntes Mitglied
schönrechnen ist das zauberwort: interpolation, prediction, google

Das mache ich schon, ich berechne auch die Positionen zwischen den erhaltenen Koordinaten.
Allerdings bringt mir das nicht sonderlich viel, wenn sich die Positionen auf clientseite
zu sehr von den Positionen auf serverseite unterscheiden.

Die Frage wäre ja auch noch offen:
Wie kriege ich denn das ganze so synchronisiert, dass die Positionen auf clientseite mit der berechneten Bewegung auf serverseite möglichst gleich sind. Ohne das die Spieler rumzucken.

Meinst du das ich mich auf clientseite nicht auf Gut Glück sondern erst auf Antwort vom Server bewegen soll?

Gruß
 
Zuletzt bearbeitet:

Raziell

Bekanntes Mitglied
Hi,
also wäre dein Vorschlag die Figur auf clientseite wirklich nur dann zu bewegen, wenn
ein Update vom Server kommt und den Rest zwischendurch zu interpolieren?

Dein Client schickt den move-Befehl und aktualisiert sich dann shconmal selbst, damit die Bewegung sofort spürbar ist.
Das wird dann aber nicht gegeben sein oder?

Ich denke das größte Problem ist, dass ich dadurch dass sich Client- und Serverposition immer ein wenig unterscheiden, muss ich auf Clientseite die Positionen aller Spieler nach jedem Update vom Server
anpassen. Das belastet den Client und sorgt für ruckelige Bewegungen.

Also ich denke es gibt 2 Möglichkeiten das Problem zu lösen.

1. Ich muss irgendwie dafür sorgen das die Client- und Server-Position immer gleich ist. Wüsste allerdings nicht wie das klappen sollte.

2. Die Positionen aller Spieler auf clientseite nicht nach jedem Serverupdate sondern beispielsweise nur alle 100ms anpassen. Richtungsänderungen entgegennehmen und interpolieren.

Ich weiss garnicht ob ich mich überhaupt verständlich ausdrücke. Versteht eigtl. jmd. was ich meine? :)


Grüße
 
G

Gast2

Gast
1. Ich muss irgendwie dafür sorgen das die Client- und Server-Position immer gleich ist. Wüsste allerdings nicht wie das klappen sollte.
nie ... da gibt es zuviele unbekante Variablen

2. Die Positionen aller Spieler auf clientseite nicht nach jedem Serverupdate sondern beispielsweise nur alle 100ms anpassen. Richtungsänderungen entgegennehmen und interpolieren
damit machst Du es nur schlimmer ... Du musst an Deiner Interpolation feilen
 

Raziell

Bekanntes Mitglied
Hat jmd. eventuell ein paar Tipps wie ich das Anpassen und Interpolieren der Positionen am besten lösen kann? Irgendwie fehlt mir der Ansatz. Ich habe auf clientseite Positionen und Bewegungsrichtungen aller Spieler, welche alle 30ms vom Server kommen.

Den Korrekturvorgang löse ich momentan so:

Java:
	public void correctPlayerPositions(String content) {
		// Splitten der Speilerdaten vom Server ([0] Spieler-ID, [1,2] Spielerpositionen (x, y), [3] Bewegungsrichtungen)
		String[] players = content.split(";");
		for (int i = 0; i < players.length; i++) {
			String[] playerData = players[i].split("/");
			// Wenn ID = Eigene ID
			if (Integer.parseInt(playerData[0]) == id) {
				// Korrektur der eigenen Koordinaten
				gamePanel.receiveCoordinates(Double.parseDouble(playerData[1]), Double.parseDouble(playerData[2]));
				// Wenn nicht ID = Andere Spieler ID
			} else {
				for (int j = 0; j < gamePanel.getActors().size(); j++) {
					if (gamePanel.getActors().get(j) instanceof Actor) {
						if (playerData[0].equals(((Actor) gamePanel.getActors().get(j)).getId())) {
							// Korrektur der Koordinaten der anderen Spielfiguren
							gamePanel.getActors().get(j).setX(Double.parseDouble(playerData[1]));
							gamePanel.getActors().get(j).setY(Double.parseDouble(playerData[2]));
							// Setzen der neuen Bewegungsrichtung der anderen Spielfiguren (Interpolation) Die Bewegung der Spielfiguren findet immer statt
							if (playerData[3].equals("u")) {
								gamePanel.getActors().get(j).setVerticalSpeed(-speed);
								gamePanel.getActors().get(j).setHorizontalSpeed(0);
							} else if (playerData[3].equals("d")) {
								gamePanel.getActors().get(j).setVerticalSpeed(speed);
								gamePanel.getActors().get(j).setHorizontalSpeed(0);
							} else if (playerData[3].equals("r")) {
								gamePanel.getActors().get(j).setHorizontalSpeed(speed);
								gamePanel.getActors().get(j).setVerticalSpeed(0);
							} else if (playerData[3].equals("l")) {
								gamePanel.getActors().get(j).setHorizontalSpeed(-speed);
								gamePanel.getActors().get(j).setVerticalSpeed(0);
							} else {
								gamePanel.getActors().get(j).setHorizontalSpeed(0);
								gamePanel.getActors().get(j).setVerticalSpeed(0);
							}
						}
					}
				}
			}
		}
	}

Ich weiss das ganze ist unschön und klappt auch nicht besonders gut :oops:

Ich hoffe mal jmd. kann mir helfen...

Grüße
 
G

Gast2

Gast
Du musst die letzten X Positionen des Spielers merken und kannst dann über den Durchschnitt die nächste mögliche Position berechnen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Minecraft Suche Plugin Developer für Minecraft Netzwerk! Spiele- und Multimedia-Programmierung 2
Blender3D VlCJ Windows 10 kein Zugriff auf einen im Netzwerk freigegebnen Ordner Spiele- und Multimedia-Programmierung 2
M Netzwerk-Game mit UDP Spiele- und Multimedia-Programmierung 8
O Suche Tutorial zum Aufbau von großen Spielen(mit Multiplayer über Netzwerk...) Spiele- und Multimedia-Programmierung 3
A 2D-Netzwerk-Rennspiel Spiele- und Multimedia-Programmierung 2
R TankWarZ - Netzwerk - Tester gesucht Spiele- und Multimedia-Programmierung 13
M Netzwerk sodoku Spiele- und Multimedia-Programmierung 13
J java netzwerk strategie game programmiert Spiele- und Multimedia-Programmierung 4
R Netzwerk Dame Spiele- und Multimedia-Programmierung 4
B Server für Spiel aufsetzen, was Shutdown ist Spiele- und Multimedia-Programmierung 3
xFearofdarkness Feinde überlappen sich in Java Spiel Spiele- und Multimedia-Programmierung 3
ItundMathe1994 TicTacToe Spiel programmieren Spiele- und Multimedia-Programmierung 2
JEP1 Hilfe bei Spiel Spiele- und Multimedia-Programmierung 1
P Pokemon Spiel Funktioniert nicht ? Spiele- und Multimedia-Programmierung 3
Leon.tr3x Mein erstes Programm/Spiel Spiele- und Multimedia-Programmierung 10
O Texas Hold'em Poker als Online-Spiel mit Freunden Spiele- und Multimedia-Programmierung 5
Drachenbauer Speicher-Tool für ein Spiel schreiben Spiele- und Multimedia-Programmierung 13
M Spiel Mühle-Programmierung Java Spiele- und Multimedia-Programmierung 9
Excess Spiel abzugeben Spiele- und Multimedia-Programmierung 1
I Superhelden - Spiel Spiele- und Multimedia-Programmierung 14
E Hauptmenü und Spiel ???? Spiele- und Multimedia-Programmierung 2
L Sound in Java Spiel Spiele- und Multimedia-Programmierung 5
R Interaktives Spiel Spiele- und Multimedia-Programmierung 5
L Spiel im Editor testen Spiele- und Multimedia-Programmierung 4
Jackii dispatchUncaughtException in Quiz Spiel mit GUI Layout Spiele- und Multimedia-Programmierung 6
D Textbasiertes Spiel Spiele- und Multimedia-Programmierung 8
K Android Spiel Programmieren Spiele- und Multimedia-Programmierung 6
L BrickBreaker Spiel Spiele- und Multimedia-Programmierung 3
A Spiel Figur ansprechen und bewegen Spiele- und Multimedia-Programmierung 3
it_is_all Dialogbox im Spiel - Text in Blöcke aufteilen Spiele- und Multimedia-Programmierung 4
F Koordinieren und Essen von Snake - Spiel Spiele- und Multimedia-Programmierung 14
G Entity Verwaltung in einem 2D Spiel Spiele- und Multimedia-Programmierung 1
E Möchte Spiel Programmieren Spiele- und Multimedia-Programmierung 7
S Connect6 Spiel - Code in ei Spiele- und Multimedia-Programmierung 2
A Spiel nach Abfrage beenden oder neustarten Spiele- und Multimedia-Programmierung 1
G Welten Generierung 2D Spiel Spiele- und Multimedia-Programmierung 4
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
N Problem mit 2D Spiel Spiele- und Multimedia-Programmierung 17
T Probleme bei "Pixel-Fighting"-Spiel: Unausgewogene Mannschaften??? Spiele- und Multimedia-Programmierung 4
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
L Coordinate Space JavaFX 2d Spiel Spiele- und Multimedia-Programmierung 0
C Vier Gewinnt Spiel Programmiertipp Spiele- und Multimedia-Programmierung 11
N Jump and run Spiel - wo anfangen / weitermachen? Spiele- und Multimedia-Programmierung 11
K Spiel zum zuordnen von Dienstgraden und Dienstgradabzeichen Spiele- und Multimedia-Programmierung 5
M Textbasiertes Spiel programmieren Spiele- und Multimedia-Programmierung 4
T 2d-Spiel Licht Spiele- und Multimedia-Programmierung 5
S Jump 'n' Run-Spiel Kollisionserkennung Spiele- und Multimedia-Programmierung 3
T Spiel rendern Spiele- und Multimedia-Programmierung 2
Grevak Sounds im Spiel Spiele- und Multimedia-Programmierung 5
B Fehlerhafte Mob Bewegungen in Tower Defense Spiel Spiele- und Multimedia-Programmierung 2
F Spiel ähnlich wie SimCity/o.ä programmieren Spiele- und Multimedia-Programmierung 5
X Erklärung zu einem Tic Tac Toe Spiel Spiele- und Multimedia-Programmierung 1
I Spectator Modus für Spiel ähnlich zu Terraria Spiele- und Multimedia-Programmierung 8
I Textbasiertes Spiel - Umsetzungsfrage & Schleifen Problem Spiele- und Multimedia-Programmierung 26
M Kollisions abfrage bei 3D spiel? Spiele- und Multimedia-Programmierung 12
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Spiele- und Multimedia-Programmierung 1
P [Spiel]Welche Bilder sind gleich Spiele- und Multimedia-Programmierung 2
E GUI zum Spiel hinzufügen Spiele- und Multimedia-Programmierung 19
S 2D Spiel - Physics Spiele- und Multimedia-Programmierung 16
S 2D Spiel "Der Sprung" Spiele- und Multimedia-Programmierung 7
A 2D Spiel ohne Tiles Spiele- und Multimedia-Programmierung 10
V welche vorgehensweise beforzieht ihr bei einfachem Quizz Spiel ? Spiele- und Multimedia-Programmierung 4
S Quaxli's Heli Spiel läuft nicht nach Plan Spiele- und Multimedia-Programmierung 2
G Methode sleepen während das Spiel weiterläuft Spiele- und Multimedia-Programmierung 3
T Spiel Überprüfung Spiele- und Multimedia-Programmierung 3
P Spiel laggt nach unbestimmter Zeit tierisch. Spiele- und Multimedia-Programmierung 27
S Hilfe bei Spiel Spiele- und Multimedia-Programmierung 6
B Hauptmenü für Spiel Spiele- und Multimedia-Programmierung 1
W Spiel ist langsam/laggt Spiele- und Multimedia-Programmierung 18
J Ascii Spiel Spiele- und Multimedia-Programmierung 1
Androbin Mein Spiel will sich nicht zeichnen lassen !!! Spiele- und Multimedia-Programmierung 7
O Vollständige Musik in Spiel einbauen (wav - Format) Spiele- und Multimedia-Programmierung 8
Y Quiz Spiel Spiele- und Multimedia-Programmierung 1
J Conways Spiel des Lebens nachprogrammiert Spiele- und Multimedia-Programmierung 1
B Spiel Programmieren, die Anfänge Spiele- und Multimedia-Programmierung 6
D [OpenGL] Spiel in der Art von Age of Empires Spiele- und Multimedia-Programmierung 4
lord239123 suche Graphiker für ein Pokemon-Spiel Spiele- und Multimedia-Programmierung 6
S Spiel installeren lassen und organisieren Spiele- und Multimedia-Programmierung 3
J Lichtupdate in tile-basiertem Spiel Spiele- und Multimedia-Programmierung 4
P Erstes Spiel (Strategie) Spiele- und Multimedia-Programmierung 31
J Mein erstes Spiel [Spielevorstellung] Spiele- und Multimedia-Programmierung 2
Bananabert Spiel Renderer Images und Strings Spiele- und Multimedia-Programmierung 4
N Spiel Menü error ! Spiele- und Multimedia-Programmierung 5
S Anfangsmenü mit Spiel verknüpfen Spiele- und Multimedia-Programmierung 16
S Spiel ruckelt trotz 50 fps Spiele- und Multimedia-Programmierung 16
D Spiel-Bilddaten auswerten Spiele- und Multimedia-Programmierung 7
Creylon [LWJGL] Spiel Exportieren Spiele- und Multimedia-Programmierung 2
L Hilfe bei Klassendesign für Spiel Spiele- und Multimedia-Programmierung 2
Devil0s Spiel laggt trotz 90 FPS (bei der Anzeige) Spiele- und Multimedia-Programmierung 9
N Webanwendung als eine Art Spiel Spiele- und Multimedia-Programmierung 8
L Korrekte Darstellung von Wasser in 2D Spiel Spiele- und Multimedia-Programmierung 4
F Ideen für spiel Spiele- und Multimedia-Programmierung 4
J wohin mit der Logik des Spiel Spiele- und Multimedia-Programmierung 2
R Experimente mit Quaxlis Spiel Spiele- und Multimedia-Programmierung 12
W Spiel-Grundlagen selbst austüfteln: Kollisionen? Spiele- und Multimedia-Programmierung 3
Kenan89 Java 2D Spiel Spiele- und Multimedia-Programmierung 39
M Automaten Spiel Spiele- und Multimedia-Programmierung 27
J Tic tac toe spiel Neustart Spiele- und Multimedia-Programmierung 5
S 2D Spiel im Vollbild langsamer als im Fenster Spiele- und Multimedia-Programmierung 11
A TicTacToe Spiel Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen


Oben