2014-02-15 11 views
1

나는 XNA 플랫폼 게임을하고 있으며 충돌에 대한 도움이 필요합니다. 게임은 동굴에서 일어나고 문제는 예술 스타일이 개략적이어서 지형 (동굴)이 많이 다르기 때문에 타일을 사용할 수 없다는 것입니다. 그러나 캐릭터와 동굴의 완벽한 픽셀 충돌을 확인해야하지만 타일이 없기 때문에 모든 타일 주위에 직사각형을 배치 할 수 없을 때 그렇게하는 방법을 알아낼 수 없습니다. 나는 그것에 대해 생각타일없는 2D 게임에서 충돌 감지 XNA

은 많은 아이디어를 내놓았다 :

- 하나의 큰 전체 수준의 주위에 사각형 및 문자 사용 완벽한 픽셀 충돌 주위 하나. 그러나 직사각형에는 배경도 포함되므로 작동하지 않을 것이라고 생각합니다.

- 사각형을 수동으로 배치하십시오. 매우 추악한 코드이며 많은 버그와 오류를 유발할 수 있습니다.

- 어쨌든 타일을 사용하고 수백 가지 타일 유형이 있습니다. 다시 말하지만, 매우 추한 코드이며 잘못된 것입니다.

- 충돌 엔진을 사용하십시오. 나는 처음부터 게임을 만드는 것이 바람직하다.

내가 잘못 설명했는데 미안하지만 (적어도 나를 위해) 다소 복잡한 문제이고 그물 주변의 해결책을 찾을 수 없습니다. 아이디어에 대해 매우 기뻐하실 것입니다, 감사합니다.

답변

5

나는 당신이하려고하는 것을하기 위해 픽셀 단위의 충돌 탐지를 사용해야한다고 생각한다. 당신은 당신의 캐릭터를 가질 수 있고 실제 캐릭터를 제외하고 그의 텍스처를 투명하게 만들 수 있습니다 (이미지의 alpha 사용). 그러면 동굴이 될 terrain 텍스처를 가질 수 있습니다. 캐릭터가 투명하게 움직일 수있는 동굴 부분을 만들어 레벨 전체의 배경이 될 다른 텍스처를 만들 수 있습니다. 여기에 거친 예제 :

문자 (핑크 BG는 투명 :

enter image description here

동굴 (흰색) 투명

enter image description here

배경 :

enter image description here

세 가지가 함께 추가 : (난 그냥 배경을 봤 및 페인트에 동굴을 끌었다 때문에) 당신에게 매우 거친 아이디어를주고 그냥

enter image description here

합니다. 그런 다음 동굴 텍스처 (동굴 배경이 아님)와 문자 텍스처간에 알파 픽셀 충돌 감지를 사용할 수 있습니다. 픽셀 당 충돌을 쉽게 사용할 수있는 방법에 대한 자습서는 this을 참조하십시오. HTH. 다음은 사용할 수있는 충돌 코드입니다 (rectangleA은 문자의 사각형이어야 함). 문자의 픽셀 데이터 rectangleB 동굴의 사각형 (전체 화면이 될 것임) dataB 동굴의 픽셀 데이터 (배경이 아님))) 배경 이미지의 픽셀 데이터를 사용하지 않으므로이 데이터로 충돌을 확인하지 않습니다.

/// <param name="rectangleA">Bounding rectangle of the first sprite</param> 
    /// <param name="dataA">Pixel data of the first sprite</param> 
    /// <param name="rectangleB">Bouding rectangle of the second sprite</param> 
    /// <param name="dataB">Pixel data of the second sprite</param> 
    /// <returns>True if non-transparent pixels overlap; false otherwise</returns> 
    static bool IntersectPixels(Rectangle rectangleA, Color[] dataA, 
           Rectangle rectangleB, Color[] dataB) 
    { 
     // Find the bounds of the rectangle intersection 
     int top = Math.Max(rectangleA.Top, rectangleB.Top); 
     int bottom = Math.Min(rectangleA.Bottom, rectangleB.Bottom); 
     int left = Math.Max(rectangleA.Left, rectangleB.Left); 
     int right = Math.Min(rectangleA.Right, rectangleB.Right); 

     // Check every point within the intersection bounds 
     for (int y = top; y < bottom; y++) 
     { 
      for (int x = left; x < right; x++) 
      { 
       // Get the color of both pixels at this point 
       Color colorA = dataA[(x - rectangleA.Left) + 
            (y - rectangleA.Top) * rectangleA.Width]; 
       Color colorB = dataB[(x - rectangleB.Left) + 
            (y - rectangleB.Top) * rectangleB.Width]; 

       // If both pixels are not completely transparent, 
       if (colorA.A != 0 && colorB.A != 0) 
       { 
        // then an intersection has been found 
        return true; 
       } 
      } 
     } 

     // No intersection found 
     return false; 
    } 
+0

@ user3313308이 도움이 되었습니까? – davidsbro

+0

답장을 보내 주셔서 감사합니다 @ davidsbro!픽셀 당 픽셀 충돌을 갖기 위해 직사각형을 배치해야합니다. 아니면 픽셀 당 충돌의 개념을 이해하지 못했습니까? 제대로 이해했다면 두 개의 사각형이 충돌하는지 확인한 다음 사각형 내부의 색상을 검사하여 충돌 여부를 확인합니다. 그게 맞습니까? 만약 그렇다면, 아직도 동굴 주위에 직사각형을 배치 할 필요가 없을까요? – user3313308

+0

예, 바로 @ user3313308입니다. 하지만 두 개의 직사각형 만 있으면됩니다. 하나는 전체 동굴 텍스처 (아마도 전체 화면이 될 것입니다) 주위에 있고 다른 하나는 플레이어 주위에 있습니다. 당신은 둘 이상을 필요로하지 않아야합니다. 필자가 제공 한 링크는 픽셀 단위의 매우 간단한 충돌 프로젝트이므로 어떤 모습인지 쉽게 알 수 있습니다. LMK가 불명확하면. – davidsbro