Estou tentando criar um jogo de carro simples com mudanças manuais de marchas. No entanto, estou com problemas para implementar as mudanças de velocidade.
Aqui está o meu código atual para o "carro":
int gear = 1; // Current gear, initially the 1st
int gearCount = 5; // Total no. of gears
int speed = 0; // Speed (km/h), initially 0
int[] maxSpeedsPerGear = new int[]
{
40, // First gear max. speed at max. RPM
70, // Second gear max. speed at max. RPM
100, // and so on
130,
170
}
int rpm = 0; // Current engine RPM
int maxRPM = 8500; // Max. RPM
public void update(float dt)
{
if(rpm < maxRPM)
{
rpm += 65 / gear; // The higher the gear, the slower the RPM increases
}
speed = (int) ((float)rpm / (float)maxRPM) * (float)maxSpeedsPerGear[gear - 1]);
if(isKeyPressed(Keys.SPACE))
{
if(gear < gearCount)
{
gear++; // Change the gear
rpm -= 3600; // Drop the RPM by a fixed amount
if(rpm < 1500) rpm = 1500; // Just a silly "lower limit" for RPM
}
}
}
No entanto, essa implementação realmente não funciona. A primeira marcha funciona bem, mas as seguintes mudanças de marcha causam queda de velocidade. Ao adicionar algumas mensagens de depuração, obtenho esses valores de velocidade ao alterar no limite de RPM:
Speed at gear 1 before change: 40
Speed after changing from gear 1 to gear 2: 41
Speed at gear 2 before change: 70
Speed after changing from gear 2 to gear 3: 59
Speed at gear 3 before change: 100
Speed after changing from gear 3 to gear 4: 76
Speed at gear 4 before change: 130
Speed after changing from gear 4 to gear 5: 100
Como você pode ver, a velocidade após cada alteração é mais lenta antes da alteração. Como você levaria em consideração a velocidade antes da mudança de marcha, para que a velocidade não caísse ao trocar de marcha?