좋은 2D 플랫 포머 물리학


76

Box2D와 함께 2D 플랫 포머 용으로 기본 캐릭터 컨트롤러를 설정했으며 기분을 좋게 만들기 위해 조정을 시작하고 있습니다. 물리 엔진에는 조정해야 할 노브가 많으며 물리 엔진으로 처음 작성하는 것이 분명하지 않습니다. 점프는 몇 가지 진드기에 힘을 가해 야합니까? 충동? 직접 속도를 설정 하시겠습니까? 아바타가 마찰을 모두 제거하지 않고 벽에 달라 붙지 않게하려면 어떻게해야합니까 (또는 모든 마찰을 제거하지만 공중에서만 제거)? 캐릭터를 캡슐로 모델링해야합니까? 모서리가 둥근 상자? 두 바퀴가 달린 상자? 하나의 큰 바퀴? 나는 누군가가 전에 이것을 한 것 같아요!

웹에서 사용할 수있는 "아기의 첫 물리학"이 아닌 리소스가 거의없는 것 같습니다.이 문제는 누군가 누군가 이미 문제를 해결하기를 원하는 부분을 차단했습니다. 플랫 포머 용 물리 엔진의 대부분의 예는 부유 느낌 제어, 또는 공중 점프 또는 일시적 침투가 너무 높을 때 쉽게 악용 될 수있는 행동을합니다.

내가 의미하는 몇 가지 예 :

  • 짧게 점프하면 짧은 거리로 점프합니다. 길게 탭하면 더 높아집니다.
  • 고속으로 방향을 멈추거나 반전시킬 때 짧은 미끄러짐.
  • 경사면에 안정적으로 서 있습니다 (그러나 더킹 할 때 아래로 미끄러질 수 있음).
  • 아날로그 컨트롤러 사용시 아날로그 속도.
  • 좋은 플랫 포머와 나쁜 플랫 포머를 분리하는 다른 모든 것.
  • 안정적인 이동 플랫폼을 제안합니까?

난 정말 "이봐, 이러지 마라"를 찾고 있지 않습니다 분명히 옳은 일은 게임에서 원하는 것에 달려 있습니다. 그러나 나는 어딘가 누군가 가능성을 겪고 "좋은 기술 A는 X를 잘, 기술 B는 Y를 잘하지만 C와는 잘 작동하지 않는다"고 말하거나 "if (key = = space) character.impulse (0, 1) "

답변:



25

실제 물리 엔진을 사용하여 '마리오와 같은'물리를 구현하는 것은 상당히 까다 롭습니다.

내가 이것을 시도했을 때 Chipmunk를 사용하여 플레이어를 2 개의 서클- '피트 서클'위에있는 '바디 서클'로 모델링했습니다.

'발 원'은 약간의 마찰력이 있었고 탄력이 없었으며 상당히 작았습니다. '바디 서클'은 더 크고 마찰이 없어서 벽 / 스티프 슬로프에 달라 붙지 않습니다.

개체가 회전을 허용하지 않도록 제한되었습니다.

'피트'가 무언가에 닿거나 마지막 몇 프레임 내에있는 경우 (슬로프를 내릴 수 있도록) 플레이어는지면에있는 것으로 간주됩니다 (표면 정상 점검도 가능)

코드를 살펴본 지 오래되었지만 동작은 다음과 같습니다.

지상에있을 때 :

  • '추가 중력'을 적용하십시오 (경사면을 내리는 데 도움이되는 하향 력).
  • 지면 마찰 적용 (대량의 수평 댐핑)
  • 컨트롤에 따라 왼쪽 / 오른쪽 이동 력을 적용하십시오.
  • (최대 주행 속도에 접근함에 따라 왼쪽 / 오른쪽 이동 력을 줄이십시오)
  • 점프를 누르면 위쪽으로 충격을가합니다

공중에있을 때 :

  • 공기 저항 적용 (소량의 수평 감쇠)
  • 규칙적인 (또는 감소 된) 중력 적용
  • 무선 제어가 가능한 경우 왼쪽 / 오른쪽 이동 력 적용

두 상태 사이를 전환하는 데 약간의주의가 필요합니다-경사면을 내려갈 때 두 프레임 동안 땅을 떠날 수 있음을 기억하십시오. 아마도 그 상태에서 상태를 전환 / 점프하지 않으려 고합니다.

조심해야 할 몇 가지 다른 점은 ... '점프 업 (jump-up-through)'플랫폼은 구현하기가 어려울 수 있으며 재미있는 작업 (플랫폼 이동, 회전하는 세계 등)을 시작할 때주의해야합니다. '애니메이션 구동'움직이는 물체에 플레이어가 끼이거나 눌리지 않도록하십시오.


나는 이것이 꽤 오래된 대답이라는 것을 알고 있지만 이것에 대해 몇 가지 질문이 있습니다. 1) "지형 경사면에 상관없이 같은 속도를 유지합니까?" 2) 발에 작은 원을 사용하고 몸에 더 큰 원을 사용하는 경우 플레이어가 가장자리에 매달리지 않습니까? 나는 당신의 접근에 정말로 관심이 있습니다.
Notbad

18

솔직히 물리 엔진을 사용하는 것이 매우 엄격한 요구 사항을 가진 그 크기의 도메인에 적합한 접근법이라고 생각하지 않습니다.

직접 작성하십시오. 많은 노브를 조정하는 것보다 "길이 y에 대한 점프 버튼을 누를 때이 포물선 모양에서 x 단위로 문자 위로 이동"이라고 말하면 훨씬 더 나은 결과를 얻을 수 있습니다.


나는 과거에 이것을 여러 번 해냈다. 그것은 어느 정도 효과가 있지만, 해키 컨트롤러로 물리학을하기에는 "너무 힘들 기"때문에 항상 다른 것을 버린다. 이 특정 게임에서 나는 플레이어의 움직임을 위해 봄 / 로프 역학을 포함하기를 바라고 있는데, "상자를 해킹하는 것보다는 오히려 실제 물리 엔진을 해킹하고 싶다"는 영역으로 넘어갔습니다. 발동력".

3
나는 오히려 박스 이동기를 해킹하고, 적어도 불안정 할 수는 없지만 물리 엔진은 정확한 스펙 (및 물리 엔진 제약 조건)으로 움직임을 제한해야하기 때문에 너무 많은 힘을 가하면 폭발하는 경향이 있습니다. 단단하고, 그들은 너무 많이 준수하려고 시도 할 수 있습니다). 또한 원치 않는 하나의 문제를 해결하기 위해 힘을 가하는 것은 다른 모든 것에 영향을 미쳐서 사기꾼을 유발하는 경향이 있습니다.
Kaj

10

현대 기술을 사용하여 처음부터 플랫폼 게임을 구축하는 방법에 대한 일련의 기사를 작성했으며 간단한 물리학을 다루는 방법이 포함되어 있습니다.

http://www.wildbunny.co.uk/blog/2011/12/14/how-to-make-a-2d-platform-game-part-2-collision-detection/

그러나보다 첨단 기술을 원한다면 완전한 물리 엔진을 사용하여 이것에 접근하는 것이 전적으로 가능합니다. 다음은 플레이어 캐릭터를 물리 엔진의 완전히 통합 된 부분으로 만드는 Little Little Planet의 기술입니다.

플레이어를 물리 엔진에 '외부 입력'으로 옮기기 위해 충격을가하거나 속도를 설정하는 대신 캐릭터를 제어하는 ​​구속 조건을 개발할 수 있습니다.

따라서이 구속 조건은 플레이어가 원하는 게임 속도와 방향을 입력으로하고 플레이어의 최대 강도와 속도 같은 것을 모델링합니다. 구속 조건은 입력에 따라 (그리고 최대 값을 준수하여) 플레이어를 이동 시키려고 시도하며 구속 조건으로 인해 플레이어가 서있는 물체에 동등하고 반대의 힘을 가하여 플레이어가 움직이는 플랫폼에 서있을 수 있습니다 그가 움직 인 것들에 영향을 미칩니다

이와 같은 작업을 수행하면 플레이어가 실제로 물리 엔진의 핵심 부분이기 때문에 거대한 상자 더미 아래에 있거나 여러 움직이는 플랫폼을 뛰어 넘는 것과 같은 상황을 완전히 자연스럽게 처리 할 수 ​​있습니다.

희망이 도움이됩니다!

건배, 폴


6

이 질문은 Box2D 포럼에서 중요한 토론을 보았습니다. 캐릭터 이동, 점프 또는 플랫 포머에 대한 토론을 읽으면 가능한 모든 문제를 발견하게 될 것입니다. 그러나이 문제는 충돌 필터링 시스템이 업데이트되고 테스트 베드 예제가 어떻게 수행되어야하는지 보여주기 위해 작성 될 정도로 복잡해졌습니다.

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