在 DirectX 遊戲中新增在應用程式內購買的方式

Applies to Windows only

您可提供各樣產品與功能,讓玩家在玩您的 Windows 市集遊戲時購買。在本主題中,我們將說明如何在遊戲中啟用這些購物選項。 本主題會逐步解說範例,以探索必要的程式碼、玩家應有的體驗及如何使用測試程式碼測試在遊戲內購買。

附註  如果客戶已經購買您遊戲的完整版本,則只能進行在遊戲內購買。

啟用在遊戲內購買

本主題說明可新增至 Marble Maze 範例的程式碼。 此範例是一款讓玩家在板子上滾動彈珠的遊戲;遊戲開始時,彈珠為白色。此程式碼可讓玩家在玩遊戲時購買不同顏色的彈珠。

初始化在遊戲內購買的程序依您的遊戲設計方式而不同。此範例使用應用程式列按鈕來開始購買。 這裡是應用程式列按鈕的 XAML 程式碼。



<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>

而這裡是範例中應用程式列與一開始 (免費) 彈珠看起來的樣子。

Marble Maze 中的免費 (預設) 彈珠

應用程式列按鈕會觸發 ChangeMarbleButton_Click 事件處理常式。 這裡的範例說明事件處理常式。

附註  這是實際在遊戲內購買的程式碼。在本主題稍後的模擬購買一節,我們將示範測試購買的程式碼。


// 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;


前述範例中的程式碼使用 CurrentApp::LicenseInformation::ProductLicenses::IsActive 方法,先檢查玩家是否已經擁有 "blueMarble" 產品。如果玩家沒有該產品,程式碼會啟動非同步 RequestProductPurchaseAsync 工作。

此時,Windows.ApplicationModel.Store API 會呈現一連串的標準提示,協助玩家購買遊戲內的產品。本主題中的在遊戲內購買經驗一節會示範玩家取得不同顏色彈珠的經驗。

附註  在開發期間測試購買的經驗不盡相同。我們會在本主題稍後的模擬購買中逐步解說測試經驗。

不管玩家是否確認購買,工作都將順利傳回。因此,當工作傳回時,您必須再次呼叫 IsActive 方法,確認產品是否使用中。 不過,如果在購買時發生錯誤,呼叫 previousTask.get() 會產生例外狀況。在程式碼中攔截此例外狀況,並將它當作失敗的購買處理。

現在,玩家已經購買不同顏色的彈珠,我們的範例會顯示新的彈珠。您必須立即顯示玩家新購買的物品。

模擬購買

為了測試在遊戲內購買功能,您必須模擬購買。您需要在程式碼中,將 CurrentApp 的每個參考變更為 CurrentAppSimulator 以進行測試。以下範例顯示前一節的事件處理常式內文,與模擬購買所需的變更。

附註  您可使用前置處理器指示詞與 #ifdefs,更輕易地變更為模擬模式。


// 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;


當此程式碼執行時,會顯示以下測試對話方塊:

模擬在遊戲內購買期間顯示的測試對話方塊

如果您選取 [Continue],模擬的購買會順利傳回。 這等同於客戶選取 [Buy] 並支付產品費用。

如果您選取 [Cancel],模擬的購買不會順利傳回。 這等同於客戶選取 [Cancel] 或未支付產品費用。

附註  在這兩個情況下,您必須傳回錯誤碼 S_OK。 在這兩個情況下,Windows.ApplicationModel.Store API 會傳回 S_OK

在遊戲內購買經驗

Windows.ApplicationModel.Store API 會顯示一組標準的提示,確認購買與付款。

當玩家選擇從遊戲購買某個項目時,Windows.ApplicationModel.Store 會向 Windows 市集查詢目前的資訊,如項目的價格:

在遊戲內購買期間確認價格

接著會顯示確認提示:

確認在遊戲內購買

確認提示所顯示的描述就是您在遊戲內的購買選項 [Description] 頁面中輸入的描述。如需有關這個描述的相關資訊,請參閱您的應用程式描述應包含哪些資訊

玩家按一下 [Yes] 之後,必須登入 Microsoft 帳戶以確認身分。玩家必須在每次在應用程式內購買執行這個動作,以防止假冒身分和無意的購買。

處理在遊戲內購買的款項

確認購買及玩家的身分之後,就會使用玩家的預設付款方式來處理購買的款項。玩家可在 Windows 市集設定中設定自己的預設付款方式。

交易完成時,系統會提供最後的確認提示,客戶按一下 [Close] 即可回到遊戲。

確認在遊戲內購買

此時,您必須確認購買已成功;如果成功購買,就要立即執行實作購買的步驟。例如,您可能需要新增項目至玩家的物品欄,或新增功能表選項來啟用不同的佈景主題。 在此範例中,我們顯示新顏色的彈珠:

立即實作在遊戲內購買

相關主題

從您的應用程式啟用在應用程式內購買 (Windows)

 

 

顯示:
© 2014 Microsoft