충동 점프


12

나를 당혹스럽게 한 가지가 있는데, 이것이 플랫 포머에서 '가짜 충동'점프를 구현하는 방법입니다. 내가 무슨 말을하는지 모른다면 마리오, 커비, 동굴 이야기에서 인용 한 점프를 생각해보십시오. 그들의 공통점이 무엇입니까? 점프 높이는 점프 버튼을 얼마나 오래 누르고 있는지에 따라 결정됩니다.

이 캐릭터의 '임펄스'는 실제 물리학에서와 같이 점프하기 전에 만들어지는 것이 아니라 공중에서 있을 때입니다. 즉, 최대 높이의 중간에서 손가락을 아주 잘 들어 올릴 수 있습니다. 그것과 완전 정지 사이의 탈 가속; 홉을 살짝 누르고 길게 뛸 수있는 이유는 무엇입니까? 나는 그들이 궤도를 호로 유지하는 방법에 매료되어 있습니다.

내 현재 구현은 다음과 같이 작동합니다.

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

점프 버튼을 누르고있는 동안 중력은 꺼지고 아바타의 Y 좌표는 일정한 중력 값만큼 감소합니다. 예를 들어, 틱당 Z 단위에 도달하면 틱당 Z 단위가 증가합니다.

버튼에서 손을 떼거나 한계에 도달하면 아바타는 속도가 0에 도달 할 때까지 X 단위를 덮는 양만큼 속도가 느려집니다. 일단 그것이 속도가 중력과 일치 할 때까지 가속됩니다-예를 고수하면서, 여전히 X 단위를 덮으면서 0에서 Z 단위 / 틱으로 가속한다고 말할 수 있습니다.

그러나이 구현은 점프를 너무 대각선으로 만들고 아바타의 속도가 중력보다 빠르지 않으면 현재 프로젝트에서 너무 빠릅니다 (틱 당 약 4 픽셀로 이동하고 틱당 10 픽셀로 중력은 40FPS의 프레임 속도), 수평보다 수직입니다. 플랫 포머에 익숙한 사람들은 캐릭터의 아크 점프는 게임의 중력만큼 빠르지 않더라도 거의 항상 더 멀리 점프 할 수 있으며 올바르게 플레이하지 않으면 제대로 점프하지 못한다는 것을 알 수 있습니다 매우 직관적입니다. 구현이 매우 성가신 것을 증명할 수 있기 때문에 이것을 알고 있습니다.

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

누구든지 비슷한 역학을 시도했지만 성공했을 수도 있습니까? 이런 종류의 플랫 포머 점프 뒤에 무엇이 있는지 알고 싶습니다. 이 경험을 한 번도 경험하지 못하고 진행하고 싶다면 올바른 방법이 아닌 한 설명 된 구현을 수정하거나 향상시키지 마십시오. 할퀴다. 나는 당신이 중력, 물리 또는 다른 것을 사용하는지 상관하지 않습니다.

또한 언어 별 코딩을 피하기 위해 프레젠테이션을 원합니다. C ++ 예제 또는 Delphi를 공유하는 것과 같이 ... 프로젝트에 XNA 프레임 워크를 사용하고 있고 C #을 신경 쓰지 않는 한 다른 코드를 읽는 데 인내심이 많지 않습니다. 다른 언어의 특정 게임 개발자는 우리가 여기서 달성 한 것에 관심이 있으므로 의사 코드를 고수하지 마십시오.

미리 감사드립니다.


3
다음 질문과 답변을 보셨습니까? gamedev.stackexchange.com/questions/29617/…
bummzack

@bummzack 이것도 매우 명확합니다.
Mutoh December

1
점프 핸들링과 중력 의 가능한 복제물 예쁜 그림은 없지만 같은 질문입니다.
MichaelHouse

답변:


8

나는 당신의 주요 문제가 여기에 있다고 생각합니다.

점프 버튼을 누르고있는 동안 중력은 꺼지고 아바타의 Y 좌표는 일정한 중력 값만큼 감소합니다. 예를 들어, 틱당 Z 단위에 도달하면 틱당 Z 단위가 증가합니다.

중력은 그런 식으로 작동하지 않습니다. 구글은 세부 사항에 대해 "균일하게 가속 된 움직임"을 표현하지만, 간단히 말하면 다른 동료 회원이 말했듯이 중력은 속도가 아니라 가속이다.

간단히 말해서, 속도는 시간에 따른 일정한 위치 변화 속도 이지만 가속은 시간에 따른 일정한 속도 변화 속도 입니다.

따라서 비즈니스의 첫 번째 순서는 속도뿐만 아니라 가속도를 포함하도록 하강 알고리즘을 변경하는 것입니다. 대신에:

pos_y = pos_y + (velocity_y * time_difference)

당신은 같은 것을해야 할 것입니다

pos_y = pos_y + (velocity_y * time_difference) + (gravity_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (acceleration_y * time_difference)

그렇게하면 모든 것이 포물선에 빠지게되는데 이것은 물리적으로 올바른 운동입니다.

이제 간단한 점프를 구현하기 위해 (이후 바로 정확한 질문을 얻습니다) velocity_y원하는 값으로 설정 하면됩니다. 부호 acceleration_y와 원하는 기호 velocity_y가 다르면 객체가 올바르게 점프합니다 (즉, "중력을 끄지 않습니다". 그대로 유지하고 객체의 속도를 미리 정의 된 값으로 설정).

velocity_y점프를 시작할 때 크면 클수록 점프가 높아집니다. 따라서 원하는 효과를 구현하기 위해 점프에 일종의 가속을 추가합니다 (물리적으로 이것은 힘을 추가하는 것을 의미합니다. 물체에 작은 로켓을 추가하는 것을 고려하십시오).

이렇게하려면 이전과 같은 작업을 수행하지만 이제 가속도와 속도는 동일한 부호를 가져야합니다. 버튼을 누른 상태에서이 작업을 수행하십시오.

pos_y = pos_y + (velocity_y * time_difference) + (force_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (force_y * time_difference)

4

해결책은 감속을 지연시키지 않는 것입니다. 공을 공중에 던지면 공이 최대 높이에 도달 할 때까지 일정한 속도로 움직이지 않지만 충동의 순간부터 감속됩니다.

중력은 속도가 아니라 가속입니다. 따라서 플레이어의 속도가 20 단위 이상이고 중력이 -10 단위이면 다음 틱에서 속도는 10 단위, 다음 단위는 0 단위 등입니다.

점프가 너무 대각선으로 보이는 이유는 플레이어의 속도가 일정하기 때문입니다. 따라서 플레이어의 경로를 따라 문자 그대로 선을 그리면 x 위치의 변화에 ​​대한 기울기 값이 양수 또는 음수 인 중력 값의 선이 표시됩니다.

플레이어가 점프 높이를 제어하려면 플레이어에게 임펄스에서 초기 속도를 부여하고 중력을 끄고 특수 중력 값 (일반 중력 미만)을 플레이어의 속도에 적용해야합니다. 점프 버튼에서 손을 떼거나 플레이어 속도가 0에 도달하면 수직 중력을 적용해야합니다.

이런 식으로 플레이어는 규칙적인 중력으로 감속하든 아니든 점프 중에 멋진 곡선을 볼 수 있습니다.


2

짧은 이야기는 : 당신은 어딘가에 점프 아크에 비 포물선 섹션을 갖게 될 것입니다.

점프를 구현할 때 몇 가지 접근법을 시도했습니다.

  • 끊임없는 상승 : 실제로 시도한 것처럼 보입니다. 버튼을 놓을 때까지 양의 수직 속도가 고정되어 정상 중력이 시작됩니다. 호는 상승시 대각선이지만 하강에서는 정상입니다. 이것은 실제로 정상으로 보이며 점프의 높이를 잘 판단하기가 쉽기 때문에 (더 중요하게는) 기분이 좋습니다.

  • 체포 된 등반 : 이곳에서 최대 높이의 포물선에서 캐릭터를 시작하여 초기 임펄스를 적용합니다. 그런 다음 버튼에서 손을 떼면 수직 속도를 0 (또는 작은 위쪽 속도)으로 설정합니다. 즉, 가장 큰 점프는 포물선이 보장되며 작은 점프는 큰 점프를하고 느리게하는 것처럼 느껴집니다.

  • 가변 초기 임펄스 : 이것은 내가 선택한 것으로, 점프를 누르면 홉에 충분한 초기 상향 임펄스를 적용한 다음 짧은 기간에 걸쳐 계속해서 상향 가속 (중력보다 훨씬 큰)을 적용합니다. 버튼이 해제되었습니다. 점프 윈도우가 닫히면, 동작은 포물선이되고, 가변적 인 초기 임펄스주기는 이상하게 보이지 않을 정도로 짧았지만, 숙련 된 플레이어에게 점프 높이를 제어 할 수있는 충분한 범위를주기에 충분했습니다. 단점은 윈도우가 훨씬 작고 릴리즈 모멘트와 높이의 대응 성이 없기 때문에 점프 높이를 판단하는 것이 쉽지 않았다는 것입니다. 대부분의 경우에 당신은 어쨌든 탭 또는 전체 점프를 원했기 때문에 그렇게 문제가되지 않았습니다.

이것들을 시도하고 가장 기분이 좋은 것을보십시오.

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