Multiplayer-Game u. zu übermittelnde Daten-Pakete

Alles rund um die Programmierung mit Qt
Antworten
MADsCIENTIST

Multiplayer-Game u. zu übermittelnde Daten-Pakete

Beitrag von MADsCIENTIST »

Hallo liebe Community,

ich bin derzeit mit der Entwicklung eines eigenen Multiplayer-Spiels in SFML
beschäftigt u. hänge im Netzwerk-Teil (QTcpxxx) an der Stelle fest, wo es
um den Austausch von Daten zwischen den Clients u. dem Server geht!
=> SFML für vereinfachtes OpenGL-Rendering, Qt für Spielmenüs

Das Problem liegt dabei nicht in der Übermittlung selbst, sondern in der Form der
zu übertragenden Daten.

Kurzinfo:
Positionsänderungen, Kollisionsberechnungen etc. werden alle serverseitig
ausgeführt u. die entspr. Informationen sollen dann an die Clients
weitergeleitet werden.

Dementsprechend sollen clientseitig nur die allernötigsten Informationen
an den Server geschickt werden, um Cheating so gut wie möglich zu verhindern.
=> z. B. Maus-Movement-Up

Bevor ich jetzt aber wieder auf die eigentliche Kernfrage meines Threads,
nämlich nach der Form der zu übertragenden Informationen, zurückkomme,
möchte ich auf den Einsatz von QThreads näher eingehen.

Ich besitze zwar bislang keinerlei Lektüren über Game-Development, jedoch
weiß ich aus zahlreichen Internet-Recherchen, dass das Game-Rendering,
-Audio, -Networking, -Control, -AI etc. voneinander getrennt werden sollte.

Meine Hauptklasse, welche alle relevanten Spiel-Elemente [Menüs,
Netzwerk-Sessions (Guest/Host) etc.] aufweist, sieht wie folgt aus:

Code: Alles auswählen

class MainWindow : public WindowStack
{
	Q_OBJECT
public:
	MainWindow(QWidget *parent = 0);

signals:
	void exitApp();

private slots:
	// for hosting/joining a session
	void handleHostSession(); // impulse from within the hostmenu
	void requestJoinSession(); // impulse from within the joinmenu

	// for handling the host's session
	void handleHostConnect();
	void handleHostClose();

	// for handling the client's session
	void handleClientConnect(const QString&);
	void handleClientDisconnect(const QString&);
	void handleClientCxEstablishment(const QString&);
	
	// for menu navigation
	void switchToHostScreen();
	void switchToJoinScreen();
	void switchToMainScreen();

private:
	// for the menu
	MainMenu		*mainMenu;
	HostMenu		*hostMenu;
	JoinMenu		*joinMenu;

	// for the network part
	HostSession		*hostSession;
	GuestSession	*guestSession;

	// for the game itself
	InGame			*game;
};
Wie zu erkennen ist, sind der Netzwerk- (hostSession/guestSession) u.
Render-Part (game) bislang nicht voneinander getrennt.

Diese muss ich jeweils durch eine QThread-Instanz ersetzen.

Frage #2:
Wie hat die Deklaration/Definition eines solchen QThreads stattzufinden?

Die SIGNAL&SLOT-IPC zwischen den einzelnen QThread-Objekten werde ich
dann einfach mittels Qt::QueuedConnection handeln lassen!



Nun aber zurück zu meiner eigentlichen Frage (#1):
Nehmen wir mal an, das eine korrekte Verbindung zwischen einem
Client u. dem Server eingerichtet wurde u. die Probanden nun auf die
Übermittlung von Informationen des jeweils anderen warten.

Wenn nun der Client beispielsweise eine Mausbewegung nach oben ausführt,
sollte ich dann solch eine Information wie folgt als String übermitteln?
(der Name des Clients ist dabei ja nicht wichtig, weil dieser durch den QTcpSocket
auf der Serverseite ausgemacht werden kann)
=> "mouse_mov_up#"

Man beachte dabei das - für Client u. Server ersichtliche - Paket-Ende-Zeichen '#',
welches ich beispielhaft hinzugefügt habe.

Die Auswertung erfolgt natürlich dann individuell für Server u. Client., also, dass
der Server im obigen Fall dann beispielsweise an alle anderen Clients die selben
Informationen, nur eben mit vorangehängtem Clientnamen, weiterleitet.
=> "client1_mouse_mov_up#"

Wäre das so denkbar oder gibt es eine bessere Alternative?


Hoffe jemand kann mir helfen.
Bedanke mich für sinnvolle Hilfe schon mal im Voraus. :D
Antworten