DirectPlay Grundlagen  
Autor: Jack Hoxley, 07/2000 Übersetzung: Sebastian Bauersfeld, 11/2001

Ohne Zweifel kommen Internet-Spiele in den nächsten zwei Jahren groß raus (das hängt natürlich davon ab, wann du das hier gelesen hast), und als Spiel-Programmierer will man da natürlich mitmischen. Dies wird durch DirectPlay ohne große Umstände ermöglicht

Es gibt zwei Probleme beim Erstellen einer DirectPlay-Applikation. Das erste sind die Ressourcen. Viele Spiele benutzen einen Server. Hast du einen? Wahrscheinlich nicht. Es gibt einige unterschiedliche Kommunikationsmöglichkeiten - hast du genug Hardware um sie alle zu testen? Aber du hast sicherlich jemanden der dir hilft zu testen - allerdings kann es Stunden, wenn nicht Tage dauern bis ihr etwas auf die Beine gestellt habt. Ist dein Helfer bereit dir diese Zeit zu geben?

Da gibt es einige Wörter und Prozesse, die du kennen musst, um DirectPlay in Angriff zu nehmen:

Bezeichnung Bedeutung
Service Provider

Einen Service Provider kann man sich als Hardware vorstellen welche zur Verbindung zwischen den Computern dient. Diese vier Hauptarten stehen dir zur Verfügung: Serielle Verbindung (Kabel), IPX (LAN), Modem (normale Internet-Verbindung) und schließlich TCP/IP. Es ist möglich sich seine eigenen zu erstellen, allerdings dürften diese vier grundsätzlich ausreichen.

GUID

Das Programm muss einen einzigartigen Identifikations-String besitzen. Er wird benötigt, um nicht versehentlich einem völlig anderem Spiel beizutreten (z.B. Quake oder Alarmstufe Rot). Diese GUID muss einzigartig sein. DirectX besitzt eine Methode, die man benutzen kann um einen komplett zufälligen String zu erzeugen (wird später erklärt). Dieser String muss derselbe für jede Kopie des Programms sein - man kann nicht bei jedem Programmstart einfach einen neuen wählen...

Eine Verbindung initialisieren

Das bedeutet nicht etwa eine Verbindung zum Server oder zu anderen Spielern herzustellen. Damit kontrolliert man, ob Dinge korrekt funktionieren. In fast allen Fällen tauchen IPX-Verbindungen in aufgezählten Listen auf. Aber dafür muss nicht unbedingt eine Hardware vorhanden sein. Der IPX-Treiber wurde nämlich in Windows eingebaut. Dieser Prozess kontrolliert jedenfalls die Verbindung und berichtet, ob sie erfolgreich war oder fehlgeschlagen ist.

Ein Spiel erstellen oder einem Spiel beitreten

Hier entscheiden wir, ob wir entweder Host der Session sind oder ob wir irgendeiner Session beitreten. Beide Möglichkeiten erfordern verschiedene Operationen deines Programms. Wenn du der Host bist, dann musst du alles kontrollieren und einstellen... Wenn du nur einer Session beitrittst, kannst du dich zurücklehnen und brauchst kaum was zu machen...

Spieler

Das sollte klar sein, du musst deinen eigenen Spieler erschaffen, wenn du einem Spiel beitrittst. Das bewirkt, dass du auch nur die Nachrichten bekommst, die für dich bestimmt sind. Einige Spiele besitzen ein Limit für die Anzahl der Spieler.

Gameplay

Wenn genug Spieler verbunden sind, kann das Spiel starten - DirectPlay interessiert es nicht, wie viele es sind, die Anzahl hängt vom Host/ Programmierer ab. Normalerweise gibt es Spiele mit 2 bis 32 Mitspielern. Der GamePlay-Abschnitt beinhaltet außerdem das Senden von Daten zwischen Spielern - wie z.B. Informationen, die der Spieler sehen kann und Informationen, die nur für den Computer von Relevanz sind.

Ein Spiel beenden

Obwohl man oft aus einem Spiel hinausgehen kann ohne alles explizit zu beenden, sollte man dies tun, da der Server darüber informiert werden muss, ob ein Spieler ein Spiel verlässt, damit er reagieren kann (neuen Spieler hineinlassen, andere Spieler informieren).

Es geht los

Wie bereits erwähnt, braucht man einige Objekte um sich mit DirectPlay in Verbindung zu setzen; außerdem braucht man einen GUID. Um einen GUID zu bekommen, muss man folgendes tun:

1.
 
Erstelle eine neue Anwendung; das kann entweder das Projekt sein, das du benutzt um ein DirectPlay Programm zu erstellen oder ein neues.
2. Ein Verweis auf DirectX muss vorhanden sein.
3. Kopiere diesen Code in die Form_Load Prozedur und starte deine Applikation:
Dim Dx As New DirectX7
Clipboard.Clear
ClipBoard.SetText Dx.CreateNewGuid
4.
 
Nun starte das Programm und schließe es wieder. Drücke Strg + V in der Entwicklungsumgebung und du bekommst einen einzigartigen String; der den ich bekam hieß so:
{8EC1E2EC-5266-11D4-811C-AD15B9B82C76}

Bitte benutze diesen GUID nicht für deine Anwendung, da ich ihn bereits benutze - erschaffe deinen eigenen. Nun haben wir einen GUID und können mit der Programmierung der DirectPlay - Anwendung beginnen. Der folgende Code muss in die Deklarations-Sektion eingefügt werden.

Option Explicit

Dim
Dx As New DirectX7
Dim Dp As DirectPlay4
Dim DpEnum As DirectPlayEnumConnections
Dim DpAddress As DirectPlayAddress
Dim Session As DirectPlaySessionData
Dim DpEnumSessions As DirectPlayEnumSessions

Dim
PlayerIDNum As Long

 'Achtung: Nicht den unten abgebildeten String
 'für dein Spiel benutzen.
Public Const MyGuid As String = _
  "{8EC1E2EC-5266-11D4-811C-AD15B9B82C76}"
Host oder Spieler?

Nun müssen wir entscheiden, ob wir Host oder Spieler sind (Host kann auch spielen).

Normalerweise sollte man das den Spieler entscheiden lassen, wenn man ein Spiel spielt, will man, dass die Person mit der schnellsten Verbindung die meiste Arbeit verrichtet (also der Host). Je nachdem was der User einstellt, hat die Anwendung eine gering verschiedene Initialisierung.

Jetzt brauchen wir eine Liste der vorhandenen Protokolle. Aber wie gesagt: es werden auch Protokolle angezeigt, die der Computer manchmal gar nicht nutzen kann.

 'als erstes das DirectPlay - Object
Set Dp = Dx.DirectPlayCreate("")

 'dann füllen wir das Enum - Objekt mit den Details der
 'vorhandenen Protokolle.
Set DpEnum = Dp.GetDPEnumConnections("", DPCONNECTION_DIRECTPLAY)

 'dann zeigen wir sie in einer ListBox an
Dim I As Integer

For I = 1 To DpEnum.GetCount
   List1.AddItem DpEnum.GetName(I), 0
Next I

Jetzt benötigen wir zwei verschiedene Teile des Codes. Der erste erstellt eine neue Session (neues Spiel) in die andere Spieler eintreten können,

 'Damit erstellen wir eine Session.
Set DpAddress = DpEnum.GetAddress(List1.ListIndex + 1)
Dp.InitializeConnection DpAddress

Set Session = Dp.CreateSessionData
Session.SetMaxPlayers 8 'Nur 8 Spieler im Spiel zulassen
Session.SetSessionName "Der Name erscheint wenn andere _
  Spieler nach Spielen suchen"

  'Das Spiel benutzt den erstellten GUID
Session.SetGuidApplication MyGuid 

 'Diese zwei Flags sollten für jede Application genügen.
Session.SetFlags DPSESSION_DIRECTPLAYPROTOCOL
Or
_
   DPSESSION_MIGRATEHOST

 'Nun erstellen wir eine Session basierend auf den 
 'gerade getätigten Einstellungen.
Dp.Open Session, DPOPEN_CREATE
List1.Enabled = False

und dieser sucht nur nach Spielen die bereits erstellt wurden.

 'Angenommen alles klappt, wird eine Liste mit allen
 'aktuellen Spielen angezeigt.

Set DpAddress = DpEnum.GetAddress(List1.ListIndex + 1)
Dp.InitializeConnection DpAddress
Set Session = Dp.CreateSessionData

Session.SetGuidApplication MyGuid

 'wir suchen nach passwort- ungeschützten Spielen
Session.SetSessionPassword ""  

Set DpEnumSessions = Dp.GetDPEnumSessions(Session, 0, _
    DPENUMSESSIONS_AVAILABLE)

Dim T As Integer

For T = 1 To DpEnumSessions.GetCount
 
Set Session = DpEnumSessions.GetItem(T)
  List2.AddItem "[" & Session.GetCurrentPlayers & "/" & _
     Session.GetMaxPlayers & "] " & Session.GetSessionName
Next T
Nun müssen wir für uns selber einen Spieler erzeugen.

Achtung, angenommen jemand anderes spielt am selben Computer, dann werden alle diese Befehle wiederholt. Das Programm erstellt aber trotzdem immer nur einen Spieler auf dem Computer.

 'Einige Variablen um die Informationen zu speichern. tmpFriendlyName As String, tmpFormalName As String

 'Angaben zum Spieler machen...
tmpFriendlyName = InputBox("Please enter your nick name,
Or _
  'friendly name':", "Create Player")
tmpFormalName = InputBox("Please enter your formal name, ie. Jack Hoxley (for me)...", "Create Player")

 'Nun erstellen wir einen Spieler -
 'die Funktion gibt eine ID zurück die wir
 'nutzen können um uns selbst zu identifizieren... (später)

PlayerIDNum = Dp.CreatePlayer(tmpFriendlyName, tmpFormalName, 0, 0)

Angenommen alles verläuft nach Plan und Spieler treten dem Spiel bei. Dieser Code ist nur für den Host gedacht. Obwohl wir festgelegt haben, dass wir bis zu 8 Spieler erlauben, brauchen wir momentan gar nicht so viele - diese Angabe ist nur das Limit. Der Host kann das Spiel auch mit 2, 3, 5, 7 Spielern starten - Wenn der Programmierer das erlaubt, kann der Spieler selbst entscheiden, wann er das Spiel beginnt. Aber wenn das Spiel gestartet wurde, müssen andere Spieler daran gehindert werden während des Spiels beizutreten.

'Als erstes erstellen wir ein Daten- Objekt.
Set Session = Dp.CreateSessionData

'Dann holen wir die aktuellen Session- Daten

Dp.GetSessionDesc Session

'Nun fügen wir JOINDISABLED zu den aktuellen Flags hinzu

Session.SetFlags Session.GetFlags
DPSESSION_JOINDISABLED

'wir fügen die modifizierten
Daten wieder hinzu ...
Dp.SetSessionDesc Session
Nun kann niemand mehr unserem Spiel beitreten.
Zum richtigen kennen lernen von DirectPlay gehört auch das Messaging-Tutorial.
 
Alles beenden

Kommen wir zum finalen Stadium des Spiels, dieses tritt ein wenn es alle Spieler verlassen haben; wenn es einfach nur zu Ende ist, oder wenn ein bestimmter Spieler das Spiel verlassen hat.

Wenn nur ein Spieler das Spiel verlassen hat, sollte man die anderen Spieler davon in Kenntnis setzen, obwohl DirectPlay das schon automatisch macht, will man vielleicht noch zusätzlich eigene Informationen hinzufügen.

Alles was wir nun noch machen müssen, ist die Objekte zu beseitigen, die wir erstellt haben.

 'Es ist besser das Haupt-Objekt zum Schluß zu entladen;
 'in diesem Fall ist DP das Haupt-Objekt.

Set DpEnum = nothing
Set DpEnumSessions = nothing
Set Dp= nothing
Geschafft!!

Du solltest nun in der Lage sein, ein Spiel zu starten und zu beenden. Von nun an brauchst du den Code nur noch verfeinern. Wenn möglich, sollte man zwei Computer benutzen, da dies schon sehr hilfreich ist, ein Multiplayer-Spiel zu erstellen.

Ein Beispiel-Projekt zum erzeugen einer GUID können Sie hier downloaden.

  Download BitmapBlt.zip Download
tip0177.zip
 (5,3 kB)
Downloadzeit: <1 Min. - 28.8k / <1 Min. - ISDN Downloads bisher: [ 2037 ]

Startseite | VB-/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | Gewinnspiele | VB-/VBA-Forum | DirectX-Forum | VB.Net | .Net-Forum | Foren-Archiv | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report

Letzte Aktualisierung, Samstag, 08. Dezember 2001