사이드 스크롤러에서 가변 높이 점프


10

점프 키를 길게 누르면 어떻게 플레이어를 더 높이 뛸 수 있습니까? 나는 키를 누르고 플레이어가 점프하는 한 현재 중력을 줄이고 있지만 이상하게 보입니다.


중력을 얼마나 많이 줄이면 약간의 수정만으로 더 나은 점프 동작을 얻을 수 있습니다.
Ali1S232

@Gajet 그것은 다소 어수선하고 이상한 방법으로 보입니다.
공산주의 오리

흠 중력 감소가 물리 엔진을 사용하고 있다는 의미는 아닙니다. 이 경우입니까? 임펄스를 사용하여 점프하고 있습니까?
Jonathan Connell

물리 엔진이 없으며,
Impulses를

어떤 경우에, 당신은 어떻게 선수가 넘어 지나요? 당신은 운동 * 점프 * 중력 벡터에 따라 그의 위치를 ​​번역합니까?
Jonathan Connell 2016 년

답변:


9

먼저 점프 모양을 결정해야합니다.

실제로, 점프 높이는지면을 떠난 순간에 결정됩니다. 이미 공중에있는 동안 계속 높은 점프를 할 수 없습니다.

이미 공중에있는 동안 점프 높이를 제어 할 수 있다면 일종의 "제트 팩"과 같은 효과를 얻을 수 있습니다.

두 개의 다른 점프 높이를 가진 사이드 스크롤러를 기억하는 것 같습니다. 슈퍼 마리오 게임 중 하나라고 생각합니다. 점프 버튼을 눌렀을 때 더 높은 점프가 일어 났으며, 그 후 점프는 실제로는 일반적인 규칙적인 점프부터 시작하여 두 번째 부분 점프로 이어졌고, 두 번째 임펄스가 더 높아졌습니다.

그래서, 당신은 당신의 점프를 어떻게 보이기를 원하십니까? 플레이어가 점프에 대해 어떤 컨트롤을 원하십니까?

내가 시작할 것입니다 :

중력을 그대로 두십시오 (즉, 절대 변경하지 마십시오). 플레이어가 점프 버튼을 누를 때 플레이어가 점프 버튼을 누르고있는 동안 (최대 시간 제한) 점프 힘을가하십시오. 그런 다음 플레이어가 점프 버튼을 놓으면지면에 먼저 닿을 때까지 점프 점프를 다시 활성화 할 때까지 점프 힘을 다시 적용 할 수 없습니다 (즉, 점프를 다시 시작할 수 없음).


나는 그것을 시도했고, jetpack 효과를 얻습니다. 나는 그것을 피할 방법이 있는지 궁금했습니다.
John Stimac

1
어쩌면 당신이 생각하는 게임은 아니지만 Super Mario 2 에서는 점프하기 전에 약간 오리를 쳐서 뛰어 올랐습니다. 서있는 자세에서 직접하려고해도 크게 뛰지 않기 때문에 어느 정도 직관적 인 의미가 있습니다.
Darien

3
Jcubed : 속도에 힘을 추가하는 대신 위치에 힘을 직접 추가하십시오. 그러면 플레이어는 가속하는 대신 선형 적으로 위로 움직입니다.
Olhovsky

@Jcubed :와 같은 게임 super meat boy을 할 때 원하는 점프 효과가 있다고 생각합니다. 점프 버튼을 누르고있는 동안 캐릭터에 힘이 가해지면 중력과 반대이며 작습니다. 나머지는 alhovsky가 말한 것과 같습니다. 만약 내가 그런 식으로 무언가를 구현한다면 나는 점프력으로서 중력의 60 % -80 %와 같은 것으로 시작할 것입니다.
Ali1S232

1
나는 항상 이것을하고, 당신이 눈에 띄는 제트 팩 효과가 아니도록 버튼을 충분히 짧게 눌러 점프 속도를 설정하는 시간을 유지하십시오. 그러면 몇 가지 마술로 슈퍼 마리오처럼 아주 쉽습니다. 번호 조정. "강제력"을 더 작게 만들지 말고 jumpHigherTime이 만료되거나 플레이어가 버튼을 놓을 때까지 속도를 최대 점프 속도로 재설정하십시오. 또한 플랫폼 점프와 마찬가지로 슈퍼 미트 보이 점프가 부정확하고 성가신 것으로 느낍니다. 그게 단지 물리 엔진에 의존; P
오스카 Duveborn

7

나는 어떤 사람들이 이것을하는 것을 보았습니다.

  1. 변수를 작성하십시오 (이를 호출합니다 jumpTime) (숫자 / 이중 / 부동). 점프 키를 눌렀을 때 jumpTime일부 숫자로 설정하십시오 (예 : 0.5이것은 점프 키를 누르고있는 초 수입니다).

  2. 그런 다음 모든 단계에 대해 속도에 jumpTime다른 숫자 를 곱하여 설정하고 각 단계 사이의 시간 차이로 줄 jumpTime이십시오 delta.

  3. jumpTime플레이어가 점프 키에서 손을 zero 때까지 또는 그 이하 가 될 때까지 반복 하십시오. 그런 다음 일반 물리를 사용하십시오 (플레이어가지면에 도달 할 때까지 일정한 음의 가속도를 적용하십시오).

방법을 모르는 경우 시행 착오를 사용하여 "일부 숫자"에 적합한 값을 찾아야 할 수도 있습니다.


업데이트 : 나는 점프를 좀 더 현실적으로 만드는 트릭을 발견했습니다 (원래는 느리게 진행되지만 빨리 내려 가기 때문에). Infinite Mario는 또한 다음 줄 (JavaScript 버전의 Character.js의 293)을 사용합니다. this.Ya *= 0.85;이것은 단순히 "공기 드래그"와 유사하며 공중에서 문자의 속도를 제한 / 느리게합니다. 따라서 모든 프레임에 y- 속도 (수직 속도)에 1보다 작은 수를 곱하면 뒤로 넘어 질 때 속도가 느려지므로 점프하는 동안 위로 올라가 거나 내려가는 것이 비슷하고 현실적입니다. 알고 있습니다. 설명이 잘못되었습니다 ...

위에서 설명한 방법으로 캐릭터가 점프하면 "상승"보다 "상승"합니다. 그러나 드래그는 수직 속도를 느리게합니다. 수직 속도가 jumpTime모든 프레임에 비례하도록 설정했기 때문에이 드래그는 점프의 전반부에 큰 영향을 미치지 않습니다. 그러나 다음 절반 (하향으로 내려감)에서는 수직 속도가 모든 프레임에 설정되는 것이 아니라 단순히 다른 숫자 (이 경우 중력 상수)로 추가됩니다. 따라서, 드래그는 낙하에 영향을 미치며, 속도가 어느 방향 으로든 감소하기 때문에 낙하를 느리게하여 전반과 유사하게 만듭니다.

캐릭터에 미치는 중력의 영향을 줄이는 것과 같이이 문제를 해결하는 다른 방법이 있습니다. 그러나 중력을 얼마나 줄여야하는지 찾아야합니다.


사례 연구 : 무한 마리오

이것이 내가 찾은 것입니다 (Markus Persson (Notch)의 Mario.java의 206 줄에서).

    if (keys[KEY_JUMP] || (jumpTime < 0 && !onGround && !sliding))
    {
        if (jumpTime < 0)
        {
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            jumpTime++;
        }
        else if (onGround && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = 0;
            yJumpSpeed = -1.9f;
            jumpTime = 7;
            ya = jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;
        }
        else if (sliding && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = -facing * 6.0f;
            yJumpSpeed = -2.0f;
            jumpTime = -6;
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;

            facing = -facing;
        }
        else if (jumpTime > 0)
        {
            xa += xJumpSpeed;
            ya = jumpTime * yJumpSpeed;
            jumpTime--;
        }
    }
    else
    {
        jumpTime = 0;
    }

자바 스크립트 버전은 기본적으로 https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js 와 같습니다.

이것은 Olhovsky의 제안과 유사하지만이 경우 힘은 플레이어가 점프 키를 누른 후 경과 한 시간의 양에 비례합니다.

내 자바 스크립트 버전 :

    if ( onGround && jump && !jumped ) {
        jumpTime = maxJumpTime;
        onGround = false;
        jumped = true;
        this.vel.y = jumpTime * jumpConstant;
        A = true;
    } else if ( !onGround && jump && jumpTime > 0 && !released ) {
        jumpTime -= evt.delta;
        this.vel.y = jumpTime * jumpConstant;
        B = true;
    } else if ( !onGround && ( !jump || jumpTime <= 0 ) ) {
        this.vel.y -= gravityConstant * evt.delta;
        jumpTime = 0
        released = true;
    } if ( this.pos.y < 0 && !A && !B ) {
        onGround = true;
        released = false;
        this.pos.y = 0;
        this.vel.y = 0;
    }
    if ( !jump && onGround ) jumped = false;

그러나 상수에 대한 일부 값 (예 : "gravityConstant"및 "jumpConstant")은 비현실적인 점프를 제공합니다. 그러나 때로는 게임이 현실적이지 않아도됩니다! ( 업데이트 위의 업데이트 섹션을 참조하십시오)

이 질문은 이미 1 년이 넘었지만 도움이되기를 바랍니다.


2

Olhovsky가 말했듯이 점프 높이는 그 이후가 아니라지면을 떠나는 순간 결정됩니다.

jetpack 효과를 피하고 싶다면 두 가지 방법 만 볼 수 있습니다. 높은 키 조합 또는 점프 키의 작동 방식을 근본적으로 변경합니다.

키를 누르는 즉시 플레이어가 점프하게하는 대신 키를 놓을 때까지 점프를 지연시킵니다 . 따라서 기본적으로 키를 누르는 시간은 플레이어의 다리에 스프링 장력이 얼마나 많이 쌓이고 이후에 해제되는지 제어합니다.

물론, 이것은 근본적으로 게임 메커니즘을 변경하며 플레이어에게는 생소 할 수 있습니다. 그러나 그 효과는 매우 흥미로울 수 있으며 익숙하지 않은 가치가 있습니다.


2
나는 그 기계공으로 정확하게 어떤 플랫 포머를 연주 한 것을 기억한다. 캐릭터의 발에 먼지 구름이 자라는 것과 같은 예쁜 애니메이션을 사용하면 직관적으로 느낄 수 있습니다.
Jari Komppa

2

나는 질문에 데이비드 Gouveia의의 대답에 다른 해결책을 발견했습니다 " 어떻게 문자 점프를 만드는 방법을? "

요약:

그의 아이디어는 플레이어가 점프 버튼을 누를 때 속도를 설정하는 것이 었습니다. 모든 프레임에서 중력 만 계산합니다. 그러나 플레이어가 버튼을 놓을 때 속도가 속도보다 크면 속도를 더 작은 값으로 설정합니다. 속도는 각 프레임의 중력에 의해서만 감소합니다.

나는 그의 대답을 훔쳐서는 안되므로 계속 가서 그의 게시물을 읽으십시오. 그의 솔루션은 " 가변 높이 점프 "섹션에 있습니다.

실제로 사람들은이 문제를 해결하기 위해 여러 가지 방법을 고안했습니다 ...

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