¿Cómo puedo implementar Skilling sin conexión?

13

Un ejemplo de habilidad fuera de línea sería EvE Online. Tu personaje (piloto) no gana habilidades al adquirir experiencia. En cambio, tu personaje gana puntos de habilidad hacia una habilidad que estás entrenando ya sea que estés dentro o fuera del juego. Además, estoy bastante seguro de que las habilidades continúan desarrollándose incluso cuando los servidores del juego están inactivos.

Cualquiera tiene una idea general de cómo lo hacen, o mejor aún, cómo podría implementar algo como esto en un juego que estoy desarrollando. No estoy buscando una explicación detallada aquí (sin embargo, no dejes que te detenga), pero estoy buscando una señal que me señale en la dirección correcta.

¡Gracias!

Dream Lane
fuente

Respuestas:

17

Suponiendo que el desarrollo de la habilidad es determinista y bastante lineal, todo lo que necesita hacer es conectarse a algún tipo de reloj en tiempo real (como el reloj del sistema o el reloj del servidor) y calcular cuánto tiempo ha estado en desarrollo la habilidad.

En otras palabras, cuando comience el desarrollo de la habilidad, tome la marca de tiempo y guárdela, y cada vez que desee verificar si la habilidad ha mejorado, compare la marca de tiempo con la actual, verifique si el delta es lo suficientemente grande y bing, el jugador tiene una nueva habilidad.

Jari Komppa
fuente
2
¡De repente tiene sentido por qué te obligan a pausar el entrenamiento si cambias tus atributos que afectan la velocidad del entrenamiento! Porque recalculan el delta necesario ... ¡Impresionante, gracias!
Dream Lane
55
@Dream Lane, para aliviar cualquier posible sobrecarga computacional que esto tenga. Solo recalcula las habilidades / puntos ganados cuando el usuario inicia sesión. Por lo tanto, tener miles de personas desconectadas no incurrirá en gastos generales.
AttackingHobo
2

Si la habilidad no se usará hasta que el jugador vuelva a estar en línea, simplemente puede almacenar el tiempo de cierre de sesión y el tiempo restante en cualquier habilidad en la cola, y luego, cuando el jugador inicie sesión, haga algo como esto:

timeRemaining = currentTime - logoutTime
while ( timeRemaining > 0 and hasQueuedSkill() ) {
     skillTime -= timeRemaining
     if ( skillTime <= 0 ) {
           popSkill()
           timeRemaining = -skillTime
     }
}
Elva
fuente