Tipp 0439 Chat (Peer-to-Peer)
Autor/Einsender:
Datum:
  Alexander Csadek
01.03.2005
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 8
Der einfachste Einsatz für DirectPlay ist mit Sicherheit ein Peer-to-Peer-Chat.
Im Gegensatz zu einem Client/Server-Chat kommuniziert bei Peer-to-Peer jeder Client direkt mit dem anderen. Das Programm muss dabei beide Funktionen unterstützen, also Server und Client. Der Vorteil dabei ist, sollte der Teilnehmer, der den Chat gestartet hat, diesen verlassen, so bekommt ein anderer Teilnehmer automatisch die Host-Funktion.
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) und die PlayerDescription (DPN_PLAYER_INFO) wird ausgefüllt und ein Service-Provider (Protokoll) 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 Chats (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 Chats bzw. Sessions gefunden hat.
Beim Verlassen des Chats sollte das Programm dem DirectPlay ein wenig Zeit lassen die letzte Nachricht zu verschicken, gerade dann, wenn es sich um dem Host, also dem Teilnehmer handelt, der die Host-Funktion inne hat. Verlässt dieser den Chat, bekommt ein anderer Teilnehmer automatisch die Host-Funktion.
Die Nachrichten werden mit der Methode SendTo des DirectPlay-Objekts verschickt. Bei jedem Teilnehmer wird dann das Receive-Ereignis ausgelöst.
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.
Weitere Links zum Thema
Client/Server-Spiel (einfach)
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  (9,8 kB) Downloads bisher: [ 779 ]

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