ATTENTION READERS! Lucky's VB Gaming Site is no longer active. For updated game programming information and tutorials, please visit The Game Programming Wiki!
Spiel starten/Spiel beitreten
Bevor du einem Spiel beitreten kannst, muß irgendjemand eines
gestartet haben, also werden wir das zuerst behandeln. Um ein Spiel zu
starten (bzw. zu "hosten"), müssen wir ein Objekt DirectPlaySessionData
festlegen und mit Daten füllen:
Dim objSessionData As DirectPlaySessionData
Set objSessionData = dp.CreateSessionData
objSessionData.SetMaxPlayers
4
objSessionData.SetSessionName
"Game"
objSessionData.SetGuidApplication
AppGuid
objSessionData.SetFlags DPSESSION_DIRECTPLAYPROTOCOL
Or DPSESSION_MIGRATEHOST
Call dp.Open(objSessionData,
DPOPEN_CREATE)
Aua! Soviel Code!
Keine Angst, Computerfreak, es ist ganz einfach. Als erstes müssen
wir das Objekt DirectPlaySessionData über die MethodeDirectPlay4.CreateSessionData
initialisieren. Dann legen wir seine Eigenschaften fest: Die maximale Anzahl
von Spielern, der Name der Session (er erscheint, wenn andere eine Liste
der laufenden Spiele anfordern) und den GUID - du erinnerst dich... :-)
Die Flags (Eigenschaften) kannst du setzen wie du magst, aber ich schlafe
vor, mindestens die Flag DPSESSION_DIRECTPLAYPROTOCOL zu setzen. Sie erlaubt
es DPlay, das bestmögliche zu versuchen, deine Aufträge zu erledigen
und gegebenfalls Sachen zu emulieren, die nicht vorhanden sind. Die Flag
DPSESSION_MIGRATEHOST ist in manchen Fällen hilfreich; sie sagt DPlay,
dass es einen neuen Host (Spielleiter für das Spiel) zuweisen soll,
falls der ursprüngliche aus dem Spiel aussteigt, und erlaubt es so,
dass das Spiel trotzdem fortgesetzt wird. Es gibt noch eine Reihe weiterer
Flags, aber die mußt du selbst im SDK nachschauen :-)
Wenn wir unser DirectPlaySessionData-Objekt mit genügend Informationen
versorgt haben, können wir es an die Methode DirectPlay4.Open
übergeben, DPOPEN_CREATE heißt, dass die Session gleich gestartet
werden soll. Fertig! Unsere Session ist jetzt richtig gestartet, alles
was wir jetzt machen müssen, ist zu warten, bis jemand anderes unserem
Spiel beitritt!
Aber das passiert nicht von selber, fürchte ich:
Dim objSessionData As DirectPlaySessionData
Set objSessionData = dp.CreateSessionData
objSessionData.SetGuidApplication
AppGuid
objSessionData.SetSessionPassword
""
Um einem Spiel beizutreten, müssen wir erst das Objekt DirectPlaySessionData
erzeugen und es mit den Kriterien füllen, mit denen wir die vielen
Sessions unterscheiden möchten. Wenn wir nach laufenden Spielen suchen,
benutzen wir dieses Objekt als eine Art Vorlage. Über jede Session,
die mit diesem Objekt übereinstimmt, werden wir informiert. In diesem
Fall also nur diejenigen Sessions, die mit unserem GUID übereinstimmen.
Wir setzen auch die Eigenschaft SetSessionPassword zu diesem Zeitpunkt,
die es uns erlaubt, all jene Sessions aufzulisten, die ein Passwort verlangen
(wenn keines gebraucht wird, übergeben "").
Dim objEnumSessions As DirectPlayEnumSessions
Dim intSessionCount As Integer
Dim i As Integer
Dim strDetails As String
Set objEnumSessions = dp.GetDPEnumSessions(objSessionData,
0, DPENUMSESSIONS_AVAILABLE)
intSessionCount = objEnumSessions.GetCount
For i = 1 To intSessionCount
Set
objSessionData = objEnumSessions.GetItem(i)
strDetails
= objSessionData.GetSessionName & " (" & objSessionData.GetCurrentPlayers
& "/" & objSessionData.GetMaxPlayers & ")"
LstBox.AddItem
strDetails
Next
Um alle laufenden Spiele mit demselben GUID zu bekommen, nutzen wir
die Methode DirectPlay4.GetDPEnumSessions. Diese Informationen brauchen
wir, umd das Objekt DirectPlayEnumSessions zu initialisieren. Einmal
initialisiert, können wir von diesem Objekt die Anzahl der laufenden
Sessions ermitteln, dann in einer Schleife durch jede Session gehen und
deren Beschreibung an den Spieler ausgeben. Der Code oben setzt ein Listenfeld
"LstBox" voraus. Diese Liste wird mit dem Namen der Session, der maximalen
Spielerzahl und der momentanen Spielerzahl jeder Session, die ermittelt
wurde, gefüllt.
Jetzt kann der Spieler eine Session auswählen, der wir dann beitreten
müssen:
Set objSessionData = objEnumSessions.GetItem(Index
+ 1)
Call dp.Open(objSessionData,
DPOPEN_JOIN)
Angenommen "Index" ist der Rückgabewert wenn der Spieler einen
Eintrag aus der oben beschriebenen Liste wählt. Wir bekommen die Informationen
über diese Session, wenn wir die Methode GetItem des Objektes
DirectPlayEnumSessions aufrufen.
Dann nutzen wir die DirectPlay4.Open Methode und übergeben
an sie auch die Flag DPOPEN_JOIN. Voilá! Wir sind jetzt mit dem
Spiel verbunden!
Es ist vielleicht nützlich sich den Zeitpunkt zu merken, an dem
während der Ausführung Dialogfelder der Verbindungstypen auftauchen
könnten. Wenn wir ein Spiel hosten, führt die Methode DirectPlay4.Open
mit der Flag DPOPEN_CREATE vielleicht dazu, dass ein Dialogfeld angezeigt
wird. Wenn wir z.B. ein Modem benutzen, erscheint ein Dialogfeld dass es
dem Spieler erlaubt, dem Modem zu sagen, dass es warten soll und auf eingehende
Anrufe antworten soll.
Wenn wir einem Spiel beitreten, ruft die Methode DirectPlay4.GetDPEnumSessions
vielleicht ein Dialogfeld auf. Modem-Nutzer werden nach einer Telefonnummer
gefragt, TCP/IP-Nutzer nach einer IP-Adresse, etc.