|
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
tip0177.zip
(5,3 kB) |
|
Downloads
bisher: [ 2037
] |
|