Plattformer 빌드-플레이어가 점프 할 수 있는지 확인하는 방법?


16

간단한 Plattformer Jump n 'Run Style 게임을 만들고 있습니다. 타일을 사용하지 않습니다. 대신 레벨 엔터티에 기하학적 모양이 있습니다 (플레이어도 하나임). 충돌 감지 코드를 마치고 지금까지 모든 것이 제대로 작동합니다.

다음으로 점프를 구현하고 싶었습니다. 플레이어가 적절한 키를 쳤는지 확인하고 상향 속도를 추가하십시오. 잘 작동합니다. 그러나 플레이어가 공중에 있더라도 작동하지만 이는 내가 원하는 것이 아닙니다. ;-)

플레이어가 무언가에 서 있는지 확인해야합니다. 첫 번째 아이디어는 마지막 프레임에 충돌이 있는지 확인하고 플레이어를 "점프 할 수있는"것으로 표시하는 것이었지만 플레이어가 공중에서 벽에 부딪히면 트리거 될 수도 있습니다. 내 수학 기술이 그렇게 좋지 않기 때문에 도움을 요청합니다. 힌트조차도 이것을 구현하는 방법을 할 것입니다.

감사!

답변:


14

두 가지 옵션이 떠 오릅니다.

  • 먼저 형상에 ID를 태그로 지정하고 충돌이 바닥에 태그가 지정된 형상과 충돌하는지 확인합니다. 이것은 점프 가능한 표면을 최대한 제어하지만 레벨 생성 시간에 비용이 듭니다.
  • 두 번째는 충돌의 법선을 확인하는 것입니다. 위를 향한 경우 점프를 허용하십시오. 또는 약간의 여유 범위 내에서 경사 바닥이 있는지 여부에 따라 다릅니다. 이것은 유연하고 태그가 필요하지 않지만, 바닥과 벽이 비스듬한 경우 원하지 않는 곳에서 약간의 점프가 발생할 수 있습니다.

정상적인 확인은 나에게 좋은 생각 인 것 같습니다. 게시 해 주셔서 감사합니다.
Christopher Horenstein

정상 점검의 경우 +1 이를 통해 바닥이 문제없이 벽으로 원활하게 전환 될 수 있습니다.
Soviut

1
+1 충돌 법선을 확실히 점검하십시오. 다양한 유형의 월드 지오메트리를 사용하는 것이 좋으며보다 유연한 레벨 디자인이 가능하지만 주요 문제를 해결하지는 못합니다. "벽"은 벽에 닿거나 서 있는지에 따라 "접지"유형일 수도 있습니다. 그것이 충돌 법선이 도움이되는 곳입니다.
bummzack

정상적인 해결책이 매우 좋으며 문제를 해결할 것입니다. 다른 높은 등급의 답변조차 훌륭하고 훌륭합니다. 그러나 이것은 내 질문에 더 잘 대답합니다. 당신의 wkerslake 감사합니다!
Malax

8

반드시 어떤 종류의 표면 유형을 구현해야합니다. 생각해보십시오. 캐릭터가 벽이나 사다리와 충돌했는지 알 수없는 경우 사다리를 올라갈 수 있다면 어떻게 관리 할 것입니까? 단순히 OOP를 사용하여 Heritage를 사용하여 유형 계층을 관리 할 수 ​​있지만 열거 된 유형을 사용하여 구현 된 "범주"를 사용하는 것이 좋습니다.

아이디어는 다음과 같습니다. "충돌"열거에는 각 범주에 대한 플래그가 있습니다. 예를 들면 다음과 같습니다.

namespace Collisions
{
    enum Type
    {
        None   = 0,
        Floor  = 1 << 0,
        Ladder = 1 << 1,
        Enemy  = 1 << 2,
        ... // And whatever else you need.

        // Then, you can construct named groups of flags.
        Player = Floor | Ladder | Enemy
    };
}

이 방법을 사용하면 플레이어가 관리해야 할 항목을 충돌했는지 테스트하여 엔진이 엔티티의 "복합"메소드를 호출 할 수 있습니다.

void Player::Collided( Collisions::Type group )
{
   if ( group & Collisions::Ladder )
   {
      // Manage Ladder Collision
   }
   if ( group & Collisions::Floor )
   {
      // Manage Floor Collision
   }
   if ( group & Collisions::Enemy )
   {
      // Manage Enemy Collision
   }
}

이 방법은 비트 단위 플래그와 비트 단위 "Or"연산자를 사용하여 범주의 이진 값에 따라 각 그룹의 값이 달라 지도록합니다. 이 방법은 잘 작동하고 쉽게 확장 가능하므로 세관 충돌 그룹을 만들 수 있습니다. 게임의 각 엔티티 (플레이어, 적 등)에는 충돌 할 수있는 것을 결정하는 데 사용되는 "필터"라는 비트가 있습니다. 충돌 코드는 다음과 같은 코드를 사용하여 비트가 일치하고 반응하는지 확인해야합니다.

void PhysicEngine::OnCollision(...)
{
    mPhysics.AddContact( body1, body1.GetFilter(), body2, body2.GetFilter() );
}

열거 형 대신 const ints를 사용해야하는 이유가 있습니까? 단일 플래그 또는 명명 된 그룹의 축퇴 된 경우 열거 된 유형을 더 읽기 쉽고 대부분의 컴파일러에서 추가 유형 확인 기능을 사용할 수 있습니다.

글쎄, 열거 형은 바이너리 연산자를 사용하여 새 사용자 정의 그룹을 만들 수 없다고 생각합니다. 내가 이것을 const로 만든 이유는 가독성을 위해 공용 정적 멤버와 함께 Config 클래스를 사용하여 구성 매개 변수의 보안을 유지하기 때문입니다.
Frédérick Imbeault

할 수 있습니다. 열거 "rvalues"는 다른 상수 값에 대한 비트 연산 일 수 있습니다 (실제로 상수 식 일 수는 있지만 표준을 확인하기에는 너무 게으른 것 같습니다). 비 정적 값은 예제와 정확히 같은 방식으로 달성되지만 더 정확하게 입력됩니다. "보안"의 의미가 무엇인지 모르겠지만 클래스와 관련된 오버 헤드없이 정확히 동일한 구문을 네임 스페이스로 얻을 수 있습니다.

열거 형을 사용하도록 코드 예제를 업데이트했습니다.

어쩌면 생각하기가 더 쉬울 것입니다. 변경 사항을 승인하고, 사용한 방법이 정확했지만 설명 enouph의 코드를 조정하지 않았습니다. 수정 해 주셔서 감사합니다. 네임 스페이스의 경우는 옳지 만 모든 언어 (예 : 스크립팅 언어)에는 해당되지 않습니다. "보안"은 내 구성 옵션이 정적이므로 수정할 수 없지만 열거 형을 사용하면이를 막을 수 있습니다.
Frédérick Imbeault

1

캐릭터의 발을 특정 거리만큼 캐릭터 아래에서 항상 고려하고 표면에서 멀어지지 않으면 캐릭터가지면에 있습니다.

대략적인 의사 코드에서 :

bool isOnGround(Character& chr)
{
   // down vector is opposite from your characters current up vector.
   // if you want to support wall jumps, animate the vecToFoot as appropriate.
   vec vecToFoot = -chr.up * chr.footDistanceFromCentre;

// if feet are moving away from any surface, can't be on the ground if (dot(chr.velocity, down) < 0.0f) return false;

// generate line from character centre to the foot position vec linePos0 = chr.position; vec linePos1 = chr.position + vecToFoot;

// test line against world. If it returns a hit surface, we're on the ground if (testLineAgainstWorld(line0, line1, &surface) return true;

return false; }


더블 점프 또는 벽 점프와 같은 기능을 추가하려는 경우에는 작동하지 않습니다.
Frédérick Imbeault

OP가 이중 점프 또는 벽 점프를 언급하지 않았다고 생각합니까?
jpaver

문자 센터에서 벡터를 발로 추상화하는 방법을 보여주기 위해 코드를 수정했습니다. 이 애니메이션을 적용하고 발이 옆으로 향하고 벽에 부딪히면 벽 점프를 지원할 수 있습니다.
jpaver

이것은 기본적으로 충돌 법선을 확인하는 덜 유연한 방법입니다. (정상 방향을 확인하는 것만으로도 천장 점프에서 바닥 점프와 벽 점프를 구별 할 수 있기 때문에 유연성이

2
char의사 코드에서도 변수를 호출하지 마십시오 .
rightfold
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.