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;
};
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.