Як я можу змусити гравця стрибнути вище, якщо клавіша стрибка довше утримується? Наразі я просто знижую гравітацію, доки клавіша утримується, а гравець стрибає, але це виглядає дивно.
Як я можу змусити гравця стрибнути вище, якщо клавіша стрибка довше утримується? Наразі я просто знижую гравітацію, доки клавіша утримується, а гравець стрибає, але це виглядає дивно.
Відповіді:
Спочатку вам потрібно вирішити, який ви хочете, щоб схожий стрибок.
У реальному житті висота стрибка визначається в той момент, коли ви покинете землю. Ви не можете продовжувати стрибати вище, поки вже перебуваєте в повітрі.
Тож якщо ви зможете керувати висотою стрибка, поки ви вже перебуваєте в повітрі, ви отримаєте якийсь ефект "реактивного пакування".
Я, здається, пам’ятаю боковину, яка мала дві різні висоти стрибка, я думаю, це була одна з ігор супер-маріо. Більш високий стрибок стався, коли ви тримали кнопку стрибка, і тоді стрибок був насправді двосхилим стрибком, починаючи з початкового регулярного стрибка, а потім другого імпульсу, який підняв вас вище.
Отже, як ви хочете, щоб ваш стрибок виглядав? Який тип контролю ви хочете, щоб гравець мав над стрибком?
Я б почав з цього:
Залиште гравітацію в спокої (тобто ніколи її не змінюйте). Коли гравець натискає кнопку стрибка, застосовуйте силу стрибка до тих пір, поки гравець натискає кнопку стрибка (до деякого часового обмеження). Потім, коли гравець відпускає кнопку стрибка, він більше не може застосувати жодну силу стрибка (тобто він не може ініціювати стрибок ще раз), поки спочатку не торкнеться землі, після чого стрибки знову ввімкнуться.
super meat boy
, на мою думку, має такий самий ефект стрибка, що і ви хочете, здається, що поки ви тримаєте кнопку стрибка, на персонаж застосовується сила, яка протилежна тяжкості і менша за неї, і відпочинок - це те, що сказав Алховський. якби я реалізував щось подібне, я би почав із чогось схожого на 60% -80% сили тяжіння як стрибучої сили.
Я бачив, як деякі люди роблять це:
Створіть змінну (я її назву jumpTime
) (число / подвійний / плаваючий). Якщо натиснути клавішу стрибка, встановіть jumpTime
деяку кількість (тобто 0.5
це буде кількість секунд, на яку вплине утримування клавіші стрибка).
Потім для кожного кроку встановіть швидкість, jumpTime
помножену на деяке інше число, і зменшіть jumpTime
на delta
(різниця в часі між кожним кроком).
Повторіть це, поки не 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
Це схоже на пропозицію Ольховського, але в цьому випадку сила буде пропорційною кількості часу, який пройшов після того, як гравець натиснув клавішу стрибка.
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") дадуть нереальний стрибок. Але іноді ігри не повинні бути реалістичними! ( оновлення див. розділ оновлення вище)
Це питання вже більше року, але я сподіваюся, що це допомагає!
Як сказав Олховський, висота стрибка визначається в той момент, коли ви покинете землю, а не після цього.
Якщо ви дійсно хочете уникнути ефекту реактивного пакету, я бачу лише два способи: комбінація клавіш, щоб перейти вище, або принципово змінити спосіб роботи клавіші стрибка:
Замість того, щоб змусити гравця стрибати, як тільки натискається клавіша, затримуйте стрибок, поки клавіша не буде відпущена . Отже, в основному тривалість натискання клавіш контролює, наскільки пружинний натяг в ногах гравця накопичений і згодом відпущений.
Звичайно, це принципово змінює ігрову механіку і може бути незнайомим для гравця. Але ефект може бути досить цікавим і, можливо, вартий незнайомості.
Я знайшов інше рішення у відповіді Девіда Гувейя на питання " Як змусити стрибнути характер? "
Його ідея полягала у встановленні швидкості, коли гравець натискає кнопку стрибка. У кожному кадрі він обчислює лише гравітацію. Однак, коли гравець відпускає кнопку, вона встановлює швидкість меншим значенням, якщо швидкість більша за неї. Швидкість лише зменшується силами тяжіння кожного кадру.
Я не повинен красти його відповідь, тож продовжуйте читати його пост. Його рішення знаходиться під " Перемінний перехід по висоті ".
Тож справді люди придумали багато різних способів вирішити цю проблему ...
http://excitemike.com/JumpingControlTester (ілюструє різні механізми стрибків у різних іграх)
http://meyermike.com/wp/?p=175 (також обговорюється шлях стрибка Маріо)
http://www.flatredball.com/frb/docs/index.php?title=Tutorials:Platforer:Variable-Height_Jumps (описує 3 різні методи)
можливо більше (не пройшли занадто багато результатів пошуку, але гуглінг "змінної висоти стрибка" допомагає)