주 게임 개체 정의Define the main game object

샘플 게임의 기본 프레임 워크를 배치 하 고 높은 수준의 사용자 및 시스템 동작을 처리 하는 상태 시스템을 구현 하면, 규칙 및 게임 샘플 게임을 설정 하는 메커니즘을 검사 하는 것이 좋습니다.Once you’ve laid out the basic framework of the sample game and implemented a state machine that handles the high-level user and system behaviors, you’ll want to examine the rules and mechanics that turn the game sample into a game. 게임 샘플의 기본 개체의 세부 정보 및 게임 규칙 게임 세계를 상호 변환 하는 방법에 살펴보겠습니다.Let’s look at the details of the game sample's main object, and how to translate game rules into interactions with the game world.

참고

이 샘플의 최신 게임 코드를 다운로드하지 않은 경우 Direct3D 게임 샘플로 이동합니다.If you haven't downloaded the latest game code for this sample, go to Direct3D game sample. 이 샘플은 UWP 기능 샘플의 큰 컬렉션의 일부입니다.This sample is part of a large collection of UWP feature samples. 샘플을 다운로드하는 방법에 대한 지침은 GitHub에서 UWP 샘플 가져오기를 참조하세요.For instructions on how to download the sample, see Get the UWP samples from GitHub.

목표Objective

게임 규칙 및 UWP DirectX 게임에 대 한 메커니즘을 구현 하기 위한 기본 개발 기술을 적용 하는 방법에 알아봅니다.Learn how to apply basic development techniques to implement game rules and mechanics for a UWP DirectX game.

주 게임 개체Main game object

이 샘플 게임 Simple3DGame 기본 게임 개체 클래스입니다.In this sample game, Simple3DGame is the main game object class. 인스턴스의 Simple3DGame 개체에서 생성 되는 App::Load 메서드.An instance of Simple3DGame object is constructed in the App::Load method.

합니다 Simple3DGame 클래스 개체:The Simple3DGame class object:

  • 게임 플레이 논리의 구현을 지정합니다Specifies implementation of the gameplay logic

  • 통신 하는 메서드가 포함 되어 있습니다.Contains methods that communicate:

    • 응용 프로그램 프레임 워크에 정의 된 상태 시스템에 게임 상태에서 변경 내용입니다.Changes in the game state to the state machine defined in the app framework.
    • 게임 개체 자체에 앱에서 게임 상태 변경 내용입니다.Changes in the game state from the app to the game object itself.
    • 게임의 UI (오버레이 및 헤드업 디스플레이), 애니메이션 및 물리학 (dynamics) 업데이트 하는 것에 대 한 세부 정보입니다.Details for updating the game's UI (overlay and heads-up display), animations, and physics (the dynamics).

    참고

    그래픽의 업데이트를 처리 합니다 GameRenderer 게임에서 사용 하는 그래픽 장치 리소스를 사용 하는 메서드를 포함 하는 클래스입니다.Updating of graphics is handled by the GameRenderer class, which contains methods to obtain and use graphics device resources used by the game. 자세한 내용은 참조 하세요. 렌더링 프레임 워크 i: 렌더링에 대 한 소개합니다.For more info, see Rendering framework I: Intro to rendering.

  • 게임 세션 수준에서 정의 하는 데이터 또는 높은 수준에서 게임을 정의 하는 방법에 따라 수명에 대 한 컨테이너로 사용 됩니다.Serves as a container for the data that defines a game session, level, or lifetime, depending on how you define your game at a high level. 이 예에서 게임 상태 데이터를 게임의 수명 동안 이며 한 번 초기화 되는 사용자가 게임을 시작 하는 경우.In this case, the game state data is for the lifetime of the game, and is initialized one time when a user launches the game.

메서드 및이 클래스 개체에 정의 된 데이터를 보려면로 이동 Simple3DGame 개체합니다.To view methods and data defined in this class object, go to Simple3DGame object.

초기화 하 고 게임 시작Initialize and start the game

플레이어가 게임을 시작하면 게임 오브젝트에서 해당 상태를 초기화하고 오버레이를 만들어 추가하며 플레이어의 성과를 추적하는 변수를 설정하고 레벨을 구성하는 데 사용할 개체를 인스턴스화해야 합니다.When a player starts the game, the game object must initialize its state, create and add the overlay, set the variables that track the player's performance, and instantiate the objects that it will use to build the levels. 이 샘플에서는 이렇게 경우 새 GameMain 의 인스턴스가 만들어질 App::Load합니다.In this sample, this is done when the new GameMain instance is created in App::Load.

게임 개체 Simple3DGame, 만들어집니다 합니다 GameMain 생성자입니다.The game object, Simple3DGame, is created in the GameMain constructor. 사용 하 여 초기화 한 다음를 Simple3DGame::Initialize 중 메서드를 비동기 만들기 작업에는 GameMain 생성자.It is then initialized using the Simple3DGame::Initialize method during the async create task in the GameMain constructor.

Simple3DGame::Initialize 메서드Simple3DGame::Initialize method

게임 샘플 게임 개체의 다음 구성 요소를 설정 합니다.The game sample sets up the following components in the game object:

  • 새 오디오 재생 개체를 만듭니다.A new audio playback object is created.
  • 레벨 기본 요소, 탄환 및 장애물 배열을 비롯한 게임의 그래픽 기본 요소에 대한 배열을 만듭니다.Arrays for the game's graphic primitives are created, including arrays for the level primitives, ammo, and obstacles.
  • 게임 상태 데이터를 저장할 위치(Game)를 만들고 ApplicationData::Current에 지정된 앱 데이터 설정 저장 위치에 배치합니다.A location for saving game state data is created, named Game, and placed in the app data settings storage location specified by ApplicationData::Current.
  • 게임 타이머와 초기 게임 내 오버레이 비트맵을 만듭니다.A game timer and the initial in-game overlay bitmap are created.
  • 특정 보기 및 특정 투영 매개 변수 집합을 사용하여 새 카메라를 만듭니다.A new camera is created with a specific set of view and projection parameters.
  • 입력 장치(컨트롤러)가 카메라와 동일한 시작 피치 및 요로 설정되어 플레이어의 시작 제어 위치와 카메라 위치 간에 1대1 대응이 되도록 합니다.The input device (the controller) is set to the same starting pitch and yaw as the camera, so the player has a 1-to-1 correspondence between the starting control position and the camera position.
  • 플레이어 개체를 만들고 활성 상태로 설정합니다.The player object is created and set to active. 플레이어의 근접성 벽 및 장애물 때문에 검색 하 고 집중 교육 중단 될 수 있는 위치에 배치 하기에서 카메라를 유지 하 구 개체를 사용 합니다.We use a sphere object to detect the player's proximity to walls and obstacles and to keep the camera from getting placed in a position that might break immersion.
  • 게임 월드의 기본 요소를 만듭니다.The game world primitive is created.
  • 원통형 장애물을 만듭니다.The cylinder obstacles are created.
  • 타겟(Face 개체)을 만들고 각각에 대해 번호를 지정합니다.The targets (Face objects) are created and numbered.
  • 탄환을 만듭니다.The ammo spheres are created.
  • 레벨을 만듭니다.The levels are created.
  • 최고 점수를 로드합니다.The high score is loaded.
  • 이전에 저장된 게임 상태를 로드합니다.Any prior saved game state is loaded.

이제 게임에 월드, 플레이어, 장애물, 타겟 및 탄환 같은 모든 주요 구성 요소의 인스턴스가 있습니다.The game now has instances of all the key components: the world, the player, the obstacles, the targets, and the ammo spheres. 또한 위의 모든 구성 요소 및 각 레벨별 해당 동작에 대한 구성을 나타내는 레벨 인스턴스도 있습니다.It also has instances of the levels, which represent configurations of all of the above components and their behaviors for each specific level. 게임에서 레벨을 구성하는 방법을 살펴보겠습니다.Let's see how the game builds the levels.

빌드 및 부하 게임 수준Build and load game levels

대부분의 어려운 수준 생성 이루어집니다에 대 한는 Level.h/.cpp 에서 파일을 찾을 합니다 GameLevels 샘플 솔루션의 폴더입니다.Most of the heavy lifting for the level construction is done in the Level.h/.cpp files found in the GameLevels folder of the sample solution. 매우 구체적인 구현에 중점을 둡니다, 때문에에서는 없습니다 다루며, 이러한 여기Because it focuses on a very specific implementation, we won't be covering them here. 중요한 점은 각 레벨에 대한 코드가 별도의 LevelN 개체로 실행된다는 점입니다.The important thing is that the code for each level is run as a separate LevelN object. 게임을 확장 하려는 경우 만들 수 있습니다는 수준 개체를 매개 변수로 이동 하 고 임의로 할당된 된 번호를 사용 하는 장애물 및 대상에 배치 합니다.If you'd like to extend the game, you can create a Level object that takes an assigned number as a parameter and randomly places the obstacles and targets. 또는 리소스 파일 또는 심지어 인터넷에서 수준 구성 데이터를 로드 하도록 할 수도 있습니다.Or, you can have it load level configuration data from a resource file, or even the Internet.

게임 플레이 정의 합니다.Define the game play

이제 게임을 어셈블하는 데 필요한 모든 구성 요소가 있습니다.At this point, we have all the components we need to assemble the game. 수준을 기본 형식에서 메모리에 생성 된 및 상호 작용 하려면 플레이어에 대 한 준비가 되었습니다.The levels have been constructed in memory from the primitives, and are ready for the player to start interacting with.

사항 최상의 게임 플레이어 입력에 즉시 대응할 및 즉각적인 피드백을 제공 합니다.Tthe best games react instantly to player input, and provide immediate feedback. 이것이 twitch-작업을 실시간 인칭 shooters 신중 하 게, 턴 기반 전략 게임에서 게임, 모든 형식에 대해 true입니다.This is true for any type of a game, from twitch-action, real-time First-person shooters to thoughtful, turn-based strategy games.

Simple3DGame::RunGame 메서드Simple3DGame::RunGame method

게임에는 수준을 재생할 때 합니다 Dynamics 상태입니다.When playing a level, the game is in the Dynamics state.

GameMain::Update 은 아래와 같이 프레임당 한 번 응용 프로그램 상태를 업데이트 하는 주요 업데이트 루프입니다.GameMain::Update is the main update loop that updates the application state once per frame as shown below. 업데이트 루프에서 호출 합니다 Simple3DGame::RunGame 게임이 되는 경우 작업을 처리 하는 메서드를 Dynamics 상태.In the update loop, it calls the Simple3DGame::RunGame method to handle the work if the game is in the Dynamics state.

// Updates the application state once per frame.
void GameMain::Update()
{
    m_controller->Update(); //the controller instance has its own update loop.

    switch (m_updateState)
    {
        //...

    case UpdateEngineState::Dynamics:
        if (m_controller->IsPauseRequested())
        {
            //...
        }
        else
        {
            GameState runState = m_game->RunGame(); //when playing a level, the game is in the Dynamics state. Work is handled by Simple3DGame::RunGame method.
            switch (runState)
            {
                
      //...

Simple3DGame::RunGame 게임 루프의 현재 반복에 대 한 게임의 현재 상태를 정의 하는 데이터의 집합을 처리 합니다.Simple3DGame::RunGame handles the set of data that defines the current state of the game play for the current iteration of the game loop.

흐름 논리에서 게임 RunGame:Game flow logic in RunGame:

  • 해당 수준이 완료될 때까지 메서드에서 시간(초)을 계산하는 타이머를 업데이트하고 해당 레벨의 시간이 만료되었는지 테스트하여 확인합니다.The method updates the timer that counts down the seconds until the level is completed, and tests to see if the level's time has expired. 이 게임의 규칙 중 하나입니다: 시간이 다 되 고 모든 대상 촬영 된 것을 때를 통해 게임.This is one of the rules of the game: when time runs out and all the targets have not been shot, it's game over.
  • 시간이 만료되면 메서드에서 TimeExpired 게임 상태를 설정하고 이전 코드의 Update 메서드로 반환합니다.If time has run out, the method sets the TimeExpired game state, and returns to the Update method in the previous code.
  • 시간이 남으면 카메라 위치 업데이트, 특히 카메라 평면(플레이어가 보고 있는 곳)에서 투영되는 보기 법선의 각도와 컨트롤러가 폴링된 이전 시간으로부터 각도가 이동한 거리에 대한 업데이트를 위해 이동-보기 컨트롤러가 폴링됩니다.If time remains, the move-look controller is polled for an update to the camera position; specifically, an update to the angle of the view normal projecting from the camera plane (where the player is looking), and the distance that angle has moved from the previous time the controller was polled.
  • 이동-보기 컨트롤러에서 새 데이터를 기반으로 카메라가 업데이트됩니다.The camera is updated based on the new data from the move-look controller.
  • 역학 또는 플레이어 제어와 독립적인 게임 월드에 있는 개체의 애니메이션 및 동작이 업데이트됩니다.The dynamics, or the animations and behaviors of objects in the game world independent of player control, are updated. 이 게임 샘플에서는 합니다 UpdateDynamics() 메서드를 호출 하는 탄약 구 pillar 찾으면의 애니메이션 및 대상의 이동을 발생 되는 동작을 업데이트 합니다.In this game sample, the UpdateDynamics() method is called to update the motion of the ammo spheres that have been fired, the animation of the pillar obstacles and the movement of the targets. 자세한 내용은 게임 세계를 업데이트합니다.For more information, see Update the game world.
  • 메서드에서 성공적인 레벨 완료 조건을 충족했는지 확인합니다.The method checks to see if the criteria for the successful completion of a level have been met. 충족된 경우 레벨에 대한 점수를 마무리하고 6개 레벨 중 마지막 레벨인지 확인합니다.If so, it finalizes the score for the level and checks to see if this is the last level (of 6). 마지막 레벨이면 메서드에서 GameComplete 게임 상태를 반환하고, 그렇지 않으면 LevelComplete 게임 상태를 반환합니다.If it's the last level, the method returns the GameComplete game state; otherwise, it returns the LevelComplete game state.
  • 레벨이 완료되지 않은 경우 메서드에서 게임 상태를 __Active__로 설정하고 반환합니다.If the level isn't complete, the method sets the game state to Active and returns.

게임 세계를 업데이트 합니다.Update the game world

이 샘플에서는 게임을 실행 하는 경우는 Simple3DGame::UpdateDynamics() 에서 메서드를 호출 합니다 Simple3DGame::RunGame 메서드 (에서 이라고 GameMain::Update) 게임 장면에서 렌더링 되는 개체를 업데이트 합니다.In this sample, when the game is running, the Simple3DGame::UpdateDynamics() method is called from the Simple3DGame::RunGame method (which is called from GameMain::Update) to update objects that are rendered in a game scene.

UpdateDynamics 루프, 진행, 플레이어가 입력할 무관 게임 세계를 설정 하는 데 사용 되는 메서드는 몰입 형 게임 환경을 만들고 제공 하는 수준 호출 활성합니다.In the UpdateDynamics loop, call methods that are used to set the game world in motion, independent of the player input, create an immersive game experience and make the level come alive. 플레이어 입력 하지 않고 필요한 경우에 전 세계 숨을 쉬게 생활을 실현 하는 루프를 실행 중인 애니메이션 및 그래픽 렌더링 해야 하는 포함 됩니다.This includes graphics that needs to be rendered and running animation loops to bring about a living, breathing world even when there's no player input. 예를 들어, 트리는 바람에 swaying 해안 선과 시스템 번호를 확장 하 고 이동 외계인 몬스터 따라 cresting 웨이브 합니다.For example, trees swaying in the wind, waves cresting along shore lines, machinery smoking, and alien monsters stretching and moving around. 또한 플레이어 구와 월드 간의 충돌이나 탄약과 장애물 및 타겟과의 충돌을 포함한 개체 간의 조작도 포함합니다.It also encompasses the interaction between objects, including collisions between the player sphere and the world, or between the ammo and the obstacles and targets.

게임 루프는 항상 일반 인지 또는 게임 논리를 실제 알고리즘에 기반 하는지 여부를 게임 세계를 업데이트 게임 특히 일시 중지 되 면 제외 하 고 임의 유지 합니다.The game loop should always keep updating the game world whether it's based on game logic, physical algorithms, or whether it's just plain random, except when the game is specifically paused.

게임 샘플에서는 이 파이프라인을 역학이라고 하며 기둥 장애물의 올라가고 내려가는 동작 및 발사된 탄환의 모션 및 물리적 동작을 포함합니다.In the game sample, this principle is called dynamics, and it encompasses the rise and fall of the pillar obstacles, and the motion and physical behaviors of the ammo spheres as they are fired.

Simple3DGame::UpdateDynamics 메서드Simple3DGame::UpdateDynamics method

이 메서드는 네 가지 계산 집합을 처리합니다.This method deals with four sets of computations:

  • 월드에서 발사한 탄약 구형의 위치The positions of the fired ammo spheres in the world.
  • 필터 장애물의 애니메이션The animation of the pillar obstacles.
  • 플레이어와 월드 경계의 교차The intersection of the player and the world boundaries.
  • 장애물, 타겟, 기타 탄약 구형 및 월드와 탄약 구형의 충돌The collisions of the ammo spheres with the obstacles, the targets, other ammo spheres, and the world.

장애물의 애니메이션은 Animate.h/.cpp에 정의된 루프입니다.The animation of the obstacles is a loop defined in Animate.h/.cpp. 탄약 및 모든 충돌의 동작 간단한 물리학 알고리즘에서 정의 되, 코드에서 제공 되 고 중력 및 재질 속성을 포함 하 여 게임 세계에 대 한 전역 상수 집합으로 매개 변수화 합니다.The behavior of the ammo and any collisions are defined by simplified physics algorithms, supplied in the code and parameterized by a set of global constants for the game world, including gravity and material properties. 이러한 요소는 모두 게임 월드 좌표 공간에서 계산됩니다.This is all computed in the game world coordinate space.

흐름을 검토 합니다.Review the flow

장면에 있는 모든 개체를 업데이트 하 고 모든 충돌을 계산 했으므로, 이제는이 정보를 사용 하 여 해당 시각적 개체가 바뀌면서 그릴 해야 합니다.Now that we've updated all the objects in the scene and calculated any collisions, we need to use this info to draw the corresponding visual changes.

이후에 GameMain::Update() 현재 반복을 완료 게임 루프의 샘플 즉시 호출 render () 업데이트 된 개체 데이터를 가져와 플레이어를 제공 하는 새 장면을 생성 여기에 표시 합니다.After GameMain::Update() completes the current iteration of the game loop, the sample immediately calls Render() to take the updated object data and generate a new scene to present to the player, as shown here. 다음으로 렌더링에 살펴보겠습니다.Next, let's take a look at the rendering.

void GameMain::Run()
{
    while (!m_windowClosed)
    {
        if (m_visible)
        {
            switch (m_updateState)
            {
            case UpdateEngineState::Deactivated:
            case UpdateEngineState::TooSmall:
                // ...
                // otherwise fall through and do normal processing to get the rendering handled.
            default:
                CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
                Update(); // GameMain::Update calls Simple3DGame::RunGame() if game is in Dynamics state, uses Simple3DGame::UpdateDynamics() to update game world.
                m_renderer->Render(); //Render() is called immediately after the Update() loop
                m_deviceResources->Present();
                m_renderNeeded = false;
            }
        }
        else
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending);
        }
    }
    m_game->OnSuspending();  // exiting due to window close.  Make sure to save state.
}

게임 세계 그래픽 렌더링Render the game world's graphics

게임의 그래픽은 가능하면 자주 즉, 최대 주 게임 루프가 반복될 때마다 업데이트되는 것이 좋습니다.We recommend that the graphics in a game update as often as possible, which, at maximum, is every time the main game loop iterates. 루프가 반복되면 플레이어 입력에 관계없이 계임이 업데이트됩니다.As the loop iterates, the game is updated, with or without player input. 따라서 계산되는 애니메이션 및 동작을 원활하게 표시할 수 있습니다.This allows the animations and behaviors that are calculated to be displayed smoothly. 플레이어가 단추를 누를 때만 물이 흐르는 간단한 장면을 상상해 보세요.Imagine if we had a simple scene of water that only moved when the player pressed a button. 엄청 지루하게 보일 것입니다.That would make for terribly boring visuals. 뛰어난 게임은 원활하고 유동적으로 보입니다.A good game looks smooth and fluid.

위의 샘플 게임 루프를 회수 GameMain::Run합니다.Recall the sample game's loop as shown above in GameMain::Run. 게임의 주 창이 표시되고 스냅되거나 비활성화되지 않은 경우 게임이 계속 업데이트되어 해당 업데이트 결과를 렌더링합니다.If the game's main window is visible, and isn't snapped or deactivated, the game continues to update and render the results of that update. 합니다 렌더링 메서드를 검사 하는 것에 이제 해당 상태의으로 렌더링 합니다.The Render method we're examining now renders a representation of that state. 호출한 후 즉시 이루어집니다 업데이트를 포함 하는 RunGame 이전 섹션에서 설명 했던 업데이트 상태를 합니다.This is done immediately after a call to Update, which includes RunGame to update states, which was discussed in the previous section.

이 메서드는 3D 월드의 투영을 그린 다음 Direct2D 오버레이를 그 위에 그립니다.This method draws the projection of the 3D world, and then draws the Direct2D overlay on top of it. 완료되면 결합된 버퍼와 함께 최종 스왑 체인을 제공하여 표시합니다.When completed, it presents the final swap chain with the combined buffers for display.

참고

샘플 게임의 Direct2D 오버레이 대 한 두 가지 상태는: 게임이 일시 중지 메뉴와 게임에 터치 스크린이 이동-모양에 대 한 사각형 함께 십자 표시 되는 위치에 대 한 비트맵을 포함 하는 게임 정보 오버레이 표시 하는 위치 하나 컨트롤러입니다.There are two states for the sample game's Direct2D overlay: one where the game displays the game info overlay that contains the bitmap for the pause menu, and one where the game displays the cross hairs along with the rectangles for the touchscreen move-look controller. 점수 텍스트는 이 두 상태로 그립니다.The score text is drawn in both states. 자세한 내용은 참조 하세요. 렌더링 프레임 워크 i: 렌더링에 대 한 소개합니다.For more information, see Rendering framework I: Intro to rendering.

GameRenderer::Render 메서드GameRenderer::Render method

void GameRenderer::Render()
{
    bool stereoEnabled = m_deviceResources->GetStereoState();

    auto d3dContext = m_deviceResources->GetD3DDeviceContext();
    auto d2dContext = m_deviceResources->GetD2DDeviceContext();
   
        // ...
        if (m_game != nullptr && m_gameResourcesLoaded && m_levelResourcesLoaded)
        {
            // This section is only used after the game state has been initialized and all device
            // resources needed for the game have been created and associated with the game objects.
            //...
            auto objects = m_game->RenderObjects();
            for (auto object = objects.begin(); object != objects.end(); object++)
            {
                (*object)->Render(d3dContext, m_constantBufferChangesEveryPrim.Get()); // Renders the 3D objects
            }

        //...
        d3dContext->BeginEventInt(L"D2D BeginDraw", 1);
        d2dContext->BeginDraw(); //Start drawing the overlays
        
        // To handle the swapchain being pre-rotated, set the D2D transformation to include it.
        d2dContext->SetTransform(m_deviceResources->GetOrientationTransform2D());

        if (m_game != nullptr && m_gameResourcesLoaded)
        {
            // This is only used after the game state has been initialized.
            m_gameHud->Render(m_game); // Renders number of hits, shots, and time
        }

        if (m_gameInfoOverlay->Visible())
        {
            d2dContext->DrawBitmap(     // Renders the game overlay
                m_gameInfoOverlay->Bitmap(),
                m_gameInfoOverlayRect
                );
        }
        //...
    }
}

Simple3DGame 개체Simple3DGame object

메서드 및에 정의 된 데이터를 Simple3DGame 개체 클래스입니다.These are the methods and data that are defined in the Simple3DGame object class.

메서드Methods

에 정의 된 내부 메서드 Simple3DGame 포함:The internal methods defined on Simple3DGame include:

  • 초기화: 전역 변수의 시작 값을 설정하고 게임 개체를 초기화합니다.Initialize: Sets the starting values of the global variables and initializes the game objects. 설명 합니다 초기화 하 고 게임 시작 섹션입니다.This is covered in the Initialize and start the game section.
  • LoadGame: 새 레벨을 초기화하고 로드를 시작합니다.LoadGame: Initializes a new level and starts loading it.
  • LoadLevelAsync: 비동기 작업을 시작 (비동기 작업을 사용 하 여 잘 모르는 경우 병렬 패턴 라이브러리) 수준을 초기화 하 고 다음 장치 특정 수준 리소스를 로드 하는 렌더러의 비동기 작업을 호출 하 합니다.LoadLevelAsync: Starts an async task (if you're unfamiliar with async tasks, see Parallel Patterns Library) to initialize the level and then invoke an async task on the renderer to load the device specific level resources. 이 메서드는 별도의 스레드에서 실행되므로 ID3D11DeviceContext 메서드가 아니라 ID3D11Device 메서드만 이 스레드에서 호출할 수 있습니다.This method runs in a separate thread; as a result, only ID3D11Device methods (as opposed to ID3D11DeviceContext methods) can be called from this thread. 모든 디바이스 컨텍스트 메서드는 FinalizeLoadLevel 메서드에서 호출합니다.Any device context methods are called in the FinalizeLoadLevel method.
  • FinalizeLoadLevel: 주 스레드에서 수행해야 하는 수준 로드를 위한 모든 작업을 완료합니다.FinalizeLoadLevel: Completes any work for level loading that needs to be done on the main thread. 여기에는 Direct3D 11 디바이스 컨텍스트(ID3D11DeviceContext) 메서드 호출이 포함됩니다.This includes any calls to Direct3D 11 device context (ID3D11DeviceContext) methods.
  • StartLevel: 새 레벨에 대한 게임 플레이를 시작합니다.StartLevel: Starts the game play for a new level.
  • PauseGame: 게임을 일시 중지합니다.PauseGame: Pauses the game.
  • RunGame: 게임 루프의 반복을 실행합니다.RunGame: Runs an iteration of the game loop. 이 메서드는 게임 상태가 Active인 경우 게임 루프가 반복될 때마다 한 번 App::Update에서 호출됩니다.It's called from App::Update one time every iteration of the game loop if the game state is Active.
  • OnSuspending 하 고 OnResuming: 각각 게임의 오디오를 일시 중단하고 다시 시작합니다.OnSuspending and OnResuming: Suspends and resumes the game's audio, respectively.

프라이빗 메서드:And the private methods:

  • LoadSavedState 하 고 SaveState: 각각 게임의 현재 상태를 로드하고 저장합니다.LoadSavedState and SaveState: Loads and saves the current state of the game, respectively.
  • SaveHighScore 하 고 LoadHighScore: 각각 게임에서 최고 점수를 저장하고 로드합니다.SaveHighScore and LoadHighScore: Saves and loads the high score across games, respectively.
  • InitializeAmmo: 탄약으로 사용되는 각 구형 개체의 상태를 각 라운드 시작의 원래 상태로 재설정합니다.InitializeAmmo: Resets the state of each sphere object used as ammunition back to its original state for the beginning of each round.
  • UpdateDynamics: 만든 애니메이션 루틴, 물리학 및 컨트롤 입력을 기준으로 모든 게임 개체를 업데이트하기 때문에 이것은 중요한 메서드입니다.UpdateDynamics: This is an important method, because it updates all the game objects based on canned animation routines, physics, and control input. 게임을 정의하는 대화형 작업의 핵심입니다.This is the heart of the interactivity that defines the game. 설명 합니다 게임 세계를 업데이트 섹션입니다.This is covered in the Update the game world section.

다른 public 메서드는 게임 플레이 및 오버레이 관련 정보를 앱 프레임워크에 반환하여 표시하는 속성 getter입니다.The other public methods are property getters that return game play and overlay specific information to the app framework for display.

dataData

코드 예제의 맨 위에는 게임 루프가 실행될 때 인스턴스가 업데이트되는 4개 개체가 있습니다.At the top of the code example, there are four objects whose instances are updated as the game loop runs.

  • MoveLookController 개체: 플레이어 입력을 나타냅니다.MoveLookController object: Represents the player input. 자세한 내용은 컨트롤 추가를 참조하세요.For more information, see Adding controls.
  • GameRenderer 개체: 파생 된 Direct3D 11 렌더러 나타냅니다 합니다 DirectXBase 모든 장치별 개체 및 해당 렌더링을 처리 하는 클래스입니다.GameRenderer object: Represents the Direct3D 11 renderer derived from the DirectXBase class that handles all the device-specific objects and their rendering. 자세한 내용은 렌더링 프레임 워크 있습니까합니다.For more information, see Rendering framework I.
  • 오디오 개체: 게임에 대 한 오디오 재생을 제어합니다.Audio object: Controls the audio playback for the game. 자세한 내용은 소리를 추가합니다.For more information, see Adding sound.

나머지 게임 변수에는 원형 목록과 해당 원형의 게임 내 양, 게임 플레이 관련 데이터, 제약 조건 등이 포함됩니다.The rest of the game variables contain the lists of the primitives and their respective in-game amounts, and game play specific data and constraints.

다음 단계Next steps

이제 알아보겠습니다 실제 렌더링 엔진에 대 한: 하는 방법에 대 한 호출를 렌더링 메서드는 업데이트 된 기본 형식에서 가져올 화면의 픽셀 전환 합니다.By now, you're probably curious about the actual rendering engine: how calls to the Render methods on the updated primitives get turned into pixels on your screen. 두 부분으로 다룹니다 — 렌더링 프레임 워크 i: 렌더링에 대 한 소개렌더링 프레임 워크 II: 게임 렌더링합니다.This is covered in two parts — Rendering framework I: Intro to rendering and Rendering framework II: Game rendering. 플레이어 컨트롤에서 게임 상태를 업데이트하는 방법이 자세히 알고 싶으면 컨트롤 추가를 확인하세요.If you're more interested in how the player controls update the game state, then check out Adding controls.