Vous n'avez pas vraiment donné suffisamment d'informations pour dire quel type de plage vous voulez, c'est-à-dire s'il est plafonné, si vous voulez une progression géométrique, etc.
La première chose que vous voulez faire est de dériver un nombre proportionnel à la quantité de vitesse que vous voulez perdre (il ne doit pas nécessairement être le même, mais il devrait diminuer à mesure que la vitesse augmente pour le rendre proportionnel à votre perte). La manière standard de le faire est de prendre la réciproque :
temp = 1 / currentVelocity;
Maintenant, pour 100, vous aurez 0,01, pour 200, vous aurez 0,005, pour 300, vous aurez 0,0033 et ainsi de suite.
Maintenant, il vous suffit d'ajuster ce nombre à tout ce que vous voulez vraiment, en le multipliant. Donc
k = 3000;
newVelocity = temp * k;
vous donnera votre 20 pour 300, mais il vous en donnera 15 pour 200 plutôt que 10. Cela peut vous convenir, dans ce cas, vous n'avez pas besoin de lire plus loin. Vous pouvez ajuster k comme vous le souhaitez, mais vous n'obtiendrez peut-être pas les chiffres comme vous les aimez, sauf si vous en faites un peu plus, comme implémenter la progression géométrique ou modifier la base pour augmenter. Je ne vais pas entrer ici dans les progressions géométriques, mais si vous voulez changer la base, vous le faites comme suit:
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)
Cela vous fournira la plage que vous aviez initialement demandée dans votre question, 300 -> perte de 10, 200 -> perte de 20. Pour info 100 -> perte de 40 et 50 -> perte de 80 (!) Ce qui signifie que vous aurais besoin de restreindre votre soustraction - ce que j'ai fait dans les lignes (1) et (2).
Il y a bien sûr d'autres façons d'aborder ce problème, que je suis sûr que ceux qui sont plus habiles mathématiquement que moi publieront ici.
log(myVelocity + 1) * N
?