![]() |
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.
|
|
|
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: [ 884 ]
|
|
|