도면 및 충돌 감지를 위해 Texture2D를 동적으로 변경하거나 파괴하십시오.

StackOverflow https://stackoverflow.com/questions/795673

  •  18-09-2019
  •  | 
  •  

문제

2D 프로젝트에 XNA를 사용하고 있습니다. 나는 문제가 있고 그것을 해결할 방법을 모른다. 예를 들어 화면에 그려진 텍스처 (이미지)가 있습니다.

|+++|+++|
|---|---|
|+++|+++|

이제 나는 그 구조/이미지의 일부를 파괴하여 다음과 같이 보일 수 있기를 원합니다.

|+++|
|---|---|
|+++|+++|

이제 충돌은 이제 새로운 이미지에도 효과적입니다.

이 문제를 해결하는 방법이 더 나을 수 있습니다.

  1. 전체 질감을 다른 질감으로 교체하십시오. 그것은 파괴 된 곳에서 투명합니다.
  2. Spritebatch.draw (Sourcerectangle, DestinationRectangle)와 함께 약간의 속임수를 사용하여 원하는 사각형을 그려주고 충돌을 확인하십시오.
  3. 텍스처를 자체 도면/충돌 감지에 책임이있는 4 개의 작은 텍스처로 텍스처를 분할하십시오.
  4. 내가 모르는 다른 똑똑한 방법을 사용하십시오.

모든 도움이 감사하겠습니다. 더 많은 설명/예가 필요한지 알려주세요.

편집 : 명확히하기 위해 이에 대한 사용의 예를 제공하겠습니다. 총에 맞을 때 4x4 조각의 벽이 파괴된다고 상상해보십시오.

도움이 되었습니까?

해결책 4

결국 옵션 3을 선택하게되었습니다. 기본적으로 질감과 차원이 포함 된 타일 클래스가 있습니다. 치수 n은 그 타일 안에 n*n 서브 타일이 있음을 의미합니다. 또한 타일이 파괴되었는지 여부를 추적하는 배열도 있습니다. 내 수업은 의사 코드에서 다음과 같습니다.

 class Tile
     texture
     dimention
     int [,] subtiles; //0 or 1 for each subtile

     public Tile() // constructor
         subtiles = new int[dimention, dimention];
         intialize_subtiles_to(1);

     public Draw() // this is how we know which one to draw
        //iterate over subtiles
        for(int i..
          for(int j ...)
             if(subtiles[i,j] == 1)
                Vector2 draw_pos = Vector2(i*tilewidth,
                                      j*tileheight)                       
                spritebatch.Draw(texture, draw_pos)

비슷한 방식으로 충돌을 확인하는 충돌 방법이 있습니다.

   public bool collides(Rectangle rect)
       //iterate over subtiles 
       for i...
          for j..
              if(subtiles[i,j]==0) continue;

              subtile_rect = //figure out the rect for this subtile
              if(subtile_rect.intersects(rect))
                   return true;

       return false;

등등. 각각의 값을 0으로 설정하여 특정 하위 타일을 "파괴"하는 방법과 전체 타일이 파괴되었는지 확인하는 방법을 상상할 수 있습니다. 이 기술로 부여 된 서브 타일은 모두 동일한 질감을 가질 것입니다. 지금까지 나는 더 간단한 솔루션을 생각할 수 없습니다.

다른 팁

나는 그것을 가져갈 것이다 제삼 옵션:

3 - 텍스처를 각각 4 개의 작은 텍스처로 분할하여 자체 도면/충돌 감지를 담당합니다.

어렵지 않습니다. 기본적으로 Tileset Struct와 동일합니다. 그러나이 접근법에 맞게 코드를 변경해야합니다. 타일에 대해 조금 읽으십시오. http://www-cs-students.stanford.edu/~amitp/gameprog.html#tiles많은 사이트와 책은 타일과 타일을 사용하는 방법에 대해 이야기했습니다. 그러나이 논리를 작은 부분의 퇴비로 전체에 사용할 수 있습니다.

다른 옵션을 빠르게 주목하겠습니다.

1 - 전체 질감을 다른 질감으로 교체하십시오. 그것은 파괴 된 장소에서 투명합니다.

아니요 .. 다른 위치마다 다른 이미지가 나쁘다. DE 텍스처를 변경 해야하는 경우? 모든 이미지를 다시 리메이크 하시겠습니까?

2-Spritebatch.draw (Sourcerectangle, DestinationRectangle)와 함께 약간의 속임수를 사용하여 원하는 직사각형을 그려주고 충돌 확인을 수행하십시오.

불행히도 Spritebatch.Draw는 직사각형과 만 작동하기 때문에 작동하지 않습니다.

4 내가 모르는 다른 똑똑한 방법을 사용하십시오.

나는 이것에 대한 마법을 상상할 수 없다. 어쩌면 다른 이미지를 사용하여 마스크를 만들 수 있습니다. 그러나 그것은 매우 가공 광범위합니다.

Ziggyware 에서이 기사를 확인하십시오. 그것은 쯤입니다 변형 가능한 지형, 그리고 당신이 찾고있는 것일 수도 있습니다. 본질적 으로이 기술에는 투명하게 숨길 픽셀을 설정하는 것이 포함됩니다.

옵션 #3이 작동합니다.

보다 강력한 시스템 (상자로 제한되지 않으려면)은 픽셀 당 충돌 감지를 사용합니다. 프로세스는 기본적으로 다음과 같이 작동합니다.

  1. 각 객체에 대한 경계 상자 (또는 원) 계산
  2. 두 객체가 겹치는지 확인하십시오
  3. 각각의 오버랩에 대해, 스프라이트를 숨겨진 표면에 블 링하여 갈 때 픽셀 값을 비교하십시오. 두 번째 스프라이트에서 픽셀을 그릴 때 픽셀이 이미 설정된 경우 충돌이 발생합니다.

다음은 좋은 XNA 예제입니다 (실제로 다른 Ziggyware 기사) : 픽셀 충돌 감지 당 2d

더 많은 링크 :

누군가 픽셀 당 충돌 감지를 설명 할 수 있습니다

XNA 2-D 당 충돌

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top