Вы должны применять строгое разделение задач: 1) упростить кодирование 2) упростить тонкую настройку и даже сделать игру более интересной и 3) легко «подключить» свою логику к другому контроллеру (событие касания вместо клавиатуры).
Таким образом, у вас есть две отдельные задачи:
* измерить, как долго пользователь ускоряется.
* учитывая текущую скорость, минимальную/максимальную скорость, время тяги, решить, каково текущее ускорение (== изменение скорости).
Для 1) это довольно прямолинейно: запишите время начала ввода, теперь продолжительность - это текущее время - время начала. Вам лучше использовать игровое время, если оно у вас есть (а не Date.now()), чтобы избежать неожиданностей после возобновления игры после долгого перерыва.
Для 2) Вы должны точно настроить ускорение / замедление вашей игры, это сделает ее более интересной.
Наиболее очевидным является отсутствие постоянного ускорения: должно быть все труднее и труднее достичь последнего % от максимальной скорости. . Таким образом вы даете и стимул/вознаграждение игроку за то, чтобы он не касался препятствия.
Что делать, если игрок не толкается, я не знаю : медленно тормозить или быстро возвращаться к нормальной скорости ?
Также вы Придется решить, будет ли ускорение бесконечным или нет, и, возможно, время охлаждения.
Таким образом, функция, вычисляющая текущее ускорение, зависит от тяги (bool), времени тяги (double) и RegularSpeed, maxSpeed, minAcc, maxAcc.
Здесь есть много вариантов, но код для вычисления ускорения может выглядеть так:
if (thrusting) {
// if we're not even at regular speed, max acceleration
if (speed<regularSpeed) { acc = maxAcc; return; }
// if we are above maxSpeed, no acceleration (?? or friction ??)
if (speed>maxSpeed) { acc=0; return; }
// compute current speed ratio
// a figure in [0;1] representing where is the speed in [minSpeed; maxSpeed]
var speedRatio = (currSpeed-regularSpeed)/(maxSpeed-regularSpeed);
// ease this ratio as you like
speedRatio = Math.sqrt(speedRatio);
// compute acceleration : the more speed, the less acceleration
// you might want to put one/some threshold this formula.
acc= minAcc + (1-speedRatio)*(maxAcc-minAcc);
return;
} else {
// do nothing if <= regularSpeed.
if (speed<=regularSpeed) { acc=0 ; return;}
// reduce speed if above regular speed
acc = breakAcc ; // or with friction => acc = - k * currSpeed;
return;
}
person
GameAlchemist
schedule
10.10.2014