Tipp 0440 Client/Server-Spiel (einfach)
Autor/Einsender:
Datum:
  Alexander Csadek
01.03.2005
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 8
Der Einsatz von einer Peer-to-Peer-Verbindung mit DirectPlay ist in Tipp Chat (Peer-to-Peer) ausführlich erklärt. Dieser Tipp beschäftigt sich mit der anderen Art der Verbindung, die auch von DirectPlay unterstützt wird.
Bei der Client/Server-Verbindung gibt es zwei getrennte Programme. Eines übernimmt die Aufgabe des Servers und das andere die Aufgaben der Clients. Im Server-Programm ist keine Funktionalität der Clients und umgekehrt im Client-Programm keine des Servers. Dies ist auch an den verwendeten Objekten ersichtlich. Der Server verwendet vom DirectPlay das DirectPlay8Server-Objekt und die Clients das DirectPlay8Client-Objekt.
Bei Client/Server kommunizieren die Clients ausschließlich mit dem Server. Eine direkte Verbindung der Clients ist nicht möglich. Sollte das in eurem Spiel aber so gewünscht sein, so müsst ihr die beiden Programme entsprechend erweitern.
An einem ganz einfachen Spiel wird der Einsatz von Client/Server veranschaulicht. In diesem Spiel kann nur eines gemacht werden, allen anderen Teilnehmern die Zunge zeigen ;-)
Beendet der Server das Programm bzw. die DirectPlay-Session, so kann von keinem Client die Host-Funktion übernommen werden. Das Spiel ist dann beendet.
Vorab sei erklärt, dass jedes Programm welches DirectPlay verwendet, eine eindeutige GUID haben muss. Diese kann von DirectX mittels der Funktion CreateNewGuid erstellt werden.
Einen Chat oder ein Spiel zu erstellen (hosten) ist nicht schwer. Die ApplicationDescription (DPN_APPLICATION_DESC) wird ausgefüllt. Eine PlayerDescription braucht der Server nicht, da er selbst kein tatsächlicher Spieler ist. Ein Service-Provider (Protokoll) wird gewählt. Schon kann mittels der Methode Host des DirectPlay-Objekts ein Spiel gehostet werden.
Die Teilnehmer (Clients) müssen sich nur mehr verbinden. Dafür sollte das Programm die verfügbaren Spiele (Sessions) auflisten können. Dafür gibt es die Methode EnumHosts des DirectPlay-Objekts. Zu beachten ist hierbei, dass die Funktion asynchron arbeitet. Wird die Methode aufgerufen, meldet sich DirectPlay mittels dem DirectPlay8Event_EnumHostsResponse Event sobald es Spiele-Server bzw. Sessions gefunden hat.
Beim Verlassen eines Clients vom Spiel sollte das Programm dem DirectPlay ein wenig Zeit lassen die letzte Nachricht zu verschicken, damit der Server auf normalen Weg mitbekommt, dass ein Teilnehmer das Spiel verlassen hat und er dann alle anderen darüber informieren kann.
Wie bereits erwähnt, bei Client/Server kommunizieren die Clients nur mit dem Server. Der Server muss dafür sorgen, dass alle anderen Clients die neuen Informationen bekommen. Die Nachrichten werden vom Server mit der Methode SendTo des DirectPlay-Objekts verschickt, und von den Clients mit der Methode Send. Verschickt der Server eine Nachricht bekommen alle Clients ein Receive-Event, wenn hingegen ein Client eine Nachricht verschickt, bekommt nur der Server das Event.
Im Gegensatz zu DirectX 7 arbeitet DirectPlay unter DirectX 8 hauptsächlich mit Events (Ereignissen). Das bedeutet, ihr müsst in einer Form (Fenster) eures Programms die DirectPlay8Events implementieren.
 
Implements DirectPlay8Event
 
Wichtig ist, dass ihr dann alle Events in eurer Form habt. Egal ob ihr sie verwendet oder nicht. Ihr könnt euer Programm sonst nicht kompilieren.
Folgende DirectPlay8-Ereignisse müssen in der Form vorhanden sein:
AddRemovePlayerGroup Tritt ein, wenn ein Spieler oder eine Gruppe einer Gruppe hinzugefügt oder entfernt wird.
AppDesc Tritt ein, wenn sich die Applikationsbeschreibung (AppDescription) geändert hat.
AsyncOpComplete Tritt ein, wenn eine asynchrone Operation fertig ist.
ConnectComplete Tritt ein, wenn die Verbindung zu einem Host oder Server hergestellt wurde.
CreateGroup Tritt ein, wenn eine Gruppe erstellt wurde (jemand ist dem Chat beigetreten).
CreatePlayer Tritt ein, wenn ein Spieler erstellt wurde.
DestroyGroup Tritt ein, wenn eine Gruppe entfernt wurde.
DestroyPlayer Tritt ein, wenn ein Spieler entfernt wurde (jemand hat den Chat verlassen).
EnumHostsQuery Tritt ein, wenn die Suche nach Hosts aufgerufen wurde.
EnumHostsResponse Tritt ein, wenn Hosts gefunden wurden.
HostMigrate Tritt ein, wenn der Host die Session verlassen hat und ein anderer Teilnehmer die Host-Funktion bekommt.
IndicateConnect Tritt ein, wenn ein Teilnehmer sich zum Host verbinden möchte.
IndicateConnectAborted   Tritt ein, wenn der Host den Teilnehmer nicht in die Session gelassen hat.
InfoNotify Tritt ein, wenn sich die Beschreibung (Description) von einem Client, Server, Peer (Spieler) oder Group geändert hat.
Receive Tritt ein, wenn eine Nachricht gekommen ist.
SendComplete Tritt ein, wenn der Empfänger die Nachricht erhalten hat.
TerminateSession Tritt ein, wenn die Session beendet wurde (bekommt jeder Teilnehmer).
Aufgrund der Events und dem Umstand, dass DirectPlay fast nur noch asynchron arbeitet, müssen einige Dinge beachtet werden. Beispielsweise muss das Programm darauf achten, dass die gefundenen Hosts und Server entsprechend verarbeitet werden bzw. die asynchrone Operation beendet wird, Wenn sich ein Teilnehmer bzw. Client sich zu einem Host oder Server verbinden (connecten) will, muss auf das ConnectComplete-Event geachtet werden.
Hinweis
Um dieses Beispiel ausführen zu können, wird die DirectX 8 for Visual Basic Type Library benötigt (siehe dazu die Erläuterungen in der DirectX-Rubrik).

Windows-Version
95
98
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (15,1 kB) Downloads bisher: [ 799 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Dienstag, 17. Mai 2011