Steamworks-Dokumentation
Steamworks-API-Beispielanwendung (SpaceWar)

Übersicht

Um Entwicklern die Verwendung der Steamworks-API besser erläutern zu können, haben wir den Quellcode für eine voll funktionsfähige Version des klassischen Mehrspieler-Shooters Spacewar! bereitgestellt. Spacewar ist ein einfaches 2D-Spiel mit Unterstützung für bis zu 4 Spieler und bietet eine tolle Gelegenheit, viele der im Steamworks-SDK enthaltenen APIs zu demonstrieren.

Beachten Sie beim Lesen des Codes, dass es unser Ziel war, ein einfaches auf das Wesentliche reduziertes Spiel zu erstellen, um die Steamworks-API so klar wie möglich zu präsentieren. Sie werden darin keine bahnbrechend neuen Grafiktechnologien finden. Vielmehr hoffen wir, dass Sie anschauliche Beispiele dafür finden, wie Sie die Steamworks-Funktionalität in Ihre eigenen Projekte integrieren können.

Im Beispielcode werden unter anderem folgende APIs und Steamworks-Funktionen demonstriert:
  • Cloud
  • Communityintegration (Avatare, Namen von Freunden usw.)
  • Absturzberichte
  • Freunde
  • HTML-Oberfläche
  • Inventar
  • Bestenlisten
  • Spielsuche (sowohl Lobbys als auch Serverbrowser)
  • Mehrspielerauthentifizierung (4 Spieler im Spiel unterstützt)
  • Netzwerke
  • Statistiken & Errungenschaften
  • Sprachchat

spacewar.png

Kompilieren & Ausführen des Beispiels

Voraussetzungen:
  • Visual Studio 2005 oder neuer
  • DirectX-SDK
  • Steamworks-SDK. (Laden Sie hier die neueste Version herunter.)

Sobald Sie das Steamworks-SDK-Paket heruntergeladen und entpackt haben, suchen Sie nach dem Unterordner SteamworksExample. In diesem Ordner finden Sie die SteamworksExample.sln, die in Visual Studio geöffnet werden kann. Öffnen Sie die Projektmappe und kompilieren Sie das Projekt. Nach erfolgreicher Kompilierung sind Sie bereit und können das Projekt direkt von Visual Studio aus ausführen (Steam muss im Hintergrund ausgeführt werden). Falls die Kompilierung oder Ausführung fehlschlägt, versuchen Sie einen der folgenden Tipps.

Häufige Kompilierungsprobleme

  • Einbezogene Datei „d3d9.h“ konnte nicht geöffnet werden.
    Wenn Sie diesen Fehler sehen, verfügt der Systemsuchpfad über keinen Eintrag für den D3D-Suchpfad oder Sie haben D3D-SDK nicht installiert. Prüfen Sie zunächst, ob Sie das DirectX-SDK heruntergeladen und installiert haben. Wenn das SDK installiert ist, müssen Sie den Include-Pfad einrichten. Dies können Sie entweder systemweit mit den standardmäßigen Visual Studio-Umgebungsvariablen tun, oder Sie richten ihn nur für das Steamworks-Beispielprojekt ein, indem Sie die Projekteigenschaften bearbeiten.
  • Kritischer Fehler LNK1104: Datei „d3d9.h“ kann nicht geöffnet werden.
    Wenn Sie diesen Fehler sehen, verfügt der Systembibliothekspfad über keinen Eintrag für das D3D-Bibliotheksverzeichnis. Folgen Sie den oben stehenden Anleitungen, aber aktualisieren Sie diesmal den Bibliothekspfad statt des Suchpfads.
  • Steam muss zum Spielen gestartet sein (SteamAPI_Init fehlgeschlagen).
    Wenn Sie beim Spielen eines Spiels diesen Fehler sehen, stellen Sie sicher, dass Steam gestartet ist. Wenn Steam läuft, stellen Sie sicher, dass im Verzeichnis der ausführbaren Spieldatei eine steam_appid.txt-Datei vorhanden ist. Diese Datei wird mit dem SDK-Beispiel ausgeliefert und sollte vorhanden sein, wenn Sie es in Visual Studio oder direkt in den „Debug“- oder „Release“-Unterordnern laufen lassen.

    Wenn Sie ein Spiel direkt über die ausführbare EXE-Datei starten, muss diese Datei außerhalb der Steam-Oberfläche vorhanden sein und eine Einzelzeile mit der App-ID des Spiels beinhalten (Valve weist jedem eine App-ID zu. Die App-ID des Beispielspiels ist 480). Wenn Sie Ihr eigenes Spiel über Steam veröffentlichen, ist diese Datei nicht erforderlich, da Steam Ihre App-ID beim Starten des Spiels automatisch erkennt.
  • Die Anwendung ist beim Starten fehlgeschlagen, da steam_api.dll nicht gefunden wurde. Dieses Problem kann möglicherweise durch eine Neuinstallation der Anwendung behoben werden.
    Damit steam_api.dll erfolgreich läuft, muss es sich im selben Ordner befinden wie die anwendbare Beispielspieldatei. Dies gilt auch für Ihre eigenen Spiele, die Steamworks nutzen. Bei der Kompilierung sollte die Visual Studio-Projektdatei die ausführbare Datei automatisch im korrekten Verzeichnis ablegen. Wenn Sie aber einen anderen Compiler verwenden oder die Projektmappe oder die Projektdateien modifiziert haben, müssen Sie die Datei möglicherweise selbst kopieren. Sie können steam_api.dll bei Veröffentlichung Ihrer eigenen Steamworks-Spielen erneut ausliefern.
  • Die Anwendung ist beim Starten fehlgeschlagen, da 3dx_??.dll nicht gefunden wurde. Dieses Problem kann möglicherweise durch eine Neuinstallation der Anwendung behoben werden.
    Das Beispiel benötigt die D3D9X-Hilfsbibliothek, die mit DirectX-SDK geliefert wird. Wenn Sie das Beispiel auf demselben Computer ausführen, auf dem Sie es kompiliert haben, sollte die Bibliothek automatisch gefunden werden. Wenn Sie die kompilierte Binärdatei auf einen anderen Computer kopieren, müssen Sie möglicherweise die D3D-Redistributables installieren, um dieselbe D3D9X-Version zu erhalten, die Sie auf dem Entwicklungscomputer beim Kompilieren verwendet haben.

Code-Übersicht

Sobald das Spacewar!-Beispiel kompiliert wurde und ausgeführt werden kann, empfehlen wir eine genauere Überprüfung des Codes. Der Code in Dateien im Projektmappen-Explorer von Visual Studio ist in Spiel- und Engine-Code unterteilt. Den Code im Engine-Ordner können Sie ignorieren. Hier finden Sie lediglich die Unterstützung für grundlegendes 2D-Rendering über D3D sowie allgemeine Tastatureingaben. Sämtlicher Code, der für die Dokumentation der Verwendung der Steamworks-API wichtig ist, befindet sich im Ordner „Game“.

Im Folgenden sind die interessantesten Code-Bereiche, die Sie sich als Erstes ansehen sollten, kurz beschrieben:
  • Main.cpp: Haupteingangspunkt für das Beispielspiel.
    Demonstrierte API-Verwendung:
    • Client-API-Initialisierung: Sie müssen die API frühzeitig, während des Anwendungsstarts initialisieren. Die RealMain()-Funktion in Main.cpp zeigt Ihnen, wie dies funktioniert.
    • Protokollieren von API-Fehlern/Warnungen: Es empfiehlt sich, während der Entwicklung einige Protokollierungsausgaben von den Steam-APIs erhalten, um etwaige Probleme beheben zu können. Sehen Sie sich ein Einrichtungsbeispiel für Debugprotokollierung in der RealMain()-Funktion an, da dort ISteamClient::SetWarningMessageHook aufgerufen wird.
    • Absturzberichte: Möglicherweise möchten Sie in Ihren Spielen die in Steam integrierten Absturzberichte per Minidump nutzen. In diesem Fall können Sie ein Beispiel für die Installierung des Ausnahmehandlers und Einrichtung der Minidump-Ausgabe in WinMain() und MiniDumpFunction() in Main.cpp finden.
  • SpaceWarServer.cpp/h: Server-Code für das Beispielspiel.
    Demonstrierte API-Verwendung:
    • Initialisierung der Spielserver-API: Idealerweise initialisieren Sie auf den Spielservern eine abgespeckte Version der API, in der nicht jede einzelne Benutzerschnittstelle bereitgestellt wird. SpaceWarServer.cpp zeigt Ihnen, wie dies für CSpaceWarServer im Konstruktor gemacht wird.
    • Ausführen von API-Rückrufen: Es wird empfohlen, regelmäßig Steam-Rückrufe in Ihren Spielen auszuführen, um Ergebnisse aus den asynchronen API-Aufrufen durch Steam zu verarbeiten. Ein Beispiel dafür, wie Rückrufe auf einem Spielserver behandelt werden, können Sie über SteamGameServer_RunCallbacks in der CSpaceWarServer::RunFrame()-Funktion sehen. Dort finden Sie auch Beispiele dafür, wie einzelne Rückrufe gehandhabt und im Konstruktor-Code und der Header-Datei im CSpaceWarServer registriert werden.
    • Mehrspieler-Authentifizierung (Behandlung von VAC-Ausschlüssen): Wenn Ihr Spiel ein Online-Mehrspielertitel ist, möchten Sie sicher prüfen, ob die Benutzer auch wirklich Eigentümer des Spiels sind, bevor Sie ihnen die Verbindung zu einem Online-Server erlauben. Für diese Zwecke können Sie sich den Rückruf-Handler und Aufrufe in der ISteamGameServer-API ansehen, die in SpaceWarServer.cpp verwendet werden. Außerdem sehen Sie dort, wie Sie Antworten bezüglich Ablehnungen und Sperren behandeln können, wenn z. B. ein Benutzer nicht Eigentümer Ihres Produkts ist oder der Benutzer ausgeschlossen wurde oder wegen eines Cheats ausgeschlossen werden muss.
    • Netzwerk-API: Wenn Sie ein Onlinespiel erstellen, empfiehlt sich die Nutzung einer integrierten Netzwerk-APIs von Steam. Sie finden Beispiele für deren serverseitige Verwendung in Spielservern über ISteamNetworking -API-Aufrufe mit dem SteamGameServerNetworking()-Akzessor und Rückrufe in SpaceWarServer.cpp.
    • Kommunikation zwischen Spielsuch- und Masterservern: Wenn Sie ein Mehrspielerspiel erstellen und den Steam-Serverbrowser verwenden möchten, muss Ihr Spielserver mit den Steam-Masterservern kommunizieren. Beispiele hierfür finden Sie im CSpaceWarServer-Konstruktor und in der CSpaceWarServer::SendUpdatedServerDetailsToSteam()-Methode.
  • SpaceWarServer.cpp/h: Clientcode für das Beispiel-Spiel.
    Demonstrierte API-Verwendung:
    • Spielsuche über Lobbys: In Onlinespielen lohnt es sich, auch die Spielsuche über Lobbys anzubieten, entweder als zusätzliche Option oder anstelle des Serverbrowsers. Sie finden Beispiele für die Verwendung des Lobby-Codes und der Rückrufe über die Schnittstelle ISteamMatchmaking innerhalb von SpaceWarClient.cpp. Außerdem könnte Lobby.cpp/h interessant für Sie sein. Dort ist zum Teil Code enthalten, mit dem der Status und Rückrufe nach dem Betreten einer Lobby behandelt werden.
    • Integration von Freunden & Community: Steam ermöglicht es Ihnen, in Ihrem Spiel erweiterte persönliche Daten der Spieler zu nutzen, zum Beispiel den Persona-Namen und den persönlichen Avatar. Sie finden Beispiele zur Integration von Persona-Namen und Avataren in Bestenlisten über die Schnittstelle ISteamFriends innerhalb von SpaceWarClient.cpp finden.
    • Netzwerk-API: Sie finden ein Beispiel für die clientseitige Verwendung der Steam Netzwerk-API innerhalb von SpaceWarClient.cpp (siehe SpaceWarServer.cpp für die serverseitige Implementierung).
  • StatsAndAchievements.cpp/h: Behandlung von Statistiken und Errungenschaften für das Beispiel-Spiel.
    Demonstrierte API-Verwendung:
    • Statistiken & Errungenschaften: Sie finden eine Implementierung der Behandlung von Statistiken und Errungenschaften innerhalb von StatsAndAchievements.cpp. Die Datei enthält die Klasse CStatsAndAchievements, die mit aktualisierten Statusinformationen aus CSpaceWarClient aufgerufen wird. Sobald CStatsAndAchievements die Informationen zu Statusänderungen vom Spiel-Client empfangen hat, wickelt es über die Schnittstelle ISteamUserStats die Benachrichtigung von Steam über die erhaltenen Statusänderungen oder Errungenschaften des Benutzers ab.
  • Lobby.cpp/h: Spielsuche über Lobbys
    Demonstrierte API-Verwendung:
    • Spielsuche über Lobbys: Sie finden Teile der Implementierung von lobbybasierter Spielsuche des Spiels in Lobby.cpp. Lobby.cpp ist eng mit SpaceWarClient.cpp verzahnt, um die Spielsuche zu verarbeiten. Sehen Sie sich also beide Komponenten an. Beachten Sie bei der Überprüfung des Lobby-Codes vor allem die Rückrufe und Aufrufe der ISteamMatchmaking-Schnittstellenmethoden.
  • ServerBrowser.cpp/h: Serverbrowser im Spiel
    Demonstrierte API-Verwendung:
    • Spielsuche über Serverbrowser: Wenn Sie die Spielsuche über den Serverbrowser unterstützen, empfehlen wir, direkt im Spiel eine Liste der Server als Ergänzung zur Liste in der Steam-UI bereitzustellen. Sie finden ein Beispiel zum Abrufen der Liste von Internetservern für Ihr Spiel und zum Anzeigen dieser Liste für die Benutzer innerhalb von ServerBrowser.cpp.
  • Inventory.cpp/h: Steam-Inventardienst
    Demonstrierte API-Verwendung:

Wenn Ihr Spiel bereits über eine Engine zur Authentifizierung und Spielsuche verfügt, die Sie weiterhin verwenden möchten, entfernen Sie die Definition USE_GS_AUTH_API aus Spacewars.h. Wenn Sie diese Definition entfernen, wird die Steam-Authentifizierung oder die Steam-Spielsuche im Beispiel NICHT verwendet. Sie können jedoch weiterhin andere Steam-Funktionen wie Errungenschaften oder Informationen über Freunde nutzen. Weitere Einzelheiten entnehmen Sie dem Code.