게임 상태에 따라 터치 컨트롤 레이아웃 변경
게임은 플레이어에게 표시되는 터치 레이아웃을 변경하거나 현재 표시된 레이아웃이 사용 중인 상태를 수정할 수 있습니다. 두 방법을 함께 사용하면 플레이어에게 가장 자연스러운 환경을 만들 수 있습니다.
레이아웃 변경은 다음과 같은 경우에 사용해야 합니다.
- 다양한 제어 체계 간 전환(예: 차량 운전 및 1인칭 슈팅)
- 터치 레이아웃을 일시적으로 숨기기(전체 터치 환경, 영화 같은 환경 사용 목적)
터치 적응 번들의 컨텍스트 부분에 포함된 게임 상태 변경은 다음과 같은 경우에 사용해야 합니다.
- 플레이어의 현재 게임 상태에 따라 컨트롤의 이미지/아이콘 체계를 수정합니다. 일부 예시는 다음과 같습니다.
- 플레이어가 선택한 무기에 따라 발사 버튼의 이미지를 변경합니다.
- 플레이어가 현재 인벤토리에 있는 아이템에 따라 기능의 이미지를 변경합니다.
- 플레이어의 현재 게임 상태에 따라 컨트롤의 시각적 상태(표시성 및 사용)를 수정합니다. 일부 예시는 다음과 같습니다.
- 플레이어에게 탄약이 없는 경우 로드 버튼이 사용되지 않도록 설정합니다.
- 플레이어가 상호 작용할 수 있는 항목에 접근할 때 상호 작용 버튼을 표시하고 이동 시 보이지 않도록 합니다.
런타임 시 레이아웃 변경
지정된 레이아웃 표시 게임은 XGameStreamingShowTouchControlLayout
API를 사용하여 새 레이아웃을 표시해야 합니다.
현재 레이아웃 숨기기 게임은 XGameStreamingHideTouchControls
API를 사용하여 현재 표시된 레이아웃을 숨겨야 합니다.
게임이 게임의 현재 상태에 따라 레이아웃을 설정하는 방법 예시:
void OnGameStateChanged(GameState newState)
{
// Toggle to the set of touch overlay controls which best match the new state of the game
switch (newState)
{
case GameState::FirstPersonAction:
XGameStreamingShowTouchControlLayout("FirstPersonAction");
break;
case GameState::Driving:
XGameStreamingShowTouchControlLayout("Driving");
break;
case GameState::CutScene:
// Don't show any touch overlay controls while the cut scene is rendering
XGameStreamingHideTouchControls();
break;
}
}
런타임 시 상태 변경
게임 시작 시 초기 상태는 터치 적응 번들에 포함된 기본 상태로 정의됩니다. 터치 컨트롤 레이아웃에서 컨트롤은 런타임에 변경될 수 있는 속성의 상태를 참조해야 합니다.
게임은 XGameStreamingUpdateTouchControlsState
API를 활용하여 런타임 중에 상태를 업데이트할 수 있습니다.
예를 들어 다음의 "다시 로드" 컨트롤은 처음에 사용 안 함으로 설정되어 있지만 해당 기능이 있어야 하는 경우 사용하도록 설정됩니다.
//Example context file
{
"$schema": "https://raw.githubusercontent.com/microsoft/xbox-game-streaming-tools/main/touch-adaptation-kit/schemas/context/v3.0/context.json",
"state": {
"enableReload": false
}
}
//Example control in the layout:
{
"type": "button",
"action": "leftBumper",
"enabled": {
"$ref": "../../context.json#/state/enableReload"
}
...
}
게임은 API 호출을 통해 다음 상태를 업데이트합니다.
// In this example, after the player has switched their active weapon - the game updates the
// enabled state of reload based on whether the player has extra magazines.
//
// Assumes passing in game structure that includes the active weapon with appropriate state.
//
void GameStreamingClientManager::UpdateStateAfterItemsChange(const playerWeapon& playerWeapon)
{
// create an update for whether the reload button should be enabled
XGameStreamingTouchControlsStateOperation reloadEnabled;
reloadEnabled.operationKind = XGameStreamingTouchControlsStateOperationKind::Replace;
reloadEnabled.path = "/enableReload";
reloadEnabled.valueKind = XGameStreamingTouchControlsStateValueKind::Bool;
reloadEnabled.booleanValue = playerWeapon.activeWeapon.reloadClips > 0;
// combine all the updates into the update state call and make the call
XGameStreamingTouchControlsStateOperation[1] updateOperations = {reloadEnabled};
XGameStreamingUpdateTouchControlsState(updateOperations, _countof(updateOperations));
}