Я признаю это. Я математический дурак. я должен пытаться это дома? Вероятно, не без серьезных травм. Тем не мение. Любой, кто имеет небольшой опыт в играх и физике, может пересмотреть этот код и понять, почему в прототипе есть встроенная «потеря» скорости.
концепция: актер падает с неба, в какой-то момент пересекает границу (trampoline.y), после которой гравитация (в данном примере значение 1,6) перестает работать и коэффициент восстановления (в данном случае значение - 6) вступает во владение.
Прямо сейчас я пытаюсь создать ситуацию с нулевой суммой, когда у вас будет та же скорость, что и при прыжке на батуте (hero.y> = trampoline.y). дело, как показывают следы.
Я пробовал около пяти разных подходов, и это последний, учитывая понимание, что при любом «тике» моего игрового таймера (33 мс) мы, возможно, пересекали границу батута, и, таким образом, правила ускорения будут были изменены. Я действительно думал, что у меня это было, но результаты показывают уменьшение скорости после каждого отскока, а это не то, что я ожидал.
Я отправляю следующий код на ваш обзор:
var newV:Number;
if (hero.y < trampoline.y) { newV = hero.velocityY + gravityAccelerationInPixels }
else { newV = hero.velocityY + TrampolineActor.SPRING_ACCELERATION }
var newY:Number = hero.y + newV;
trace("Coming in: y=" + hero.y + " oldVelocity=" + hero.velocityY + " newVelocity=" + newV + " Change in V: " + (newV - hero.velocityY) + ". Testing for newY=" + newY);
if ((hero.y < trampoline.y && newY < trampoline.y) || (hero.y >= trampoline.y && newY >= trampoline.y)) {
hero.y = newY;
hero.velocityY = newV;
} else {
trace("SPLIT");
var percent:Number = (trampoline.y - hero.y) / newV; trace("Percent: " + percent);
var newVV:Number;
if (hero.y < trampoline.y) {
// going down!
newVV = hero.velocityY + percent * gravityAccelerationInPixels; trace("New velocity before split: " + hero.velocityY + " Change in V: " + (newVV - hero.velocityY));
newVV += (1 - percent) * TrampolineActor.SPRING_ACCELERATION; trace("Percent after split: " + (1 - percent) + " Change in V: " + (newVV - hero.velocityY));
} else {
// movin on up!
newVV = hero.velocityY + percent * TrampolineActor.SPRING_ACCELERATION; trace("New velocity before split: " + hero.velocityY + " Change in V: " + (newVV - hero.velocityY));
newVV += (1 - percent) * gravityAccelerationInPixels; trace("Percent after split: " + (1 - percent) + " Change in V: " + (newVV - hero.velocityY));
}
trace("New velocity: " + newVV + " Change in V: " + (newVV - hero.velocityY));
hero.velocityY = newVV;
hero.y += hero.velocityY;
}
Дополнительная информация:
Начало экрана вверху слева, поэтому y-- = выше
Мой тик в настоящее время установлен на 33 мс
gravityAccelerationInPixels в настоящее время 1,62 (разумно произвольно)
SPRING_ACCELERATION произвольно равен 6, но я надеюсь настроить это число, чтобы контролировать, как далеко ниже батута персонаж может пройти во время цикла замедления / поглощения.
Пока что я надеюсь найти решение, в котором скорость тика после того, как персонаж покидает батут, равна (но отрицательна) скорости непосредственно перед входом. Черт, я даже пытался сохранить и получение позиции и скорости входа, но это выглядит как сбой.