Nenhum singleton de API no XBOX Game Development Kit (GDK)
O Steamworks segue um padrão em que cada conjunto de recursos da API é definido como uma interface (por exemplo, todas as funções de estatísticas do usuário estão na interfaceISteamUserStats e o armazenamento remoto está em ISteamRemoteStorage), cujas instâncias são disponibilizadas assim que a API é inicializada pelo jogo no código. O singleton da API do Steamworks que é inicializado no início do jogo fornece essas funções e controla o estado durante todo o tempo de vida do aplicativo.
Esse não é o caso das APIs do XBOX Game Development Kit (GDK), que favorecem uma API C em que grande parte do contexto e do estado atual dos dados da API deve ser mantida pelo próprio jogo e passada para as várias funções da API. Por exemplo, depois de autenticar um usuário com os XBOX services, o jogo deve manter o identificador de contexto dos XBOX services e um identificador de usuário. As APIs usadas para obter essas informações não as “lembram” durante todo o tempo de vida dos seus jogos como o Steamworks faz. Portanto, você precisa adicionar variáveis de membro à classe do seu jogo ou controlar esses identificadores de outra forma no seu jogo.
Funções assíncronas e retornos de chamada
As funções assíncronas no Steamworks disparam eventos que você pode assinar com a macroSTEAM_CALLBACK ou com uma variável CCallResult. Quando um evento correspondente ao tipo de struct de evento especificado é disparado, o método especificado é chamado e recebe uma struct de evento como seu único argumento. Essa struct contém o resultado retornado pela API, bem como informações contextuais disponíveis anteriormente que podem ser necessárias para lidar com os resultados da chamada. Por exemplo, ao chamar ISteamUserStats::DownloadLeaderboardEntries, você precisa de um identificador SteamLeaderboard_t na função de retorno de chamada para passar para ISteamUserStats::DownloadLeaderboardEntries, que você pode obter como membro da struct LeaderboardScoresDownloaded_t passada como parâmetro para o método de retorno de chamada que você definiu.
No XBOX Game Development Kit (GDK), todas as ações assíncronas seguem um padrão diferente: você cria uma struct XAsyncBlock, opcionalmente a atribui a uma fila de tarefas e, em seguida, chama o método de API assíncrono. Depois que essa chamada de API é concluída, ela dispara a função de retorno de chamada definida como membro do XAsyncBlock e fornece um ponteiro para o bloco assíncrono como único argumento. Se você precisar acessar informações dentro da função de retorno de chamada, poderá usar o membro de ponteiro de contexto do bloco assíncrono para isso. Ao contrário do Steam, as informações nessa struct de contexto não são fornecidas automaticamente; você precisa criá-la por conta própria. Usando nosso exemplo anterior, se você precisasse acessar um conjunto de dados na sua função de retorno de chamada, poderia fazer o seguinte, conforme mostrado neste exemplo de código.
O exemplo anterior também inclui um ponteiro para
this por meio de shared_from_this() para que a função de retorno de chamada possa chamar métodos de instância ou acessar variáveis de membro, se necessário. Tenha muito cuidado ao passar ponteiros brutos devido a problemas de tempo de vida. Observe também que, se você precisar acessar apenas uma variável no seu retorno de chamada, poderá simplesmente definir o valor do ponteiro context do seu bloco assíncrono como um ponteiro para esse valor e, em seguida, convertê-lo para o tipo desse valor no seu retorno de chamada, em vez de precisar definir uma struct.SteamAPI_RunCallbacks. Isso não é necessário no XBOX Game Development Kit (GDK). Os retornos de chamada são disparados depois que a tarefa assíncrona despachada pela fila de tarefas é concluída, se você estiver usando uma fila de tarefas de pool de threads, que é o padrão.
Para ter mais controle, você pode despachar a tarefa assíncrona manualmente para um thread específico chamando XTaskQueueDispatch ao usar uma fila de tarefas manual. Isso é mais complexo, e os detalhes sobre como fazer isso estão fora do escopo deste guia. Para obter mais informações sobre como o XBOX Game Development Kit (GDK) lida com operações de API assíncronas, incluindo um exemplo de código, consulte Modelo de programação assíncrona.
Fonte de verdade para APIs gerenciadas pelo título
Com o Steamworks, a API é a única fonte de verdade para praticamente todos os valores que passam por ela. As estatísticas do usuário são obtidas da API e calculadas com base nos valores deISteamUserStats::GetStat/ISteamUserStats::SetStat, por exemplo, e você não precisa armazenar esses valores em outro lugar.
As APIs de conquistas e de estatísticas/placares de líderes do XBOX Game Development Kit (GDK) têm uma opção para serem gerenciadas pelo título, para desenvolvedores que desejam mais flexibilidade e simplicidade nas chamadas que precisam fazer. Os valores das APIs gerenciadas pelo título são, como o nome sugere, gerenciados pelo seu título. A única fonte de verdade para esses valores é o seu jogo, que pode armazenar os valores em qualquer lugar, por exemplo, em um arquivo de salvamento, no armazenamento em nuvem ou em um servidor de back-end de terceiros. O valor armazenado nos servidores da rede XBOX (também conhecida como XBOX Live) pode ser usado como um instantâneo que você atualiza ocasionalmente, mas não deve ser sua única fonte de verdade em tempo de execução.
Uma opção alternativa às estatísticas/conquistas gerenciadas pelo título são as estatísticas/conquistas baseadas em eventos. Elas usam eventos de telemetria para atualizar o progresso das conquistas de um usuário ou recalcular suas estatísticas, e consideram os XBOX services como sua fonte de verdade. Você pode escolher qual API deseja usar para estatísticas e conquistas na página Gameplay Setting do seu jogo no Partner Center.
Para obter mais informações sobre isso, consulte as descrições nos tópicos que comparam Estatísticas baseadas em eventos e gerenciadas pelo título e Conquistas baseadas em eventos e gerenciadas pelo título. Às vezes, você poderá ver essas APIs mencionadas pelos nomes anteriores Stats/Achievements 2013 (baseadas em eventos) e Stats/Achievements 2017 (gerenciadas pelo título).
O XBOX Game Development Kit (GDK) é multiplataforma
Os jogos que usam as APIs do Steamworks podem presumir que são sempre iniciados pelo Steam e, portanto, a API pode injetar algum contexto na inicialização sobre quem está jogando. O XBOX Game Development Kit (GDK) pode ser usado por jogos executados em um console XBOX, em um PC por meio do aplicativo XBOX Gaming ou em diversos dispositivos e inicializadores. Portanto, algum contexto que está disponível automaticamente com o Steam pode precisar ser inicializado manualmente com o XBOX Game Development Kit (GDK), como a identidade do usuário. Para obter acesso a essas informações, você pode seguir as etapas do tópico Inicializando o GDK deste guia, que fornece instruções para autenticar um usuário com a conta Microsoft/gamertag dele. Isso também significa que há alguns paradigmas nas funções do XBOX Game Development Kit (GDK) adaptados a cenários de console, como o suporte à entrada de vários usuários nas APIsXUser, que não têm equivalente no PC.
Empacotamento
A maioria dos jogos no Steam pode usar as funções da API do Steamworks simplesmente configurando as informações do jogo no portal de administração do Steamworks, baixando o SDK, importando os arquivos necessários e inicializando a API no código. Depois dessas etapas, seu jogo se integra à API do Steamworks de qualquer lugar em que for iniciado, como um editor de mecanismo de jogo. Para que as APIs do XBOX Game Development Kit (GDK) funcionem, seu jogo precisa primeiro ser empacotado. Para empacotar seu jogo corretamente, você precisa editar o arquivoMicrosoftGame.config do seu jogo e usar a ferramenta MakePkg do XBOX Game Development Kit (GDK) para criar o pacote MSIXVC do seu jogo, que você pode então fazer sideload como um aplicativo da Microsoft Store em um PC com o Modo de Desenvolvedor habilitado.
Isso também significa que, ao contrário dos jogos do Steamworks, algumas funcionalidades do XBOX Game Development Kit (GDK) não funcionam em um editor de mecanismo de jogo ou em outros ambientes de tempo de desenvolvimento sem primeiro empacotar o jogo.
Para obter mais informações sobre empacotamento, consulte os recursos a seguir.
