次の方法で共有


XUserGetGamerPictureResult

XUserGetGamerPictureAsync の呼び出しの結果を取得します。

構文

HRESULT XUserGetGamerPictureResult(  
         XAsyncBlock* async,  
         size_t bufferSize,  
         void* buffer,  
         size_t* bufferUsed  
)  

パラメーター

async _Inout_
型: XAsyncBlock*

XAsyncBlock は、呼び出しのステータスをポーリングし、呼び出しの結果を取得します。

bufferSize _In_
型: size_t

buffer パラメーターのバッファーのサイズ。

buffer _Out_writes_bytes_to_(bufferSize,bufferUsed)
型: void

ゲーマー アイコンを含むバッファー。

bufferUsed_Out_opt_
型: size_t*

ゲーマー アイコンを保持するバッファーの量が格納されます。

戻り値

型: HRESULT

HRESULT 成功またはエラー コード。
エラー コードの一覧については、「エラー コード」を参照してください。

解説

"表示名およびゲーマー アイコン" の XR には、ユーザー名とアバター イメージの表示方法に関する特定の要件が記載されています。 詳細については、Xbox One ゲームとハブ アプリに関する Xbox の要件 (Xbox デベロッパー向けダウンロード -> パートナー、公開、リリース管理情報 -> XGD パートナー ドキュメント) を参照してください。

XUserGetGamerPictureAsync の呼び出しの結果を取得するには、XUserGetGamerPictureResult を呼び出します。

XUserGetGamerPictureAsync によって返されるゲーマー アイコンを取得するために {XUserGetGamerPictureResult](xusergetgamerpictureresult.md) が必要とするバッファー サイズを取得するには、XUserGetGamerPictureResultSize を呼び出します。

返されるゲーマーアイコンの形式は PNG 形式の画像です。 アイコンのサイズは最大 2^32 バイトになることがあります。

次の例は、ゲーマー アイコンを読み込む方法を示しています。

HRESULT LoadGamerPicComplete(XAsyncBlock* abResult)
{
    try
    {
        struct CreateTextureContext
        {
            User* This;
            ImTextureID TextureId;
            std::vector<unsigned char> GamerpicBuffer;
        };

        auto context = std::make_unique<CreateTextureContext>();
        context->This = this;
        context->TextureId = IMTEXTUREID_INVALID;

        // Get the buffer size and set up a buffer to contain it
        size_t bufferSize;
        RETURN_IF_FAILED(XUserGetGamerPictureResultSize(abResult, &bufferSize));
        context->GamerpicBuffer.resize(bufferSize);

        size_t bufferUsed;
        RETURN_IF_FAILED(XUserGetGamerPictureResult(
            abResult,
            context->GamerpicBuffer.size(),
            context->GamerpicBuffer.data(),
            &bufferUsed));
        FAIL_FAST_HR_IF(E_UNEXPECTED, bufferSize != bufferUsed);

        // Create some async work to create a dx texture off the UI thread
        // and then set the texture id back on the UI thread
        auto abCreateTexture = std::make_unique<XAsyncBlock>();
        ZeroMemory(abCreateTexture.get(), sizeof(*abCreateTexture));
        abCreateTexture->queue = abResult->queue;
        abCreateTexture->context = context.get();

        // Set the texture id in the completion on the UI thread
        abCreateTexture->callback = [](XAsyncBlock* ab)
        {
            auto context = static_cast<CreateTextureContext*>(ab->context);
            context->This->_textureId = context->TextureId;
            delete context;
            delete ab;
        };

        // Worker will create the texture on a work thread
        auto createTextureWorker = [](XAsyncBlock* ab) -> HRESULT
        {
            auto context = static_cast<CreateTextureContext*>(ab->context);
            auto dimension = GetDimensionFromSize(GamerPicSize);
            RETURN_IF_FAILED(CreateTextureFromPng(context->GamerpicBuffer.data(), context->GamerpicBuffer.size(), &context->TextureId));
            return S_OK;
        };

        // Create the texture on a work thread
        if (SUCCEEDED_LOG(XAsyncRun(abCreateTexture.get(), createTextureWorker)))
        {
            context.release();
            abCreateTexture.release();
        }
    }
    CATCH_RETURN();
    return S_OK;
}

HRESULT LoadGamerPicAsync(XTaskQueueHandle queue, uint32_t cancelTime = 0)
{
    auto asyncBlock = std::make_shared<XAsyncBlock>();
    ZeroMemory(asyncBlock.get(), sizeof(*asyncBlock));
    asyncBlock->queue = queue;

    struct GamerPicContext
    {
        User* User;
        std::shared_ptr<XAsyncBlock> AsyncBlock;
    };

    auto context = std::make_unique<GamerPicContext>();
    context->User = this;
    context->AsyncBlock = asyncBlock;
    asyncBlock->context = context.get();

    asyncBlock->callback = [](XAsyncBlock* ab)
    {
        std::unique_ptr<GamerPicContext> context(reinterpret_cast<GamerPicContext*>(ab->context));
        LOG_IF_FAILED(context->User->LoadGamerPicComplete(ab));
    };

    if (cancelTime != 0)
    {
        std::thread cancelThread(
            [asyncBlock]()
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(5000));
            XAsyncCancel(asyncBlock.get());
        });

        cancelThread.detach();
    }

    if (SUCCEEDED_LOG(XUserGetGamerPictureAsync(_handle.get(), GamerPicSize, asyncBlock.get())))
    {
        context.release();
    }

    return S_OK;
}

要件

ヘッダー: XUser.h

ライブラリ: xgameruntime.lib

サポートされているプラットフォーム: Windows、Xbox One ファミリー本体、Xbox Series 本体

関連項目

XUser

XUserGetGamerPictureAsync

XUserGetGamerPictureResultSize