Размер перехода с этими уравнениями уменьшается по мере уменьшения количества обновлений в секунду. С дельта-значением, умножающим силу тяжести и величину, на которую сила прыжка уменьшается, а также с добавлением прошедшего времени к дельте на каждой итерации (дельта-значение — это количество миллисекунд, прошедших с момента последнего обновления), можно подумать, что это будет работать нормально.
//d is delta
...
if(isFalling||isJumping){
elapsedTime +=d;
//the elapsed time is the total amount of time passed since one started jumping,
//so that's logical to add the amount of time since last update.
long tesquared = (long) Math.pow(elapsedTime, 2);
//amount of time elapsed squared.
jumpSpeed+=-0.0000005*elapsedTime*d;
//this is the amount that jumpspeed is taken down by every time.
if(jumpSpeed > 0){
isJumping = true;
} else {
isJumping = false;
}
double fGravity = 0.0000001*tesquared*d;
// this is the equation for gravity, the amount that the player goes down
yRend += jumpSpeed - fGravity;
//the amount it goes up, minus the amount it goes down.
xRend -= strafeSpeed;
oldyRend = yRend;
}
Чтобы начать прыжок, нужно добавить jumpSpeed на любую величину.
Проблема в том, что когда количество обновлений в секунду уменьшается, скачки уменьшаются по продолжительности и величине. Я почти уверен, что значения дельты здесь в порядке, а это значит, что проблема должна быть в самих уравнениях.
Я думаю, что fGravity
опережает jumpSpeed
быстрее, когда дельта больше.
Итак, мой вопрос. Если проблема действительно в самих уравнениях, как правильно смоделировать восходящую силу игрока за вычетом нисходящей силы гравитации, отличной от
jumpSpeed+=-0.0000005*elapsedTime*d;
а также
double fGravity = 0.0000001*tesquared*d;
?
Если проблема заключается в неправильном применении дельта-значения, то как правильно его применить?
fGravity
применимо к описанному вами уравнению (поместив его туда, гдеgravity
), или оно также ошибочно? - person GlassZee   schedule 18.11.2012