Estoy tratando de crear un juego de autos simple con cambios de marcha manuales. Sin embargo, tengo algunos problemas para implementar los cambios de marcha.
Aquí está mi código actual para el "auto":
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
}
}
}
Sin embargo, esta implementación realmente no funciona. La primera marcha funciona bien, pero los siguientes cambios de marcha causan la caída de velocidad. Al agregar algunos mensajes de depuración, obtengo estos valores de velocidad al cambiar en el límite 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 puede ver, la velocidad después de cada cambio es más lenta antes del cambio. ¿Cómo tomaría en cuenta la velocidad antes del cambio de marcha para que la velocidad no disminuya al cambiar de marcha?