Tak naprawdę nie podałeś wystarczającej ilości informacji, aby powiedzieć, jaki zakres chcesz, tj. Czy jest on ograniczony, czy chcesz progresję geometryczną itp.
Pierwszą rzeczą, którą chcesz zrobić, jest wyprowadzenie liczby proporcjonalnej do prędkości, którą chcesz stracić (nie musi być taka sama, ale powinna się zmniejszać wraz ze wzrostem prędkości, aby była proporcjonalna do straty). Standardowym sposobem na to jest odwzajemnienie :
temp = 1 / currentVelocity;
Teraz za 100 będziesz mieć 0,01, za 200 będziesz mieć 0,005, za 300 będziesz mieć 0,0033 i tak dalej.
Teraz wystarczy dopasować tę liczbę do tego, czego naprawdę chcesz, mnożąc ją. Więc
k = 3000;
newVelocity = temp * k;
da ci 20 za 300, ale da ci 15 za 200 zamiast 10. To może być dla ciebie w porządku, w takim przypadku nie musisz czytać dalej. Możesz dopasować k, jak chcesz, ale możesz nie otrzymywać liczb tak, jak lubisz, chyba że zrobisz trochę więcej, na przykład zastosujesz postęp geometryczny lub zmienisz podstawę wzrostu. Nie zamierzam wchodzić tutaj w postępy geometryczne, ale jeśli chcesz zmienić bazę, wykonaj następujące czynności:
base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!
k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
velocityLoss = currentVelocity; //(2)
Zapewni to zakres, o który pierwotnie prosiłeś w swoim pytaniu, 300 -> utrata 10, 200 -> utrata 20. FYI 100 -> utrata 40, i 50 -> utrata 80 (!), Co oznacza, że musiałbym ograniczyć odejmowanie - co zrobiłem w wierszach (1) i (2).
Istnieją oczywiście inne sposoby podejścia do tego problemu, które z pewnością napiszą tutaj bardziej biegli matematycznie niż ja.
log(myVelocity + 1) * N
?