Стрибки з різною висотою в бічні прокрутки


10

Як я можу змусити гравця стрибнути вище, якщо клавіша стрибка довше утримується? Наразі я просто знижую гравітацію, доки клавіша утримується, а гравець стрибає, але це виглядає дивно.


можливо, лише змінивши, наскільки зменшите гравітацію, ви отримаєте кращі дії стрибка.
Ali1S232

@Gajet Це досить незграбно і здається дивним способом це зробити.
Качка комуністична

Гм, ви говорите, що зниження тяжкості не означає, що ви використовуєте двигун фізики. Це так? Ви використовуєте імпульси для стрибка?
Джонатан Коннелл

Не існує двигуна фізики, і я не використовую «Імпульси»
Джон Стімак

У якому випадку, як ви падаєте гравця? Ви просто перекладаєте його положення відповідно до вектора руху * стрибка * гравітації?
Джонатан Коннелл

Відповіді:


9

Спочатку вам потрібно вирішити, який ви хочете, щоб схожий стрибок.

У реальному житті висота стрибка визначається в той момент, коли ви покинете землю. Ви не можете продовжувати стрибати вище, поки вже перебуваєте в повітрі.

Тож якщо ви зможете керувати висотою стрибка, поки ви вже перебуваєте в повітрі, ви отримаєте якийсь ефект "реактивного пакування".

Я, здається, пам’ятаю боковину, яка мала дві різні висоти стрибка, я думаю, це була одна з ігор супер-маріо. Більш високий стрибок стався, коли ви тримали кнопку стрибка, і тоді стрибок був насправді двосхилим стрибком, починаючи з початкового регулярного стрибка, а потім другого імпульсу, який підняв вас вище.

Отже, як ви хочете, щоб ваш стрибок виглядав? Який тип контролю ви хочете, щоб гравець мав над стрибком?

Я б почав з цього:

Залиште гравітацію в спокої (тобто ніколи її не змінюйте). Коли гравець натискає кнопку стрибка, застосовуйте силу стрибка до тих пір, поки гравець натискає кнопку стрибка (до деякого часового обмеження). Потім, коли гравець відпускає кнопку стрибка, він більше не може застосувати жодну силу стрибка (тобто він не може ініціювати стрибок ще раз), поки спочатку не торкнеться землі, після чого стрибки знову ввімкнуться.


Я спробував це, і я отримую ефект реактивного пакету. Мені було цікаво, чи є такий спосіб уникнути цього.
Джон Стімак

1
Можливо, не гра, яку ви маєте на увазі, але в Super Mario 2 ви підскочили вище, трохи пригнувшись до стрибка. (Що має певний сенс інтуїтивного сенсу, оскільки ви не стрибаєте дуже далеко, якщо намагаєтесь це робити прямо з положення стоячи.)
Дарієн,

3
Jcubed: Замість того, щоб додавати силу до швидкості, спробуйте додати силу безпосередньо до положення. Тоді гравець буде рухатися лінійно вгору, замість того, щоб прискорювати вгору.
Ольховський

@Jcubed: коли ви граєте в такі ігри, як super meat boy, на мою думку, має такий самий ефект стрибка, що і ви хочете, здається, що поки ви тримаєте кнопку стрибка, на персонаж застосовується сила, яка протилежна тяжкості і менша за неї, і відпочинок - це те, що сказав Алховський. якби я реалізував щось подібне, я би почав із чогось схожого на 60% -80% сили тяжіння як стрибучої сили.
Ali1S232

1
Я роблю це весь час, просто тримайте час, протягом якого ви встановлюєте швидкість стрибка вгору, утримуючи кнопку досить короткою, щоб це не було помітно ефект реактивного пакету - тоді це буде як Super Mario досить легко, з кількома магіями кількість налаштувань. Не робіть "сили" меншими, просто продовжуйте скидати швидкість до максимальних стрибків, поки не закінчиться стрибокHigherTime або гравець відпустить кнопку ... Крім того, я відчуваю, що хлопці супер м'яса стрибають, щоб бути неточними і дратівливими, як і будь-яка стрибка на платформі що покладається лише на двигун фізики; p
Оскар Дювеборн

7

Я бачив, як деякі люди роблять це:

  1. Створіть змінну (я її назву jumpTime) (число / подвійний / плаваючий). Якщо натиснути клавішу стрибка, встановіть jumpTimeдеяку кількість (тобто 0.5це буде кількість секунд, на яку вплине утримування клавіші стрибка).

  2. Потім для кожного кроку встановіть швидкість, jumpTimeпомножену на деяке інше число, і зменшіть jumpTimeна delta(різниця в часі між кожним кроком).

  3. Повторіть це, поки не jumpTimeдосягне нуля або нижче, або коли гравець відпустить клавішу стрибка. Після того, як це станеться, використовуйте звичайну фізику (застосовуйте постійне негативне прискорення, поки гравець не досягне землі).

Можливо, вам доведеться використовувати пробну помилку та помилку (або "логічне відгадування"), щоб знайти відповідні значення для тих "певних цифр", якщо ви не знаєте, як це зробити.


ОНОВЛЕННЯ: Я знайшов трюк, який робить стрибок трохи реалістичнішим (оскільки він спочатку повільний, але потім швидкий вниз). Нескінченний Маріо також використовує наступний рядок (293 з Character.js версії JavaScript) ... this.Ya *= 0.85;Це просто як "повітряне перетягування" і обмежує / уповільнює швидкість персонажа, коли знаходиться в повітрі. Таким чином, кожен кадр помножте y-швидкість (вертикальну швидкість) на число менше одиниці, щоб він сповільнився при падінні назад вниз (а отже, і рух вгору, і спуск вниз під час стрибка будуть схожими і реалістичнішими). Я знаю, я погано пояснюю ...

Коли персонаж стрибає за допомогою методу, який я спочатку описав вище, він «піднімається вгору» швидше, ніж «опускається назад вниз». Проте перетягування сповільнює вертикальну швидкість. Оскільки ми встановлюємо вертикальну швидкість, пропорційну jumpTimeкожному кадру, це перетягування не має особливого впливу на першу половину стрибка. Однак у наступній половині (опускаючись назад) вертикальна швидкість задається не кожному кадру, а просто додається іншим числом (у цьому випадку це гравітаційна константа). Тому перетягування спрацьовує при падінні, а оскільки зменшує швидкість (у будь-якому напрямку), він уповільнює падіння, роблячи його подібним до першого тайму.

Однак є й інші способи вирішити цю проблему, як зменшення впливу сили тяжіння на характер у міру падіння. Однак нам потрібно знайти, наскільки нам слід зменшити тяжкість.


Приклад: Нескінченний Маріо

Це те, що я знайшов (з рядка 206 від Mario.java від Маркуса Перссона (Notch)):

    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;
    }

Версія javascript в основному однакова https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js

Це схоже на пропозицію Ольховського, але в цьому випадку сила буде пропорційною кількості часу, який пройшов після того, як гравець натиснув клавішу стрибка.

Моя версія javascript:

    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") дадуть нереальний стрибок. Але іноді ігри не повинні бути реалістичними! ( оновлення див. розділ оновлення вище)

Це питання вже більше року, але я сподіваюся, що це допомагає!


2

Як сказав Олховський, висота стрибка визначається в той момент, коли ви покинете землю, а не після цього.

Якщо ви дійсно хочете уникнути ефекту реактивного пакету, я бачу лише два способи: комбінація клавіш, щоб перейти вище, або принципово змінити спосіб роботи клавіші стрибка:

Замість того, щоб змусити гравця стрибати, як тільки натискається клавіша, затримуйте стрибок, поки клавіша не буде відпущена . Отже, в основному тривалість натискання клавіш контролює, наскільки пружинний натяг в ногах гравця накопичений і згодом відпущений.

Звичайно, це принципово змінює ігрову механіку і може бути незнайомим для гравця. Але ефект може бути досить цікавим і, можливо, вартий незнайомості.


2
Я думаю, що я пам’ятаю, що грав у якогось платформера саме з таким механіком - не залишай землі, поки ти не «зарядиш» стрибок. За допомогою певної анімації (наприклад, хмара пилу, що росте біля ніг персонажа), це можна зробити, щоб відчути інтуїтивність.
Jari Komppa

2

Я знайшов інше рішення у відповіді Девіда Гувейя на питання " Як змусити стрибнути характер? "

Підсумок:

Його ідея полягала у встановленні швидкості, коли гравець натискає кнопку стрибка. У кожному кадрі він обчислює лише гравітацію. Однак, коли гравець відпускає кнопку, вона встановлює швидкість меншим значенням, якщо швидкість більша за неї. Швидкість лише зменшується силами тяжіння кожного кадру.

Я не повинен красти його відповідь, тож продовжуйте читати його пост. Його рішення знаходиться під " Перемінний перехід по висоті ".

Тож справді люди придумали багато різних способів вирішити цю проблему ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.