답변:
웜의 랜드 스케이프가 정확히 어떻게 구현되었는지는 모르겠지만 랜드 마크에 비트 맵을 사용했다고 확신합니다 (적어도 시리즈의 오래된 게임에서는).
매우 기본적인 방법은 검은 색 픽셀이 공기 를 나타내고 흰색 픽셀이 지면을 나타내는 비트 맵 이미지 (B / W) 입니다. 픽셀 작업을 사용하여 가로 방향을 쉽게 제거 할 수 있습니다. 로켓이 땅에 닿으면 radius = blastRadius
충격 지점에 검은 색 원을 칠합니다 .
그런 다음 해당 비트 맵을 사용하여 월드를 렌더링하거나 그 일부만 렌더링 할 수 있습니다. 더 나은 성능을 위해 "세계"의 일부만 업데이트 / 렌더링 할 수있는 방식으로 구현하는 것이 좋습니다. 예 : 풍경의 일부가 로켓에 의해 파괴되면 전 세계가 아닌 영향을받는 지역을 다시 렌더링하십시오.
"충돌 맵"으로 흑백 이미지 대신 24 비트 이미지를 사용하여 두 채널을 사용하여 픽셀 당 표면 법선 (x, y)을 저장하고 하나의 채널을 사용하여 실제 "충돌- 지도". 표면 법선이 있으면 수류탄을 계산하거나 캐릭터가 주어진 방향으로 움직일 수 있는지 여부를 결정하는 데 크게 도움이됩니다.
내 머리 꼭대기에서 한 가지 가능성 :
파괴 가능한 "토지"의 외곽선을 저장하기 위해 벡터 그래픽 경로 표현을 사용하십시오. 파괴 사건이 발생하면 (예 : 수류탄이 사라짐) 원으로 표시된 폭발 지역은 부울 빼기 연산을 통해 육상 경로에서 제거됩니다. 결과 경로는지면 충돌 감지를위한 새로운 "랜드"및 랜드 그리기를위한 마스크를 나타냅니다.
나는 파괴적인 지형을 다루기 위해 건설적인 솔리드 지오메트리 를 사용한 개념 증명을 썼습니다 . 부울 연산을 수행하기 위해 GLU Tessellator를 사용했습니다. 이 문서 에서는 "CSG 권선 규칙 사용" 검색 방법을 설명합니다 .
테셀 레이터의 삼각형 출력을 Box2D에 정적 다각형으로 공급했습니다. PoC는 꽤 잘 작동했습니다. 임의로 지형을 임의로 빼고 추가 할 수 있었고 지형은 Box2D에서 계속 적절하게 작동했습니다. 유일한 문제는 GLU 테셀 레이터가 Box2D가 싫어하는 축퇴 삼각형을 생성 할 수 있다는 것입니다. 그래서 수동으로 필터링해야했습니다.
PoC의 다음 단계 (내가 결코 본 적이없는)는 부스트 그래프 라이브러리 의 SCC 알고리즘 을 사용 하여 지형 조각이 끊어졌을 때를 감지하는 것입니다 (산 꼭대기를 잘라 내십시오). 절단 된 지형은 여전히 파괴 가능하지만 삼각형이 모양으로 부착 된 동적 (비 정적) Box2D 바디로 표시됩니다. 부스트 문서를 파기 시작하면 디자인이 제대로 작동했지만 관심을 잃었습니다. 나는 언젠가 불태운 지구 / 웜 게임을 할 때 그 아이디어를 다시 생각할 계획 이다.
위의 모든 답변은 웜과 같이 가장 간단한 사례를 구현하는 것에 대해 설명합니다. 즉, 충격 영역이 파괴되고 다른 모든 부분은 그대로 유지됩니다. 당신은 당신의 풍경이 결국 둘로 나뉘어 질 수 있다고 생각 했습니까? 산이 있는데, 플레이어는 로켓 발사기로 바닥을 자릅니다. 이제 산이 넘어져서는 안됩니까? 또한 풍경이 약간 탄력있는 것이 당연합니다. Worms 시대에 (적어도 내가 기억할 때, 몇 년 동안 웜을 연주하지는 않았습니다) 컴퓨터는 제대로 할만큼 강하지 않았습니다. 그러나 그들은 지금 있습니다.
물론, 그것은 전적으로 프로젝트의 야망에 달려 있습니다. 그러나 정말 멋지게 만들고 싶다면 Box2D 를 물리 엔진으로 사용해보십시오 . 당신이 할 수있는 일이 많이 있습니다.
bummzack이 말했듯이 비트 맵. 1 비트 투명도를 사용할 수 있지만 지원이없는 경우 게임에서 사용하지 않는 끔찍한 핑크 색상을 사용하십시오.
픽셀 색상 만 확인하면 영향 지점을 계산할 수 있습니다. 영향이 발생하면 비트 맵의 색상을 변경하거나 삭제하십시오.
폭발 반경의 경우 첫 번째 중지 지점은 Bresenham의 원 알고리즘 이며 매우 빠르고 효율적입니다. 정사각형과 같은 것으로 먼저 거칠게 삭제하고 원을 둥글게하여 가장자리를 얻습니다.