도면 및 충돌 감지를 위해 Texture2D를 동적으로 변경하거나 파괴하십시오.
문제
2D 프로젝트에 XNA를 사용하고 있습니다. 나는 문제가 있고 그것을 해결할 방법을 모른다. 예를 들어 화면에 그려진 텍스처 (이미지)가 있습니다.
|+++|+++|
|---|---|
|+++|+++|
이제 나는 그 구조/이미지의 일부를 파괴하여 다음과 같이 보일 수 있기를 원합니다.
|+++|
|---|---|
|+++|+++|
이제 충돌은 이제 새로운 이미지에도 효과적입니다.
이 문제를 해결하는 방법이 더 나을 수 있습니다.
- 전체 질감을 다른 질감으로 교체하십시오. 그것은 파괴 된 곳에서 투명합니다.
- Spritebatch.draw (Sourcerectangle, DestinationRectangle)와 함께 약간의 속임수를 사용하여 원하는 사각형을 그려주고 충돌을 확인하십시오.
- 텍스처를 자체 도면/충돌 감지에 책임이있는 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이 작동합니다.
보다 강력한 시스템 (상자로 제한되지 않으려면)은 픽셀 당 충돌 감지를 사용합니다. 프로세스는 기본적으로 다음과 같이 작동합니다.
- 각 객체에 대한 경계 상자 (또는 원) 계산
- 두 객체가 겹치는지 확인하십시오
- 각각의 오버랩에 대해, 스프라이트를 숨겨진 표면에 블 링하여 갈 때 픽셀 값을 비교하십시오. 두 번째 스프라이트에서 픽셀을 그릴 때 픽셀이 이미 설정된 경우 충돌이 발생합니다.
다음은 좋은 XNA 예제입니다 (실제로 다른 Ziggyware 기사) : 픽셀 충돌 감지 당 2d
더 많은 링크 :