Windows Dev Center

Adicionar compras no aplicativo a um jogo em DirectX

Você pode vender produtos e recursos aos jogadores enquanto eles jogam seu jogo da Windows Store. Neste tópico, mostraremos como habilitar essas ofertas em seu jogo. Este tópico descreve um exemplo para explorar o código necessário, qual deve ser a experiência do jogador e como testar uma compra no jogo (com um código de teste).

Observação  O cliente pode fazer uma compra apenas se tiver adquirido a versão completa do jogo.

Habilitando compras no jogo

Este tópico mostra o código que pode ser adicionado ao exemplo Marble Maze. Esse exemplo é um jogo no qual o jogador rola uma bolinha por um tabuleiro; quando o jogo começa, a bolinha é branca. Esse código permite que o jogador compre uma bolinha de cor diferente enquanto joga o jogo.

O modo de iniciar o processo de compra no jogo depende do design do jogo. Este exemplo usa um botão da barra de aplicativos para iniciar a compra. Veja o código XAML para o botão da barra de aplicativos.



<Button Style="{StaticResource AppBarButtonStyle}" 
        AutomationProperties.Name="Change Marble" 
        Click="ChangeMarbleButton_Click">
    <Button.ContentTemplate>
        <DataTemplate>
            <Path   Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=TemplatedParent}}" 
                    Fill="White"
                    Width="20" Height="20" StrokeThickness="2" Stretch="Uniform">
                <Path.Data>
                    <EllipseGeometry Center="10,10" RadiusX="20" RadiusY="20" />
                </Path.Data>
            </Path>
        </DataTemplate>
    </Button.ContentTemplate>
</Button>

E aqui, a aparência da barra de aplicativos e da bolinha inicial (gratuita) no exemplo.

Bolinha gratuita (padrão) em Marble Maze

O botão da barra de aplicativos aciona o manipulador de eventos ChangeMarbleButton_Click. Este exemplo mostra o manipulador de eventos.

Observação  Este código representa a compra no jogo. Mostraremos o código para testar uma compra na seção Simulando uma compra, mais adiante neste tópico.

// Get the license info
// The next line is commented out for testing.
auto licenseInformation = CurrentApp.LicenseInformation;

// The next line is commented out for production/release.
// auto  licenseInformation = CurrentAppSimulator::LicenseInformation;

// Check to see if the player already owns the item.
if (!licenseInformation->ProductLicenses->Lookup("blueMarble")->IsActive)
{
    // The player does not own the item. Purchase the marble.
    concurrency::task<Platform::String^> purchaseOperation(CurrentApp::RequestProductPurchaseAsync("blueMarble", false));
    purchaseOperation.then([this](task<Platform::String^> previousTask)
    {
        try 
        { 
            // This line raises an exception if the purchase fails.
            previousTask.get(); 
            auto licenseInformation = CurrentApp::LicenseInformation; 
            if (licenseInformation->ProductLicenses->Lookup("blueMarble")->IsActive) 
            { 
                // Marble purchased.
                m_renderer.SwitchMarble();
            } 
            else 
            { 
                // Marble not purchased.
                // Notify the player.
            } 
        } 
        catch(Platform::Exception^ exception) 
        { 
            // Purchase failed.
            // Notify the player.
        } 
        });
}
else
{
    // The player does own the item.
    // Switch the marble color.
    m_renderer.SwitchMarble();
}

// Close the app bar.
bottomAppBar->IsOpen = false;


Primeiramente, o código do exemplo anterior confere se o jogador já tem o produto "blueMarble" usando o método CurrentApp::LicenseInformation::ProductLicenses::IsActive. Se o jogador não tiver esse produto, o código iniciará uma tarefa assíncrona RequestProductPurchaseAsync.

Neste ponto, a API Windows.ApplicationModel.Store apresenta diversos prompts padrão para ajudar o jogador a comprar o produto no jogo. A seção Experiência de compra no jogo deste tópico demonstra a experiência de obtenção de uma bolinha de cor diferente.

Observação  A experiência de teste da compra durante o desenvolvimento é diferente. Falaremos sobre a experiência de teste em Simulando uma compra, mais adiante neste tópico.

A tarefa será retornada com êxito independente de o jogador confirmar a compra ou não. Então, quando isso acontece, você deve conferir se o produto está ativo chamando o método IsActive novamente. Porém, se ocorrer um erro durante a compra, a chamada a previousTask.get() emitirá uma exceção. Ache essa exceção em seu código e trate-a como uma compra não realizada.

Agora que o jogador comprou a bolinha de cor diferente, o exemplo exibe a nova bolinha. Você deve exibir a nova compra do jogador imediatamente.

Simulando uma compra

Para testar a funcionalidade da compra no jogo, você deve simular uma compra. O teste requer a alteração de todas as referências de CurrentApp para CurrentAppSimulator em seu código. O exemplo aqui mostra o corpo do manipulador de eventos da seção anterior com as alterações necessárias para simular uma compra.

Observação  Você pode usar diretivas pré-processador e #ifdefs para alterar o modo de simulação com mais facilidade.

// Get the license info
// The next line is commented out for testing.
// auto licenseInformation = CurrentApp.LicenseInformation;

// The next line is commented out for production/release.       
auto  licenseInformation = CurrentAppSimulator::LicenseInformation;

// Check to see if the player already owns the item.
if (!licenseInformation->ProductLicenses->Lookup("blueMarble")->IsActive)
{
    // The player does not own the item. Purchase the marble.
    concurrency::task<Platform::String^> purchaseOperation(CurrentAppSimulator::RequestProductPurchaseAsync("blueMarble", false));
    purchaseOperation.then([this](task<Platform::String^> previousTask)
    {
        try 
        { 
            // This line raises an exception if the purchase fails.
            previousTask.get(); 
            auto licenseInformation = CurrentAppSimulator::LicenseInformation; 
            if (licenseInformation->ProductLicenses->Lookup("blueMarble")->IsActive) 
            { 
                // Marble purchased.
                m_renderer.SwitchMarble();
            } 
            else 
            { 
                // Marble not purchased.
            } 
        } 
        catch(Platform::Exception^ exception) 
        { 
            // Purchase failed.
        } 
        });
}
else
{
    // The player does own the item.
    // Switch the marble color.
    m_renderer.SwitchMarble();
}

// Close the app bar.
bottomAppBar->IsOpen = false;


Quando este código é executado, a seguinte caixa de diálogo de teste é exibida:

Caixa de diálogo de teste durante a compra no jogo simulada

Se você selecionar Continue, a compra simulada será retornada com êxito. Isso equivale ao cliente selecionar Buy e pagar pelo produto.

Se você selecionar Cancel, a compra simulada será retornada sem êxito. Isso equivale ao cliente selecionar Cancel ou não pagar pelo produto.

Observação  Nos dois casos, você deve retornar o código de erro S_OK. A API Windows.ApplicationModel.Store retorna S_OK em ambos os casos.

Experiência de compra no jogo

As APIs Windows.ApplicationModel.Store exibem um conjunto padrão de prompts que confirmam a compra e o pagamento.

Quando o jogador opta por comprar um item no jogo, Windows.ApplicationModel.Store consulta a Windows Store em busca de informações atuais, como o preço do item:

Conferindo o preço durante uma compra no jogo

Em seguida, é exibido o prompt de confirmação:

Confirmando a compra no jogo

A descrição exibida no prompt de confirmação é a mesma que você inseriu na página Description da oferta de compra no jogo. Para saber mais sobre essa descrição, veja O que incluir na descrição do aplicativo.

Depois que o jogador clica em Yes, ele deve entrar em sua conta da Microsoft para confirmar a identidade. Ele precisará fazer isso em cada compra no aplicativo para evitar compras fraudulentas ou indesejadas.

Processando o pagamento para compras no jogo

Depois que a compra e a identidade do jogador forem confirmadas, o pagamento da compra será processado no método de pagamento padrão desse jogador. O jogador define seu método de pagamento padrão em suas configurações da Windows Store.

Quando a transação é concluída, é fornecido um prompt final de confirmação. O cliente deve clicar em Close para retornar ao jogo.

Confirmação da compra no jogo

Neste ponto, você deve confirmar se a compra foi concluída com êxito e, em caso positivo, realizar imediatamente as etapas para implementar a compra. Por exemplo, pode ser necessário adicionar um novo item ao inventário do jogador ou acrescentar uma opção no menu para habilitar um tema diferente. Neste exemplo, exibimos a bolinha com uma nova cor:

Implementando a compra no jogo imediatamente

Tópicos relacionados

Habilitar compras no aplicativo em seu próprio aplicativo (Windows)

 

 

Mostrar:
© 2015 Microsoft