Документация Steamworks
Приложение-образец с API Steamworks (SpaceWar)

Введение

Чтобы помочь разработчикам понять API Steamworks, мы включили исходный код полностью работоспособной версии классической многопользовательской стрелялки: Spacewar! Это простая двумерная игра с поддержкой до 4 игроков, которая позволяет продемонстрировать большинство функций SDK Steamworks.

Когда вы будете читать код, помните, что нашей целью было написать простую игру, чтобы мы могли продемонстрировать возможности API Steamworks как можно более отчётливо. Так что вы не увидите здесь новую великолепную графику. Вместо этого, как мы надеемся, вы найдёте ясные примеры того, как интегрировать функции Steamworks в ваши собственные проекты.

В образец кода приложения включены следующие API и функции Steamworks:
  • Steam Cloud
  • Интеграция сообщества Steam (аватары, имена друзей и проч.)
  • Сообщения об ошибках
  • Друзья
  • HTML Surface
  • Инвентарь
  • Списки лидеров
  • Подбор матчей (лобби и окно поиска серверов)
  • Многопользовательская аутентификация (в игре поддерживаются до 4 игроков)
  • Игра по сети
  • Статистика и достижения
  • Голосовой чат

spacewar.png

Сборки и запуск приложения-образца

Требования:

После того, как вы скачаете и распакуете файл с SDK Steamworks, откройте папку SteamworksExample. В этой папке вы найдёте SteamworksExample.sln, который можно открыть в Visual Studio. Откройте его и скомпилируйте проект. Если компиляция пройдёт успешно, вы сможете запустить проект напрямую из Visual Studio (Steam должен быть запущен на фоне). Если сборка или запуск не удастся, попробуйте один из следующих советов.

Частые проблемы при сборке

  • Не удаётся открыть файл включения: 'd3d9.h'
    Эта ошибка означает, что в системе не настроен путь включения для D3D, либо вы не установили SDK D3D. Во-первых, убедитесь, что вы скачали и установили SDK DirectX. Once the SDK is installed you need to set up the include path. Вы можете это сделать как глобально с помощью стандартных переменных среды Visual Studio, так и настроить их только для образца приложения Steamworks, отредактировав свойства проекта.
  • Неустранимая ошибка LNK1104: невозможно открыть файл 'd3d9.lib'
    Эта ошибка означает, что путь к библиотекам вашей системы не включает путь к библиотекам D3D. См. инструкции выше, но вместо пути включения вам потребуется настроить путь к библиотекам.
  • Для запуска данной игры должен быть запущен Steam. Вызов SteamAPI_Init не удался.
    Если вы столкнулись с этой ошибкой при запуске игры, убедитесь, что Steam запущен. Если Steam запущен, убедитесь, что в папке с исполняемым файлом присутствует файл steam_appid.txt. Этот файл входит в образец Steamworks и должен присутствовать, если вы запускаете игру из Visual Studio или напрямую из подпапок Debug или Release.

    Когда вы запускаете игру напрямую с помощью исполняемого файла, а не через интерфейс Steam, этот файл должен присутствовать. Он должен содержать одну строку с номером приложения (Valve назначит этот номер вашей игре, AppID приложения-образца — 480). Когда вы отправите свою игру через Steam, этот файл не потребуется, поскольку Steam самостоятельно определит номер приложения при запуске игры.
  • Не удалось запустить приложение, так как не найден файл steam_api.dll. Переустановка приложения может решить проблему.
    Чтобы запустить игру, файл steam_api.dll должен быть расположен в той же папке, что и исполняемый файл образца приложения Steamworks. Это справедливо и для ваших игр, которые используют Steamworks. При сборке проекта Visual Studio исполняемый файл должен разместиться в соответствующей папке, но если вы используете другой компилятор, изменили решение или файлы проекта, вам может потребоваться скопировать его самостоятельно. Вы можете распространять steam_api.dll при распространении собственных игр, использующих Steamworks.
  • Не удалось запустить приложение, так как не найден файл d3dx_??.dll. Переустановка приложения может решить проблему.
    Для работы приложения-образца требуется вспомогательная библиотека D3D9X, включённая в SDK DirectX. Если вы запускаете Spacewar на том же компьютере, где вы проводили сборку, библиотека будет найдена автоматически. Если вы скопировали скомпилированные бинарные файлы на другой компьютер, вам может потребоваться установить распространяемые компоненты D3D, чтобы получить ту же версию D3D9X, с которой вы компилировали на компьютере разработки.

Обзор кода

После того, как вы скомпилируете и запустите Spacewar!, придёт время изучать код. Если вы будете просматривать файлы в обозревателе решений Visual Studio, вы увидите, что код разбит на папки Game и Engine. Вы можете игнорировать код в папке Engine: он поддерживает базовую двумерную визуализацию с помощью D3D и базовый ввод с клавиатуры. Весь важный код, документирующий использование API Steamworks, расположен в папке Game.

Наиболее интересные части кода кратко охарактеризованы далее:
  • Main.cpp. Главная точка входа для игры-образца.
    Показанное использование API:
    • Инициализации клиента API. Вам может потребоваться инициализировать API достаточно рано во время запуска приложения, и вы увидите пример того, как это делается внутри функции RealMain() в Main.cpp.
    • Регистрация ошибок и предупреждений API. Во время разработки вам может потребоваться регистрировать вывод функций API Steam. Вы увидите пример настройки регистрации отладочных сообщений в функцииRealMain(), где вызывается ISteamClient::SetWarningMessageHook.
    • Сообщения о сбоях. Вам может потребоваться использование встроенных в Steam минидампов с сообщениями о сбоях в ваших играх. Пример настройки обработчика исключений и записи минидампов можно найти в функциях WinMain() и MiniDumpFunction() внутри Main.cpp.
  • SpaceWarServer.cpp/h. Серверный код для игры-образца.
    Показанное использование API:
    • Инициализация API игровых серверов. На игровых серверах вам может потребоваться инициализировать упрощённую версию API, в которой не будет интерфейсов, предназначенных для отдельных пользователей. Её можно найти в конструкторе CSpaceWarServer в SpaceWarServer.cpp.
    • Запуск обратных вызовов API. Вам может потребоваться периодически запускать в играх обратные вызовы для обработки результатов асинхронных вызовов Steam. Пример настройки обратных вызовов на игровом сервере с помощью SteamGameServer_RunCallbacks можно найти в функции CSpaceWarServer::RunFrame(), а примеры обработки отдельных обратных вызовов и их регистрации — в коде конструктора и заголовочном файле CSpaceWarServer.
    • Многопользовательская аутентификация (обработка античита Valve). Если ваша игра является многопользовательской, вам может потребоваться подтвердить, что пользователи владеют игрой до того, как позволить им подключиться к сетевому серверу. Обработчики обратных вызовов и вызовы к API ISteamGameServer можно найти в SpaceWarServer.cpp. Вы также увидите, как обрабатывать ответы Steam с требованием отказать пользователям или выгнать их из игры либо из-за того, что они не владеют вашим продуктом, либо из-за того, что они получили блокировку.
    • Сетевой API. Если в вашу игру можно сыграть по сети, вам может потребоваться встроенный в Steam сетевой API. Примеры его использования на стороне игровых серверов можно найти в виде вызовов ISteamNetworking, использующих метод доступа SteamGameServerNetworking(), и обратных вызовов внутри SpaceWarServer.cpp.
    • Подбор игр и коммуникация с мастер-сервером. Если вы хотите воспользоваться окном поиска серверов Steam при создании многопользовательской игры, вашему игровому серверу будет необходимо связаться мастер-серверами Steam. Примеры использования приведены в конструкторе CSpaceWarServer и в методе CSpaceWarServer::SendUpdatedServerDetailsToSteam().
  • SpaceWarClient.cpp/h. Клиентский код для игры-образца.
    Показанное использование API:
    • Подбор игр в лобби. Для онлайн-игр вам может потребоваться внедрить подбор игр с помощью системы лобби в дополнение к окну поиска серверов или вместо него. Примеры использования кода для лобби и обратных вызовов через интерфейс ISteamMatchmaking можно в SpaceWarClient.cpp. Также в Lobby.cpp/h можно найти код для обработки состояния и обратных вызовов внутри активного лобби.
    • Интеграция сообщества и друзей. Steam позволяет играм получать доступ к обширной информации об игроках, включая имена профилей и аватары игроков. Пример интеграции имён профилей и аватаров в таблицы результатов с помощью интерфейса ISteamFriends можно найти в SpaceWarClient.cpp.
    • Сетевой API. Пример использования сетевого API на стороне клиента можно найти в SpaceWarClient.cpp (см. SpaceWarServer.cpp как пример реализации на стороне сервера).
  • StatsAndAchievements.cpp/h. Обработка статистик и достижений для игры-образца.
    Показанное использование API:
    • Статистики и достижения. Обработка статистик и достижений показана в StatsAndAchievements.cpp. Файл содержит класс CStatsAndAchievements, при вызове которого передаётся обновлённая информация из CSpaceWarClient. Как только CStatsAndAchievements получает информацию об изменениях из игрового клиента, этот метод уведомляет Steam об изменениях в пользовательских статистиках и достижениях, полученных с помощью интерфейса ISteamUserStats.
  • Lobby.cpp/h. Подбор игр в лобби
    Показанное использование API:
    • Подбор игр в лобби. Часть кода для подбора игр в лобби можно найти в Lobby.cpp. Lobby.cpp обрабатывает подбор игр вместе с SpaceWarClient.cpp, так что рекомендуется взглянуть и на него. При изучении кода лобби обратите особое внимание на обратные вызовы и вызовы методов интерфейса ISteamMatchmaking.
  • ServerBrowser.cpp/h. Окно поиска серверов
    Показанное использование API:
    • Подбор игр с помощью ServerBrowser. Если у вас реализован подбор игр с помощью окна поиска серверов, вам может потребоваться предоставить список серверов прямо в игре, чтобы дополнить список, предоставляемый интерфейсом Steam. Пример получения списка серверов для вашей игры и отображения его пользователю показан в ServerBrowser.cpp.
  • Inventory.cpp/h. Служба инвентаря Steam
    Показанное использование API:
    • Инвентарь Steam. Интеграция с инвентарём Steam, который предоставляет доступ к экономике Steam. Эта функция позволяет легко интегрировать предметы в игру.

Если в вашей игре есть движок для аутентификации и подбора игр, который вы будете использовать, вам может потребоваться убрать определение USE_GS_AUTH_API из Spacewars.h. Если удалить это определение, приложение-образец перестанет использовать аутентификацию и подбор игр Steam, но вы по-прежнему сможете пользоваться другими функциями, такими как достижения или информация о друзьях, а также изучать код.