캐릭터 점프를 만드는 방법?


44

현재 Direct X 9.0을 사용하여 C #으로 게임을 만들고 있습니다. 게임 리메이크는 Donkey Kong NES입니다. 거의 모든 것이 완성되었지만 마리오 점프의 물리학에 문제가 있습니다. Y 및 X 조정에 대해 선언 된 변수가 있습니다.

이 작업을 수행하는 간단한 방법이 있는지 궁금합니다. 나는 답을 찾기 위해 높고 낮게 검색했지만 찾은 답은 관련이 없거나 XNA와 같은 다른 프로그래밍 언어를 사용합니다.

나는 현재 W를 눌렀는지 확인하기 위해 bool 변수를 설정했으며 그로 인해 점프 할 수있는 코드가 트리거됩니다. 나는 같은 엉망이되었습니다.

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

어느 것이 잘 작동하지 않았습니다. 나는 답을 찾기 위해 높고 낮게 검색했으며 이제 누군가가 간단한 해결책으로 올바른 방향으로 나를 가리킬 수 있다면 필사적입니다. 대단 할 것입니다. 모든 답변에 감사드립니다.


5
다른 프로그래밍 언어를 사용한 답변은 문제가되지 않습니다. 알고리즘은 특정 구현이 아닌 관심 대상입니다 ... 아무것도 이해하지 않고 복사하여 붙여 넣기를 희망하지 않는 한, 분명히 당신이 아니기를 바랍니다! 다른 프로그래밍 언어에서 알고리즘을 읽고 적용 할 수 있다는 것은 매우 좋은 기술입니다.
ccxvii

답변:


84

우선, XNA는 C #도 사용하므로 동일한 프로그래밍 언어입니다. 기본 API는 DirectX와 약간의 차이가 있지만 점프와는 아무런 관련이 없으므로 동일한 자습서 또는 답변이 여기에 적용되어야합니다. 또한 많은 요소에 따라이를 구현하는 방법이 많이 있습니다. 아래에서 설명 할 것은 가능성 중 하나입니다.

기본 물리학 요구 사항

먼저 업데이트 루프에서 기본적인 물리 변수와 계산이 필요합니다. 특히, 위치, 속도 및 중력이 정의되어 있어야하며 업데이트 루프는 이와 거의 비슷한 작업을 수행해야합니다 (단순화를 위해 충돌 감지 및 응답 생략).

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

고정 높이 점프

키를 아무리 길게 누르더라도 항상 같은 높이를 가진 점프를 구현하는 가장 쉬운 방법은 단순히 수직 속도를 한 번 변경하는 것입니다. 그러면 캐릭터가 상승하기 시작하지만 중력은 자동으로 캐릭터를 끌어 내립니다.

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

중요 캐릭터가 바닥에 있지 않으면 점프를 시작하고 싶지 않으므로 체크를 추가해야합니다.

가변 높이 점프

그러나 Mario 및 Sonic과 같은 게임에는 가변 높이로 점프 할 수 있는데, 여기서 점프 높이는 버튼을 얼마나 오래 누르고 있는지에 따라 다릅니다. 이 경우 모두 눌러 처리해야 하고 점프 키를 해제. 다음과 같은 것을 추가 할 수 있습니다.

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

위의 코드에서 이러한 모든 값 (예 : 0.5, -12.0f또는 -6.0f)을 조정하면 점프 느낌, 점프 높이, 점프 버튼을 놓은 후에도 얼마나 많은 운동량을 유지하는지, 떨어지는 속도 등을 변경할 수 있습니다. .

중요 사항 매 프레임마다이 기능을 호출하지 마십시오. 키를 누르거나 놓을 때 한 번만 호출하십시오. 그렇지 않으면 캐릭터가 점프 대신 날아갑니다.

작업 예

방금 위에서 설명한 기술의 간단한 예를 만들었습니다. 브라우저에서 여기를 시도해 볼 수 있습니다 (마우스 버튼을 눌러 점프, 중간에 놓아 점프 높이를 제어하십시오). JS에 있지만 앞에서 언급 했듯이이 경우 언어는 관련이 없습니다.

http://jsfiddle.net/LyM87/


11
며칠 전에 작성된이 놀라운 기사를 다음 주제와 관련된 정보와 공유 할 수있는 기회를 가질 수도 있습니다 . 2D 플랫 포머 구현 안내서 . 그리고 이것도 소닉 점프 입니다.
David Gouveia

2
이 기사에서는 답변에서했던 것과 다른 방법으로 변수 점프를 수행하는 방법에 대해 설명합니다. 버튼을 누르고있는 동안 중력을 억제하거나 임펄스를 계속 추가해야합니다. 나는 보통 다윗이 그의 대답에서하는 말을하지만 기사의 방법에 대한 생각이 있습니까?
Jeff

@Jeff 그것은 저의 관심을 끌었고, 그것을 구현하는 여러 가지 방법이 있다고 언급 한 이유입니다. 첫 번째 기사는 동일한 문제를 처리하는 두 가지 추가 방법을 설명하는 반면, 내가 설명한 방법은 두 번째 기사를 기반으로합니다. 구현하기는 쉽지만 서로 비교하는 방법을 모르겠습니다. 결국, 나는 설명하기가 쉬우 며 타이머를 추가하거나 여러 크기의 감소하는 충동을 다룰 필요가 없기 때문에이 방법을 선택했습니다.
David Gouveia

답변은 특정 게임과 원하는 애니메이션 수에 따라 달라질 수 있습니다. Metroid는 일정한 속도로 점프 / 하강을 사용하지만 고품질 애니메이션 작업으로 마스크를 마스크하여 천정에서 매끄럽고 "곡선"으로 표시합니다. 다른 많은 플랫 포머는 가변 속도 점프를 사용하므로 제대로 작동하려면 더 많은 작업이 필요합니다.
Sean Middleditch

1
이것은 5 년 후에 매우 도움이되었습니다.
유동성

1

물리학 에서처럼. 당신이 누르고있는 순간에만 jump key캐릭터가 지상에 속도를 더합니다 (임펄스라고 함). 그러나 캐릭터가 항상 중력에 의해 떨어지게합니다.

캐릭터가지면에 닿을 때마다 점프하지 않기를 원한다면-잡고 있기 때문에 jump key- jump key is being pressed해제 후 해제 한 변수를 추가 하십시오 jump key. 의사 코드 :

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

내가 당신의 길을 사용한 경우 :

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

어떻게 donkey.y변경됩니다 당신의 상상력에 달려있다. 벨로 시티는 더 작아 보이도록해야합니다. 당나귀는 공중에 보이게합니다.

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