Исчисление?Нужна помощь в поиске переменной, зависящей от времени, с учетом некоторых других переменных - PullRequest
7 голосов
/ 21 декабря 2010

Короче говоря, я делаю платформенную игру. Я еще не достаточно взрослый, чтобы принять Calculus, поэтому я не знаю производных или интегралов, но знаю о них. Желаемое поведение для моего персонажа - автоматически прыгать, когда по обе стороны от него находится блок, который выше того, на котором он стоит; например, лестница. Таким образом, игрок может просто удерживать левую / правую, чтобы подняться по лестнице, вместо того, чтобы спамить спам тоже клавишей.

Проблема в том, как я реализовал прыжки; Я решил пойти в стиле марио и позволить игроку дольше удерживать «прыжок», чтобы прыгать выше. Для этого у меня есть переменная «jump», которая добавляется к скорости Y игрока. Переменная прыжка увеличивается до установленного значения при нажатии клавиши «прыжок» и уменьшается очень быстро после отпускания клавиши «прыжок», но уменьшается не так быстро, пока вы удерживаете клавишу «прыжок», обеспечивая непрерывное ускорение до тех пор, пока вы держите «прыгать». Это также создает приятный плавный прыжок, а не резкое визуальное ускорение.

Итак, чтобы учесть переменную высоту лестницы, я хочу иметь возможность точно рассчитать, какое значение должна получить переменная 'jump', чтобы точно перейти на высоту лестницы; желательно не больше, не меньше, хотя немного больше допустимо. Таким образом, персонаж может прыгать по крутым или неглубоким лестничным пролетам, при этом он не выглядит странно или медленно.

По сути, в игре 5 переменных:

h -the height the character needs to jump to reach the stair top<br>
j -the jump acceleration variable<br>
v -the vertical velocity of the character<br>
p -the vertical position of the character<br>
d -initial vertical position of the player minus final position<br>

Each timestep:<br>
j -= 1.5;          //the jump variable's deceleration<br>
v -= j;            //the jump value's influence on vertical speed<br>
v *= 0.95;         //friction on the vertical speed<br>
v += 1;            //gravity<br>
p += v;            //add the vertical speed to the vertical position<br>

v-initial is known to be zero<br>
v-final is known to be zero<br>
p-initial is known<br>
p-final is known<br>
d is known to be p-initial minus p-final<br>
j-final is known to be zero<br>

j-initial is unknown<br>

Учитывая все эти факты, как я могу составить уравнение, которое решит для j?

tl; dr Как мне вычислить?

Огромное спасибо всем, кто сделал это так далеко и решил решить эту проблему.

Редактировать: вот график, который я сделал на примере в Excel. alt text

Я хочу уравнение, которое позволит мне найти значение для A, учитывая желаемое значение для B. Поскольку переменная прыжка со временем уменьшается, значение позиции - это не просто парабола.

Ответы [ 3 ]

1 голос
/ 22 декабря 2010

Если я пренебрегаю членом трения и предполагаю, что j достигает нуля до того, как v достигает нуля, я получаю после страницы вычислений, что:

b = 1/(8*(deceleration^2)*gravity)*j0^4 - 1/(6*deceleration^2)*j0^3

решение этого вопроса довольно длинное, но примерно равно(для 10 j0 = (10*(deceleration^2)*gravity*b)^0.25

1 голос
/ 23 декабря 2010

После широкого использования Excel 2010 и его функции поиска цели мне удалось составить таблицу значений, и Excel дал мне приблизительную линию тренда и уравнение для нее, которую я настраивал, пока она не сработала. Уравнение имеет вид j = 3,35 * h ^ 0,196, где j - начальная сила прыжка, а h - высота, необходимая для прыжка. Спасибо за вашу помощь.

1 голос
/ 22 декабря 2010

Здесь есть две трудности.Во-первых, у вас на самом деле нет j -= 1.5, у вас есть j = max(0, j - 1.5).Это бросает какой-то рывок в расчеты.Кроме того, ваш коэффициент трения v *= 0.95 затрудняет прямое решение.

Я бы предложил использовать для этого справочную таблицу.Вы можете предварительно рассчитать желаемое значение a для каждого возможного b методом проб и ошибок (например, двоичный поиск по значениям a, которые дают требуемые значения b).Сохраните результаты в таблице и просто выполните простой поиск таблицы во время игры.

...