Version 2.0!
Features
Tutorials
Files
Glossary
Projects
Contact
Links
Message Board
Extras
LuckyCam
Old News
Sign Guestbook
View Guestbook
VB Horoscope
VB Photo Album
.
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.

Jetzt spielen wir Gott und werden einen eigenen Spieler erstellen!
(kompletter Quellcode zum Download!)