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

2012-02-09

이 항목은 이 XNA Framework 응용프로그램에서 사용자가 화면에서 움직이는 사각형 그래픽 개체를 탭할 때 이를 검색하는 방법을 보여 줍니다. 이전 항목에서는 기본 게임 인프라를 만들었습니다. 여기서는 사용자가 화면을 탭하고 탭이 사각형 그래픽 개체를 적중하거나 충돌할 때 이를 검색하는 기능을 추가하여 해당 논리를 확장합니다. 이 기능을 구현한 후 적중 횟수를 현재 점수로 기록할 수 있습니다. 이 시리즈의 이후 항목에서는 현재 점수와 현재 레벨을 표시하기 위해 이 논리를 확장하여 레벨과 스코어보드를 추가합니다. 이 시리즈의 끝에서는 응용프로그램에 시험판 환경을 구현하는 기능을 추가합니다.

이 단계를 계속하기 전에 다음 항목을 완료해야 합니다.

참고참고:

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

이전 항목인 방법: XNA Framework 응용프로그램 만들기에서 설명한 게임은 그래픽 개체가 일정한 속도로 화면에서 튀어오르게 합니다. 게임의 재미를 위해 그래픽 개체가 화면에서 튀어오를 때 플레이어가 해당 개체를 탭하는 횟수를 추적하는 기능을 추가합니다.

플레이어가 그래픽 개체를 탭할 때 이를 검색하려면

  1. Game1 생성자에서 다음 코드 줄을 추가합니다. 그러면 탭 제스처를 이 응용프로그램에 유효한 제스처로 사용할 수 있습니다. 탭 제스처는 사용자가 화면에서 단일 지점을 가볍게 터치할 때 발생합니다.

    
       TouchPanel.EnabledGestures = GestureType.Tap;
    
    
  2. Game1 클래스의 Update 메서드에서 UpdateSprite 호출 앞에 다음 코드를 추가합니다. 언제든지 터치 패널에서 여러 제스처를 등록할 수 있으므로 while 루프에서 TouchPanel.IsGestureAvailable을 호출합니다. 각 제스처를 읽고, 제스처가 GestureType.Tap이면 CheckForTouchCollision을 호출하고 탭이 기록된 화면 위치를 전달합니다. CheckForTouchCollision은 이 절차의 다른 단계에서 구현됩니다.

    
                   while (TouchPanel.IsGestureAvailable)
                    {
                        GestureSample gs = TouchPanel.ReadGesture();
                        if (gs.GestureType == GestureType.Tap)
                        {
                            CheckForTouchCollision(gs.Position);
                        }
                    }
    
    
    
  3. Game1.cs에서 다음 코드를 추가합니다. 이 코드는 각각 그래픽 개체와 제스처에 사용되는 두 개의 경계 상자, 즉 사각형을 정의합니다. BoundingBoxIntersects 메서드를 사용하여 두 상자가 겹치는지 여부를 확인합니다. 해당 메서드에서 true를 반환하면 충돌이 검색되었으며 제스처가 그래픽 개체를 적중한 것입니다. 이 경우 충돌 횟수가 증가합니다. 최종적으로, 목표 충돌 횟수에 도달했는지 여부를 확인합니다. 도달한 경우 게임이 다음 레벨로 이동합니다. 이 GoToNextLevel 메서드는 이 시리즈의 다음 항목에서 구현합니다.

    
            // Number of collisions recorded in this round
            int collisionCount = 0;
    
            // The target number of collisions to detect to complete a level
            const int COLLISION_TARGET = 5;
    
            // A tolerance for the position of the tap gesture, to more accurately detect if 
            // the tap overlapped with the graphic object
            const float TAP_TOLERANCE = 20.0f;
    
            void CheckForTouchCollision(Vector2 position)
            {
                BoundingBox bb1 = new BoundingBox(new Vector3(spritePosition.X - (sprite1Width / 2), spritePosition.Y - (sprite1Height / 2), 0), 
                                                  new Vector3(spritePosition.X + (sprite1Width / 2), spritePosition.Y + (sprite1Height / 2), 0));
                BoundingBox bbG = new BoundingBox(new Vector3(position.X - TAP_TOLERANCE, position.Y - TAP_TOLERANCE, 0), 
                                                  new Vector3(position.X - TAP_TOLERANCE, position.Y + TAP_TOLERANCE, 0));
                           
                if (bb1.Intersects(bbG))
                {
                    // Update collision count and scoreboard
                    collisionCount++;
    
                    // Has the level been completed?
                    if (collisionCount == COLLISION_TARGET)
                    {
                        // Level Complete
                           GoToNextLevel();
    
                    }
                }
    
            }
    
    
    

이 시리즈의 다음 항목에서는 응용프로그램에 레벨을 추가하는 방법을 보여 줍니다. 이 시점에서는 화면에서 움직이는 사각형으로 구성된 단순한 게임이며 사용자가 사각형을 탭할 때 이를 검색하고 점수로 기록할 수 있습니다. 시험판 환경을 보여 주려면 게임의 여러 레벨을 구현하는 것이 좋습니다. 이후 항목에서 설명하는 시험판 환경에서는 게임의 라이선스(체험 또는 정식)에 따라 사용자가 플레이할 수 있는 레벨 수를 제한할 수 있습니다. 레벨 구현은 화면에서 움직이는 사각형에 대한 각 레벨의 속도를 정의합니다. 레벨이 증가할 때마다 화면에서 튀어오르는 사각형이 더 빨리 이동합니다.

방법: XNA Framework 응용프로그램에 레벨 추가

표시: