방법: XNA Framework 응용프로그램 만들기

2012-02-09

이 항목에서는 이 시리즈 전체에서 사용되는 XNA Framework 응용프로그램의 기본 기능을 만드는 방법을 보여 줍니다. 이 응용프로그램은 단순한 게임입니다. 이 항목을 완료했으면 화면에서 삼각형 그래픽 개체를 이동하는 응용프로그램이 빌드되었습니다. 이 시리즈의 이후 항목에서는 충돌 검색을 추가하고, 게임에 레벨을 추가하고, 현재 점수와 현재 레벨을 표시할 스코어보드를 추가하여 이 기본 인프라를 확장합니다. 이 전체 게임이 구현되면 시험판 환경을 추가합니다.

참고참고:

다음 절차의 단계는 Windows Phone용 Visual Studio 2010 Express에 적용됩니다. Visual Studio 2010 Professional 또는 Visual Studio 2010 Ultimate용 추가 기능을 사용하는 경우에는 메뉴 명령이나 창 레이아웃에서 일부 소규모 변형이 나타날 수 있습니다.  

Windows Phone SDK 를 다운로드하여 설치했는지 확인합니다. 자세한 내용은 Windows Phone SDK 설치를 참조하십시오.

Windows Phone 용 XNA Framework 응용프로그램을 만드는 첫 번째 단계는 새 프로젝트를 만드는 것입니다.

새 프로젝트를 만들려면

  1. Windows 시작 메뉴에서 Windows Phone용 Visual Studio 2010 Express 를 시작합니다. 등록 창이 나타나면 등록하거나 일시적으로 취소할 수 있습니다.

  2. 파일 | 새 프로젝트 메뉴 명령을 선택하여 새 프로젝트를 만듭니다.

  3. 새 프로젝트 창이 표시됩니다. Visual C# 템플릿을 확장하고 XNA Game Studio 4.0 템플릿을 선택합니다.

  4. Windows Phone 게임(4.0) 템플릿을 선택합니다. 프로젝트 이름을 원하는 대로 입력합니다. 위치솔루션 이름을 지정하거나 기본값을 그대로 둘 수도 있습니다.

    GetStartedNewProjectXNA
  5. 확인을 클릭합니다. Windows Phone 플랫폼 선택 창이 나타납니다. 대상 Windows Phone 버전으로 Windows Phone 7.1을 선택합니다.

    GetStartedSelectPlatformXNA
  6. 확인을 클릭합니다. 새 프로젝트가 생성되고 Game1.cs 소스 파일이 Visual Studio 에서 열립니다.

다음 단계는 프로젝트에 콘텐츠(이 경우 그래픽 개체)를 추가하는 것입니다.

프로젝트에 콘텐츠를 추가하려면

  1. 솔루션 탐색기가 Visual Studio 에서 표시되는지 확인합니다. 표시되지 않으면 보기 | 다른 창 | 솔루션 탐색기를 선택하여 표시합니다.

  2. 이 예제에서는 기본적으로 이 프로젝트의 WindowsPhoneGame1\WindowsPhoneGame1\WindowsPhoneGame1 디렉터리에 생성된 PhoneGameThumb.png 파일을 사용합니다. PhoneGameThumb.png 또는 고유한 그래픽 파일을 사용할 수 있지만 최상의 결과를 얻으려면 그래픽 개체 크기가 약 64 x 64 픽셀이어야 합니다.

    솔루션 탐색기에서 콘텐츠 노드(이 경우 WindowsPhoneGame1Content(콘텐츠))를 마우스 오른쪽 버튼으로 클릭하고 추가 | 기존 항목을 선택합니다. 그래픽 파일(이 경우 WindowsPhoneGame1\WindowsPhoneGame1\WindowsPhoneGame1\ PhoneGameThumb.png)을 찾아보고 추가를 클릭합니다. 그래픽 개체가 프로젝트에 추가됩니다.

    솔루션 탐색기에서 그래픽 이름을 선택하고 속성 창에서 파일 속성을 확인합니다. 그래픽 개체의 자산 이름을 확인합니다(이 경우 PhoneGameThumb).

    GetStartedPropertiesXNA

이 단계에서는 화면에서 그래픽 개체를 이동할 코드를 추가합니다. 다음 코드는 다음 작업을 수행합니다.

  • 일부 변수 추가

  • LoadContent 메서드에서 그래픽 개체 로드

  • Draw 루프에서 화면에 그래픽 개체 그리기

  • Update 루프에서 그래픽 개체의 위치 업데이트

기본 게임 논리를 추가하려면

  1. Game1.cs에서 Game1 클래스의 코드를 다음 코드로 바꿉니다. 이 코드는 화면에서 스프라이트 개체를 이동하는 기본 게임 논리입니다.

    
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;
    
            Texture2D texture;
            Vector2 spritePosition;
            Vector2 spriteSpeed;
            int sprite1Height;
            int sprite1Width;
    
            public Game1()
            {
                graphics = new GraphicsDeviceManager(this);
                graphics.PreferredBackBufferWidth = 800;
                graphics.PreferredBackBufferHeight = 480;
                graphics.IsFullScreen = true;
                graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight;
    
                Content.RootDirectory = "Content";
    
                // Frame rate is 30 fps by default for Windows Phone.
                TargetElapsedTime = TimeSpan.FromMilliseconds(33.3333);
    
            }
    
            /// <summary>
            /// Allows the game to perform any initialization it needs to before starting to run.
            /// This is where it can query for any required services and load any non-graphic
            /// related content.  Calling base.Initialize will enumerate through any components
            /// and initialize them as well.
            /// </summary>
            protected override void Initialize()
            {
                spriteSpeed = new Vector2(50.0f, 50.0f);
                base.Initialize();
            }
    
            /// <summary>
            /// LoadContent will be called once per game and is the place to load
            /// all of your content.
            /// </summary>
            protected override void LoadContent()
            {
                // Create a new SpriteBatch, which can be used to draw textures.
                spriteBatch = new SpriteBatch(GraphicsDevice);
    
                texture = Content.Load<Texture2D>("PhoneGameThumb");
    
                spritePosition.X = 0;
                spritePosition.Y = 0;
    
                sprite1Height = texture.Bounds.Height;
                sprite1Width = texture.Bounds.Width;
    
            }
    
            /// <summary>
            /// UnloadContent will be called once per game and is the place to unload
            /// all content.
            /// </summary>
            protected override void UnloadContent()
            {
                // TODO: Unload any non ContentManager content here
            }
    
            /// <summary>
            /// Allows the game to run logic such as updating the world,
            /// checking for collisions, gathering input, and playing audio.
            /// </summary>
            /// <param name="gameTime">Provides a snapshot of timing values.</param>
            protected override void Update(GameTime gameTime)
            {
                // Allow the game to exit.
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==
                    ButtonState.Pressed)
                    this.Exit();
    
                // Move the sprite around.
                UpdateSprite(gameTime, ref spritePosition, ref spriteSpeed);
                base.Update(gameTime);
                
            }
    
            void UpdateSprite(GameTime gameTime, ref Vector2 spritePosition, ref Vector2 spriteSpeed)
            {
                // Move the sprite by speed, scaled by elapsed time.
                spritePosition +=
                    spriteSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
    
                int MaxX =
                    graphics.GraphicsDevice.Viewport.Width - texture.Width;
                int MinX = 0;
                int MaxY =
                    graphics.GraphicsDevice.Viewport.Height - texture.Height;
                int MinY = 0;
    
                // Check for bounce.
                if (spritePosition.X > MaxX)
                {
                    spriteSpeed.X *= -1;
                    spritePosition.X = MaxX;
                }
    
                else if (spritePosition.X < MinX)
                {
                    spriteSpeed.X *= -1;
                    spritePosition.X = MinX;
                }
    
                if (spritePosition.Y > MaxY)
                {
                    spriteSpeed.Y *= -1;
                    spritePosition.Y = MaxY;
                }
    
                else if (spritePosition.Y < MinY)
                {
                    spriteSpeed.Y *= -1;
                    spritePosition.Y = MinY;
                }
    
            }
    
            /// <summary>
            /// This is called when the game should draw itself.
            /// </summary>
            /// <param name="gameTime">Provides a snapshot of timing values.</param>
            protected override void Draw(GameTime gameTime)
            {
                graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    
                // Draw the sprite.
                spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
                
                spriteBatch.Draw(texture, spritePosition, Color.White);
                spriteBatch.End();  
              
                // Call the Draw method on the scoreBoard object to update the scoreboard.
                base.Draw(gameTime);
    
            }
    
        }
    
    
  2. 빌드 | 솔루션 빌드 메뉴 명령을 선택하여 솔루션을 빌드합니다. 프로젝트가 오류 없이 빌드되어야 합니다. 오류 목록 창이 열려 있지 않은 경우 보기 | 오류 목록 메뉴 명령을 선택하여 창을 열 수 있습니다. 오류가 있는 경우 위 단계를 검토하고 오류를 수정한 다음 솔루션을 다시 빌드합니다.

  3. 표준 도구 모음에서 응용프로그램의 배포 대상을 Windows Phone 에뮬레이터로 설정합니다.

    에뮬레이터를 선택하는 표준 도구 모음의 대상

  4. 디버그 | 디버깅 시작 메뉴 명령을 선택하여 응용프로그램을 실행합니다. 에뮬레이터 창이 열리고 응용프로그램이 시작됩니다. 그래픽이 화면에서 튀어오르는 것을 볼 수 있습니다.

  5. 에뮬레이터가 시간 초과되어 잠금 화면으로 전환되면 화면 맨 아래를 클릭하고 위로 밀어 잠금을 해제할 수 있습니다.

  6. 원하는 코드 줄에 커서를 놓고 디버그 | 중단점 설정/해제 메뉴 명령을 선택하여 코드에 디버그 중단점을 설정할 수 있습니다.

  7. 디버깅을 중지하려면 디버그 | 디버깅 중지 메뉴 명령을 선택합니다.

이제 XNA Framework 응용프로그램의 기본 기능이 정의되었습니다. 게임은 화면에서 튀어오르는 사각형 그래픽 개체로 구성됩니다. 이 시리즈의 이후 항목에서는 게임의 기능이 향상됩니다. 게임 플레이는 화면에서 움직이는 사각형을 탭하려고 하는 사용자로 구성되며 각 적중 또는 충돌을 사용자 점수로 기록합니다. 화면에서 그래픽을 탭하는 사용자 검색은 다음 단원에서 설명합니다. 개체를 탭하는 사용자를 검색할 뿐 아니라 사용자의 현재 점수를 표시할 스코어보드와 게임의 여러 레벨을 플레이하기 위한 메커니즘도 만듭니다. 이 인프라가 구현된 후 게임의 현재 라이선스를 검색하고 게임이 체험 모드인 경우 사용자가 레벨 1만 플레이할 수 있게 하는 체험 모드를 구현합니다.

이 시리즈의 다음 항목에서는 응용프로그램에 충돌 검색을 추가하는 방법을 보여 줍니다. 충돌 검색은 이 응용프로그램에 대한 게임 플레이의 기초가 됩니다. 사용자가 화면에서 움직이는 개체를 탭할 때마다 적중 또는 충돌 횟수가 증가하며 게임 정수로 기록됩니다.

방법: XNA Framework 응용프로그램에 충돌 검색 추가

표시: