2D 플랫 포머에서 플레이어가 짓 눌린 것을 어떻게 감지합니까?


19

# 1과 같이 플랫 포머 캐릭터의 충돌을 확인하고 있습니다. 빨간색 점은 확인 된 픽셀이며 회색 선은 관련된 축을 나타냅니다. 나는이 방법으로 충돌을 확인 한 결과를 좋아합니다 (예 : 경계 상자). 크러시 감지라는 하나의 문제를 제외하고는 원하는대로 정확하게 작동합니다.

다음 이미지에서 연한 파란색 상자는지면을 나타내고 주황색 상자는 대상이며 화살표는 이동 방향을 나타냅니다.

플레이어가 부서진 시점을 감지하는 간단한 해결책은 반대쪽의 충돌 지점이 모두 트리거되는지 확인하는 것입니다. 만약 그렇다면 플레이어는 짓 눌린 것입니다. # 2에서 일반적인 크러시 시나리오를 볼 수 있습니다. 플레이어가 접지되고 상단 충돌 지점이 낙하물과 교차합니다. 이것은 호감을 유발합니다.

# 3, 4, 5는 문제가있는 시나리오를 제시합니다. # 3에서 플레이어는 물체를 향해 움직이고 있습니다. 오른쪽 충돌 지점이 물체에 부딪혀 충돌이 발생하여 플레이어가 정지합니다.

이제 객체가 계속 위로 올라가고 플레이어가 계속 오른쪽으로 움직이면 (# 4에 표시) 플레이어가 오른쪽 충돌 지점을 지우고 플레이어가 오른쪽으로 이동합니다. 그러나 이제는 객체가 상단 충돌 지점과 교차하여 원치 않는 수직 충돌이 발생합니다.

비슷한 시나리오가 # 5에 표시됩니다. 두 개의 물체가 바닥 충돌 지점을 제거하기에 충분히 떨어져있어 플레이어가 넘어 질 수 있지만 측면 충돌 지점이 깨끗해지지 않아 수평으로 충돌하지 않을 수 있습니다.

나는 솔루션에 내 두뇌를 쌓아 올렸지 만, 내가 생각해 낸 아무것도 특별히 잘 작동하지 않았으므로 누군가 가이 문제를 해결하는 방법에 대한 아이디어 나 통찰력이 있는지 궁금합니다.

여기에 이미지 설명을 입력하십시오

혼란을 없애기 위해 빨간색 충돌 지점은 스프라이트 내에 있으며 회색 선은 각 충돌 지점의 관련 축을 나타내는 데만 사용되었습니다. 예를 들어 캐릭터의 스프라이트가 단순한 녹색 사각형 인 경우 콜리 전 점은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

답변:


34

난 당신이 걸릴해야합니다 생각 상자의 움직임을 고려. 즉, 상자가 플레이어쪽으로 움직일 때만 분쇄하십시오.

이것은 움직임이 중요한 플랫폼 러의 다른 문제와 유사합니다. 예를 들어 아래에서 뛰어 넘을 수있는 플랫폼의 경우 플레이어가 위쪽으로 움직이면 충돌을 확인하지 마십시오.

따라서 블록이 아래쪽으로 움직일 때만 블록이 위에서 플레이어를 부술 수 있습니다. 블록이 위로 움직이는 경우에만 아래에서; 블록이 오른쪽으로 이동하는 경우에만 왼쪽에서


13
+1 블록이 플레이어가 아닌 여기에서 작동하고 있음을 고려하십시오. 박스가 플레이어를 찌그러 뜨리지 않는지 확인하면 플레이어가 찌그러져 있는지 확인하는 대신 문제를 해결하는 것이 더
Niels

블록이 움직이지 않을 때는 어떻습니까? 이제 5 번 블록에 화살표를 넣었지만 두 개의 고정 블록이라는 것을 알았습니다.
IanLarson

고정 블록이 부서지지 않아야한다고 결정한 경우, 플레이어가 막히지 않았는지 확인하십시오.
congusbongus

Argh, 나는 픽셀과 프레임이 완벽하고 개발자가 게으 르기 때문에 실제로 서로 멀어지는 두 물체에 눌려지는 것을 싫어 합니다.
코뿔소

9

은 "호감 테스트"포인트가 될이 안에 당신이 거기 픽셀 중 하나에 타격을 감지하는 경우에만 플레이어를 죽일 즉 - 이미지 # 1의 회색 상자.


1
충돌 지점의 경계에 "충돌 확인 지점"을 추가 했습니까? 내가 볼 수있는 문제는 객체가 내부 크러쉬 체크 포인트에 도달하기 전에 충돌 지점 중 하나가 "트리거"될 때 각 축에서 충돌 해결이 발생한다는 것입니다.
IanLarson

6

80 년대 플랫 포머와 함께 자란 사람으로서, 나의 첫 번째 의견은 접점 이 스프라이트 위에 있어야 하며, 바깥 쪽이 아니라는 것입니다. 무기 / 크러셔 / 에니메가 캐릭터와 분명히 몇 픽셀 떨어져있을 때 죽는 것보다 더 실망스러운 경험은 거의 없었습니다. 이러한 경험은 사람들이 게임을하는 것을 막는 것입니다.

이를 염두에두고 수평 및 수직 충돌에 대해 별도의 점을 갖는 아이디어는 단순히 날아 가지 않습니다. 따라서 귀하의 사례 3과 5는 존재하지 않습니다.

앞에서 언급했듯이 충돌 감지와 관련하여 이동 방향을 고려해야하고 두 개의 이동 축을 고려해야합니다. 크러셔가 쓰러지면 플레이어는 앞으로 나아갈 수 없어 벽처럼 행동해야합니다. 따라서 동일한 위치에 가로 및 세로 감지 지점이 있으면 믹스에 이동 방향을 추가하기 전에도 사례 4를 얻을 수 없었습니다.

상향 이동 분쇄기는 추가적인 복잡성을 추가합니다. 플레이어가 탈출 할 기회가 없을 정도로 빠르면 OK. 그러나 속도가 느리면 플레이어는 상승 플랫폼을 뛰어 넘고 다른 쪽에서 벗어날 수있을 것으로 기대합니다. 크러셔에서 플레이어 스프라이트가 위로 상승하고 크러시 감지가 천장 에서 발생합니다 .


3
사소한 점-그의 스프라이트가 어떻게 보이는지 알 수 없습니다. 우리 모두가 위의 이미지와 정확히 일치 할 수 있으므로 사례 3과 5가 완전히 유효 할 수 있습니다.
Alex

1
알렉스가 맞아 명확히하기 위해 편집했습니다. 불변의 충돌 상자보다 더 나쁜 것은 없다는 것에 동의합니다. 다른 축에 별도의 점을 사용하지 않는 것에 대한 귀하의 요점을 이해한다고 생각합니다. 그렇게하면 위의 예가 각 모서리에 하나씩 8 점에서 4 점으로 바뀌는 것입니까? 필자는 실제로 그 결과를 염두에두고 (바람직하지 않은 결과로) 약간의 테스트를 수행했지만 모서리를 "분리"하면 거의 완벽하게 찾고있는 동작을 얻을 수 있기 때문에 주저합니다. 이것들은 실제로 내가 만난 유일한 문제 시나리오입니다.
IanLarson

0

물체를지면보다 "단단하게"만들 수 있습니다. 충돌을 가정 할 때 플레이어는 움직이는 물체로 "밀어 넣는"것이 아니라지면으로 "밀어집니다".

이것은 플레이어가 물체 나지면으로 스스로를 밀어 넣을 수 없다고 가정합니다.


0

객체가 표시 될 때까지 기다릴 필요없이 객체의 겹침을 감지 할 수있는 경우 간단한 접근 방식은 플레이어와 다른 객체의 모션을 한 번에 한 픽셀 씩 독립적으로 처리하여 나중에 별도의 충돌 검사를 수행하는 것입니다. 플레이어가 자유롭게 움직이고 그러한 움직임의 결과로 물체와 충돌하는 경우 뒤로 물러서십시오. 물체의 움직임으로 인해 물체와 충돌이 발생하면 플레이어가 물체와 같은 방향으로 움직일 수 있는지 확인하십시오. 그렇다면 플레이어를 옮기십시오. 그렇지 않은 경우 "충돌"상황을 적절하게 처리하십시오 (접촉에 따라 플레이어를 손상 시키거나 죽이고 충돌하는 물체를 뒤로 이동).

BTW, 제한된 수의 모양 조합 만 충돌 할 수있는 경우 픽셀이 오프셋 (x1, y1)에서 첫 번째 스프라이트로 설정되고 두 번째에서 픽셀이 설정되도록 "충돌 감지"비트 맵을 미리 계산하는 것이 유용 할 수 있습니다. 두 번째 오프셋 (x2, y2)에서 오프셋 (x1-x2, y1-y2)의 픽셀이 충돌 맵에 설정됩니다. 이러한 사전 계산 된 충돌 맵은 충돌 맵에서 단일 픽셀의 상태를 확인하여 두 스프라이트 간의 충돌을 감지 할 수있게합니다.


0

플레이어를 부수려면 두 개의 물체가 필요합니다. 크러시 감지는 플레이어가 두 물체 사이에 있는지, 그 사이의 간격이 플레이어의 크기와 같고 거리가 감소하는지 확인해야합니다.


0

나는 지금까지 일할 다음을 찾습니다. 크러셔의 움직임에 대한 "외부"정보가 필요하지 않으며 오 탐지 문제를 해결합니다. 오 탐지 (false positive)가 감지되면 충돌로 간주됩니다 (실제로는 다음과 같습니다).

아이디어는 : 캐릭터가 움직이는 지 실제로 관리 할 때 크러셔가 움직이는 지 확인하는 이유입니다. 캐릭터 자체의 움직임에 의한 크러시가 크러시인지, 크러셔 오브젝트의 움직임에 의한 크러시인지 모두 대답 할 수 있습니다.

캐릭터가 움직이고 찌그러지는 경우 (들어오는 프레임의 반대쪽면에 충돌) 마지막 프레임 / 반복 좌표에서 찌그러짐을 다시 확인하십시오.

  1. 다시 확인되지 않으면 캐릭터 자체의 움직임으로 인한 것이며 캐릭터는 충돌처럼 마지막 프레임 / 반복 좌표로 돌아와야합니다

  2. 분쇄가 두 번째로 확인되면 분쇄를 진행하십시오.

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