タイトルで管理される実績の取得
このトピックでは、以下の内容を説明します。
実績一覧を取得する
実行中のタイトルの実績を取得するには、次のように XblAchievementsGetAchievementsForTitleIdAsync を呼び出します。
XblAchievementsGetAchievementsForTitleIdAsync を呼び出す
C++
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of XAsyncBlock*.
XblAchievementsResultHandle resultHandle;
auto hr = XblAchievementsGetAchievementsForTitleIdResult(asyncBlock, &resultHandle);
if (SUCCEEDED(hr))
{
const XblAchievement* achievements = nullptr;
size_t achievementsCount = 0;
hr = XblAchievementsResultGetAchievements(resultHandle, &achievements, &achievementsCount);
for (size_t i = 0; i < achievementsCount; i++)
{
LogToScreen("Achievement %s: %s = %s",
achievements[i].id,
achievements[i].name,
(achievements[i].progressState == XblAchievementProgressState::Achieved) ? "Achieved" : "Not achieved");
}
XblAchievementsResultCloseHandle(resultHandle); // When you're done with the handle, close it.
achievements = nullptr; // Clear the array after calling XblAchievementsResultCloseHandle to the pointer to freed memory.
// Instead, you couldn't close the handle and store it. Then,
// if you needed to copy the handle, call XblAchievementsResultDuplicateHandle().
}
};
HRESULT hr = XblAchievementsGetAchievementsForTitleIdAsync(
xboxLiveContext,
xboxUserId,
titleId,
achievementType,
unlockedOnly,
orderBy,
skipItems,
maxItems,
asyncBlock.get()
);
if (SUCCEEDED(hr))
{
// The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
// If the call fails, std::unique_ptr will keep ownership and delete XAsyncBlock*.
asyncBlock.release();
}
詳細については、以下を参照してください。
- XAsyncBlock
- XblAchievement
- XblAchievementProgressState
- XblAchievementsGetAchievementsForTitleIdAsync
- XblAchievementsGetAchievementsForTitleIdResult
- XblAchievementsResultCloseHandle
- XblAchievementsResultDuplicateHandle
- XblAchievementsResultGetAchievements
実績結果の次のページを取得する
実績のページがさらにある場合があります。 確認するには、XblAchievementsResultHasNext を呼び出し、次いで XblAchievementsResultGetNextAsync を呼び出します。
XblAchievementsResultHasNext を呼び出す
フラット C API
HRESULT hr = S_OK;
bool hasNext = false;
if (achievementsResult != nullptr)
{
hr = XblAchievementsResultHasNext(achievementsResult, &hasNext);
}
詳細については、「XblAchievementsResultHasNext」を参照してください。
XblAchievementsResultGetNextAsync を呼び出す
実績の次のページを表示するには、次のように XblAchievementsResultGetNextAsync を呼び出します。
C++
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of XAsyncBlock*.
XblAchievementsResultHandle resultHandle;
auto hr = XblAchievementsResultGetNextResult(asyncBlock, &resultHandle);
if (SUCCEEDED(hr))
{
const XblAchievement* achievements = nullptr;
size_t achievementsCount = 0;
hr = XblAchievementsResultGetAchievements(resultHandle, &achievements, &achievementsCount);
for (size_t i = 0; i < achievementsCount; i++)
{
LogToScreen("Achievement %s: %s = %s",
achievements[i].id,
achievements[i].name,
(achievements[i].progressState == XblAchievementProgressState::Achieved) ? "Achieved" : "Not achieved");
}
XblAchievementsResultCloseHandle(resultHandle); // When you're done with the handle, close it.
achievements = nullptr; // Clear the array after calling XblAchievementsResultCloseHandle to the pointer to freed memory.
}
};
HRESULT hr = XblAchievementsResultGetNextAsync(
achievementsResult,
maxItems,
asyncBlock.get()
);
if (SUCCEEDED(hr))
{
// The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
// If the call fails, std::unique_ptr will keep ownership and delete XAsyncBlock*.
asyncBlock.release();
}
詳細については、以下を参照してください。
- XAsyncBlock
- XblAchievement
- XblAchievementProgressState
- XblAchievementsResultCloseHandle
- XblAchievementsResultGetAchievements
- XblAchievementsResultGetNextAsync
- XblAchievementsResultGetNextResult
単一の実績を取得する
1つの実績を獲得するには、次のように XblAchievementsGetAchievementAsync を呼び出します。
フラット C API
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of XAsyncBlock*.
XblAchievementsResultHandle resultHandle;
auto hr = XblAchievementsGetAchievementResult(asyncBlock, &resultHandle);
if (SUCCEEDED(hr))
{
const XblAchievement* achievements = nullptr;
size_t achievementsCount = 0;
hr = XblAchievementsResultGetAchievements( resultHandle, &achievements, &achievementsCount );
// Use the achievements array to read the achievement data.
XblAchievementsResultCloseHandle(resultHandle); // When you're done with the handle, close it.
achievements = nullptr; // Clear the array after calling XblAchievementsResultCloseHandle to avoid the pointer to freed memory.
}
};
HRESULT hr = XblAchievementsGetAchievementAsync(
xboxLiveContext,
xboxUserId,
scid,
achievementId.c_str(),
asyncBlock.get()
);
if (SUCCEEDED(hr))
{
// The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
// If the call fails, std::unique_ptr will keep ownership and delete XAsyncBlock*.
asyncBlock.release();
}
詳細については、以下を参照してください。