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