웜과 같은 2D 파괴 가능한 환경 구현


76

웜과 같이 파괴 가능한 2D 환경을 구성하는 데 어떤 단계가 필요합니까? 이상적으로이 프로세스를 가능한 효율적으로 수행 할 수있는 방법은 무엇입니까?


7
훌륭한 질문입니다. 웜에는 두 가지 문제가 있습니다 : 파괴 가능성과 이상한 각도에서의 움직임.
ashes999

나는 이것이 여러 번 여기에서 요청되었다고 생각한다
Vishnu

2
Vish, 관련 링크는 그것을 제안하지 않는 것 같습니다.
공산주의 오리

3
Hedgewars 에서 수행 된 방식을 확인할 수 있습니다 . 오픈 소스 웜 클론입니다.
GvS

답변으로는 충분하지 않지만 Clonk 도 확인하십시오 . 독일 개발자의 오래된 2D 게임으로 특정 픽셀까지 파괴 가능한 풍경을 가지고 있습니다. 더 이상 개발되지는 않지만 위의 링크에서 소스 코드를 사용할 수 있습니다. 오픈 소스의 후속 제품인 OpenClonk도 있지만 비디오에서 픽셀을 완벽하게 파괴하지 못하고 파괴 될 수있는 블록이있는 테라 리아와 같은 방향으로 돌았습니다.
Christian

답변:


47

웜의 랜드 스케이프가 정확히 어떻게 구현되었는지는 모르겠지만 랜드 마크에 비트 맵을 사용했다고 확신합니다 (적어도 시리즈의 오래된 게임에서는).

매우 기본적인 방법은 검은 색 픽셀이 공기 를 나타내고 흰색 픽셀이 지면을 나타내는 비트 맵 이미지 (B / W) 입니다. 픽셀 작업을 사용하여 가로 방향을 쉽게 제거 할 수 있습니다. 로켓이 땅에 닿으면 radius = blastRadius충격 지점에 검은 색 원을 칠합니다 .

그런 다음 해당 비트 맵을 사용하여 월드를 렌더링하거나 그 일부만 렌더링 할 수 있습니다. 더 나은 성능을 위해 "세계"의 일부만 업데이트 / 렌더링 할 수있는 방식으로 구현하는 것이 좋습니다. 예 : 풍경의 일부가 로켓에 의해 파괴되면 전 세계가 아닌 영향을받는 지역을 다시 렌더링하십시오.

"충돌 맵"으로 흑백 이미지 대신 24 비트 이미지를 사용하여 두 채널을 사용하여 픽셀 당 표면 법선 (x, y)을 저장하고 하나의 채널을 사용하여 실제 "충돌- 지도". 표면 법선이 있으면 수류탄을 계산하거나 캐릭터가 주어진 방향으로 움직일 수 있는지 여부를 결정하는 데 크게 도움이됩니다.


3
추가 정보를 저장하는 것은 충돌 맵입니다.
deft_code

6

내 머리 꼭대기에서 한 가지 가능성 :

파괴 가능한 "토지"의 외곽선을 저장하기 위해 벡터 그래픽 경로 표현을 사용하십시오. 파괴 사건이 발생하면 (예 : 수류탄이 사라짐) 원으로 표시된 폭발 지역은 부울 빼기 연산을 통해 육상 경로에서 제거됩니다. 결과 경로는지면 충돌 감지를위한 새로운 "랜드"및 랜드 그리기를위한 마스크를 나타냅니다.


2
Hedgewars가 그렇게하는 방식이라고 생각합니다. @Bill, 오픈 소스이므로 살펴볼 수 있습니다.
Gastón

2
@ Gastón Hedgewars의지도는 모두 이미지 (PNG)입니다. 나는 그들이 벡터 그래픽으로 변환되고 있는지 의심합니다. 또한 벡터 그래픽 (스플라인, 베 지어 등)을 사용하면 충돌 감지 또는 모양 빼기 등의 작업에 CPU가 훨씬 더 많이 사용됩니다. 그래도 소스를 보는 것이 좋습니다 (코딩 스타일이 다소 나쁘지만) :
bummzack

4
이와 같은 계산 기하학은 매우 복잡하고 매우 빠를 수 있습니다!
Adam Harte

인터넷 검색 "box2d 파괴 가능한 지형"은 이제 몇 가지 실행 가능한 벡터 데모를 제공합니다.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

6

건설적인 솔리드 지오메트리 사용

나는 파괴적인 지형을 다루기 위해 건설적인 솔리드 지오메트리 를 사용한 개념 증명을 썼습니다 . 부울 연산을 수행하기 위해 GLU Tessellator를 사용했습니다. 이 문서 에서는 "CSG 권선 규칙 사용" 검색 방법을 설명합니다 .

테셀 레이터의 삼각형 출력을 Box2D에 정적 다각형으로 공급했습니다. PoC는 꽤 잘 작동했습니다. 임의로 지형을 임의로 빼고 추가 할 수 있었고 지형은 Box2D에서 계속 적절하게 작동했습니다. 유일한 문제는 GLU 테셀 레이터가 Box2D가 싫어하는 축퇴 삼각형을 생성 할 수 있다는 것입니다. 그래서 수동으로 필터링해야했습니다.

PoC의 다음 단계 (내가 결코 본 적이없는)는 부스트 그래프 라이브러리 의 SCC 알고리즘 을 사용 하여 지형 조각이 끊어졌을 때를 감지하는 것입니다 (산 꼭대기를 잘라 내십시오). 절단 된 지형은 여전히 ​​파괴 가능하지만 삼각형이 모양으로 부착 된 동적 (비 정적) Box2D 바디로 표시됩니다. 부스트 문서를 파기 시작하면 디자인이 제대로 작동했지만 관심을 잃었습니다. 나는 언젠가 불태운 지구 / 웜 게임을 할 때 그 아이디어를 다시 생각할 계획 이다.


5

위의 모든 답변은 웜과 같이 가장 간단한 사례를 구현하는 것에 대해 설명합니다. 즉, 충격 영역이 파괴되고 다른 모든 부분은 그대로 유지됩니다. 당신은 당신의 풍경이 결국 둘로 나뉘어 질 수 있다고 생각 했습니까? 산이 있는데, 플레이어는 로켓 발사기로 바닥을 자릅니다. 이제 산이 넘어져서는 안됩니까? 또한 풍경이 약간 탄력있는 것이 당연합니다. Worms 시대에 (적어도 내가 기억할 때, 몇 년 동안 웜을 연주하지는 않았습니다) 컴퓨터는 제대로 할만큼 강하지 않았습니다. 그러나 그들은 지금 있습니다.

물론, 그것은 전적으로 프로젝트의 야망에 달려 있습니다. 그러나 정말 멋지게 만들고 싶다면 Box2D 를 물리 엔진으로 사용해보십시오 . 당신이 할 수있는 일이 많이 있습니다.


3
웜에서는 횃불을 사용하여 풍경을 통해 구멍을 파낼 수 있습니다. 그 터널이 당신의 불쌍한 횃불을 휘두르는 벌레에 쓰러진다면 그렇게 웃기지 않을 것입니다. 공중에 "떠 다니는"풍경 조각을 가질 수도있었습니다. 당신의 제안은 웜 게임이 아닌 재미있는 아이디어처럼 들립니다.
bummzack

그것은 요점이었습니다. 나는 그 게임 플레이의 변형에 대해 생각하고있었습니다. 또한 풍경의 일부 부분은 공중에서 파괴 할 수 없거나 영구적으로 정지되어 "부동"블록을 만들 수 있습니다. 또한 어떤 사람들은 월드 오브 구 (World of Goo)에서했던 공의 공처럼 위쪽이나 옆으로 잡아 당기면서 일정한 힘을 가할 수 있습니다.
Septagram

내가 실제로 이런 게임을 만드는 것을 고려하고 있었기 때문에 그것은 우스운 일이다. 그것은 Worms 정비공에게 재미있는 비틀기 일 것이다. 비트 맵 강체의 아이디어는 그 자체로 흥미로운 주제가 될 것입니다. 복잡성은 제 머리 위에 약간 있습니다.
William Casarin

글쎄,이 경우 비트 맵 강체는 쓸모가 없습니다. 대신, 나는 탄력적으로 연결된 정점의 삼각 그리드로 풍경을 만들 것입니다. 당신은 끈적 거리는 세계를 연주 했습니까? 그렇지 않은 경우 vgchartz.com/games/pics/6644424aaa.jpg doublegames.de/images/screenshots/world-of-goo_1_big.jpg 스크린 샷을 참조하십시오 . 아니, 아니, 아니, 아니, 당신이 그것을하지 않았다면, 당신은 절대적으로해야합니다 :) 이제 구석 대신에 모든 삼각형이 가로 텍스처의 일부를 표시하고 훨씬 작습니다. 상수로 주변을 둘러 보면 풍경이 꽤 딱딱하거나 젤리처럼 부드럽습니다.
Septagram

2
실제 엔진을 살펴보십시오 . 전체 엔진은 모든 것이 변형 / 파괴 가능한 격자라는 개념을 기반으로합니다 (구 타워와 같은).
deft_code

3

bummzack이 말했듯이 비트 맵. 1 비트 투명도를 사용할 수 있지만 지원이없는 경우 게임에서 사용하지 않는 끔찍한 핑크 색상을 사용하십시오.

픽셀 색상 만 확인하면 영향 지점을 계산할 수 있습니다. 영향이 발생하면 비트 맵의 ​​색상을 변경하거나 삭제하십시오.

폭발 반경의 경우 첫 번째 중지 지점은 Bresenham의 원 알고리즘 이며 매우 빠르고 효율적입니다. 정사각형과 같은 것으로 먼저 거칠게 삭제하고 원을 둥글게하여 가장자리를 얻습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.