NRF SDK 0.9

Lire et agir

Lire un train sans parcourir la carte

Construire un indicateur de vitesse ciblé et comprendre les limites temporelles de sa mesure.

Partir de la question à afficher

Une application JVM déjà connectée peut lire la conduite d’un train avec game.trains.read(TrainId). Cette lecture convient à un compteur de vitesse, une position ou une comparaison avec les capacités du matériel. L’identifiant vient d’une observation de la partie choisie ; un nom de train ne suffit pas à identifier un objet.

BesoinAppelRésultat
Mesure de conduite d’un traingame.trains.read(id)DrivingObservation?
Services, tags ou matériel de plusieurs trainsgame.trains.snapshot(query = ...)Observation
Topologie, occupations et autres tables de cartegame.snapshot(selectedTrain = ...)Observation
Fonction JVM : une mesure, deux vitesses de nature différente
package wiki.targetedtrain

import fr.nimby.sdk.Game
import fr.nimby.sdk.TrainId

data class SpeedSample(
    val train: TrainId,
    val generation: Long,
    val capturedAtMillis: Long,
    val speedKmh: Double?,
    val currentMaximumKmh: Double?,
)

fun readSpeed(game: Game, id: TrainId): SpeedSample? {
    val observation = game.trains.read(id) ?: return null
    val measured = observation.speedMps.takeUnless { observation.speedDefaulted }
    return SpeedSample(
        id, observation.sessionGeneration, observation.capturedAtMillis,
        measured?.times(3.6), observation.currentDynamics?.maxSpeedMps?.times(3.6),
    )
}

readSpeed retourne null si le train n’est pas disponible. Dans une fiche obtenue, speedKmh peut encore être inconnue. currentMaximumKmh est la capacité actuelle du matériel ; ce n’est ni la vitesse mesurée, ni la vitesse autorisée au prochain signal. La multiplication par 3,6 convertit ici les mètres par seconde en kilomètres par heure.

Afficher une donnée datée, pas une certitude permanente

  • null indique une observation absente ou instable. Ne le transformez pas en train arrêté ou supprimé.
  • speedDefaulted indique qu’une vitesse de remplacement a été utilisée. Conservez l’inconnue au lieu d’afficher un zéro certain.
  • elapsedBeginMillis et elapsedEndMillis encadrent la lecture en temps simulé. Le résultat n’est pas une photographie atomique d’un seul tick.
  • capturedAtMillis date la lecture selon l’horloge de l’ordinateur. Il ne mesure ni le retard du train, ni l’heure de la partie.
  • sessionGeneration appartient à la connexion. Effacez les valeurs dérivées à chaque reconnexion et à chaque changement de génération ; comparer seulement le nombre entre deux connexions ne suffit pas.

Rafraîchissez à la fréquence utile à votre écran, avec au plus une lecture en cours par flux. Réutilisez la valeur copiée pour tous ses widgets. Les appels concurrents sur un même Game ne constituent pas une garantie de lecture parallèle ; calculez et formatez les copies hors du chemin de lecture.