Jump to content
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal
  • Who's Online   0 Members, 0 Anonymous, 57 Guests (See full list)

    There are no registered users currently online

  • Recently Browsing   0 members

    No registered users viewing this page.

guda

[LUA] Comment connaitre la distance avec le prochain quai

Recommended Posts

guda    3

Bonjour,

 

Je cherche à récupérer via un script LUA la distance avec la prochaine station dans un scenario.

 

Dans un thread j'ai trouvé ces deux requetes:

SysCall("ScenarioManager:GetNextStoppingPoint")
Call("*:GetControlValue", StoppingPoint,0)

 

Aucune fonctionne.

 

Est-ce que je m'y prend mal ou n'est-ce pas les bonne variable ?

 

Merci pour votre aide

 

PS. Pour info mon code (qui fonctionne avec d'autres variables mais pas celles citées ci-dessus :

	Nom_variable = "GetNextStoppingPoint"
	if Call("*:ControlExists", Nom_variable,0) == 1 then
			my_value = Call("*:GetControlValue", Nom_variable,0)
			sortie = Nom_variable .. ":" .. my_value
	end

Dan

Share this post


Link to post
Share on other sites
juju49    357

Bonsoir,

J'ai retrouvé le sujet en question sur UKTS. ça aurait été plus rapide si tu avais mis un hyperlien dans ton message...
c’était une proposition aux développeurs par quelqu'un qui se croit rusé. :mellow: (il y a des techniques moins sales que ce qu'il veut faire pour obtenir la donnée ce qu'il souhaite avoir.)

Quoi qu'il en soit, ces fonctions:

  • SysCall("ScenarioManager:GetNextStoppingPoint"),
  • Call("*:GetControlValue", StoppingPoint,0),
  • Call("*:GetControlValue", "GetNextStoppingPoint" ,0),

n'existent pas en LUA-TS.

Je cherche à récupérer via un script LUA la distance avec la prochaine station dans un scenario.

Une bonne méthode est de mettre ou d'utiliser un marqueur(s) déjà placé sur la voie. Puis de tester la présence du train du joueur dessus avec une condition. Et enfin de balancer un message( avec HTML si tu veux) avec la distance (qui est connue et/ou mesurable dans TS à pied d'oeuvre) au moment où le train franchi le marqueur.

voilà voilà,
à plus,
Julian M.

Share this post


Link to post
Share on other sites
guda    3

Merci pour ta réponse.

 

Je ne peux pas mettre de marqueurs car mon script doit être générique et s'adapter aux scénarios en cours.

 

Quand tu dis "il y a des techniques moins sales que ce qu'il veut faire pour obtenir la donnée ce qu'il souhaite avoir" à quoi penses-tu ?

 

J'ai essayé avec SPY++ pour trouver le handle correspondant à la distance restante mais Train Simulator ne gere pas les handle Windows

 

Dan

Share this post


Link to post
Share on other sites
juju49    357

Salut,

 

J'ai essayé avec SPY++ pour trouver le handle correspondant à la distance restante mais Train Simulator ne gere pas les handle Windows

Ne fait pas ça: cela pourrais s'apparenter à du rétro-engineering et c'est interdit par l'EULA que tu as validée en installant TS je crois bien!

C'est aussi bien que ça ne marchent pas, ce serait une faille de sécurité IMMENSE dans leur implémentation de LUA...

 

Quand tu dis "il y a des techniques moins sales que ce qu'il veut faire pour obtenir la donnée ce qu'il souhaite avoir" à quoi penses-tu ?

Il cherche à créé l'ERTMS, donc il peut placer des signaux le long de la voie et utiliser une conjonction de:

-- (#noms_entre_croisillons# = nombre) (direction de la recherche + distance max jusqu'où chercher)
type, speed, distance = Call("GetNextSpeedLimit", #direction#, #distance#) 
type, state, distance, aspect = Call("GetNextRestrictiveSignal", #direction#, #distance#)

dans le train et de numéros d'aspect propres à des fonctionnement spécifiques de ses signaux.

 

 

 

Je ne peux pas mettre de marqueurs car mon script doit être générique et s'adapter aux scénarios en cours.

Je croyais tu créais un scénario... ça dépend ce que tu crées en fait. si c'est un objet scripté, un train ou un (simili-)signal.

  • Si c'est un train, la technique du dessus marche, je peux te donner des précision pour ton application dans ce cas.
  • Si c'est un accessoire de type "écran de station avec calcul du temps d'attente", je conseille d'utiliser des relais (signaux qui retransmettent juste l'info + 1) espacés régulièrement qui accumulent les cantons dépassés depuis le prochain train.
  • Si c'est adapté à un itinéraire en particulier, entres les valeurs toi-même dans un fichier .lua et " require 'ma\hierarchie\a_partir\du_dossier_-assets-\de_TS\aa.lua' "-le à partir des autres pour ne pas avoir à actualiser de valeurs entre tes éléments scriptés.

par défaut, cette donnée est considéré comme inutile car elle est donnée dans le HUD de TS!

 

à plus,

Julian M.

Share this post


Link to post
Share on other sites
guda    3

Julian, je vais t'expliquer la finalité :

 

Nous avons conçu une cabine de train à usage des enfants :

Train_petit.jpg

 

Sur la photo les écrans sont factices et nous sommes en train de les développer pour rendre le simu un peu plus réaliste.

 

Nous aimerions nous passer totalement du HUD en créant ce type d'écran

20140930---ERTMS---800x320.jpg

 

Pour aider à la conduite, nous voulons afficher la distance restante vers la prochaine station ainsi qu'un indicateur calculé pour dire si la personne est trop rapide ou trop lente pour entrer convenablement sur le quai.

 

Nous ne créons pas le train (on utilise le BB17000 mais nous évoluerons sans doute un jour vers une autre motrice) et nous utilisons différentes routes. Au pire nous pouvons modifier chaque route en ajoutant des marker mais c'est fastidieux et risque d'être écrasé au prochain update.

 

Dan

 

  • Like 1

Share this post


Link to post
Share on other sites
satnur    131

Salut,

 

C'est un beau projet votre truc... Les enfants doivent adorer !

 

Bonne chance

 

Sat

Share this post


Link to post
Share on other sites
juju49    357

Bonjour,

 

Comme solution de rechange en attendant, il y a le mode "touche F3" du HUD qui peut faire l'affaire. les boutons sont cachés et il n'y reste que le profil de ligne.

 

 

Pour aider à la conduite, nous voulons afficher la distance restante vers la prochaine station ainsi qu'un indicateur calculé pour dire si la personne est trop rapide ou trop lente pour entrer convenablement sur le quai.

 

Nous ne créons pas le train (on utilise le BB17000 mais nous évoluerons sans doute un jour vers une autre motrice) et nous utilisons différentes routes. Au pire nous pouvons modifier chaque route en ajoutant des marker mais c'est fastidieux et risque d'être écrasé au prochain update.

 

Dan

il s'agit d'ajouter des marqueurs dans l'éditeur de scénario pas dans la route en elle même. Ensuite il suffit de faire en sorte qu'ils soit compris dans le trajet du train et de nommer leur 'trigger event' en relation avec les données à afficher comme "Station_3000" pour un quai dans 3000m. Le script de scénario découpe ensuite le nom de l'event pour l'identifier (à gauche du "_") et le paramétrer (à droite du "_"). un condition "A" est ensuite démarrée avec ces paramètres.

Celle-ci peut prendre 2 formes:

- "A" déclenche un DefferedTrigger toutes les 30 secondes (ou moins mais ça bouffe des FPS) et SysCall("PlayerEngine:GetSpeed") prend la vitesse du train pour générer des données d’odométrie de qualité médiocre.

- modifier le script du train et créer un odomètre dans sa fonction update(interval) avec Call("GetSpeed") (en m/s) et entrer le tout dans une control value vérifiée par le script du scénario.

 

le script du scénario connais donc la distance restante grace à une soustraction simple et aussi la vitesse avec SysCall("PlayerEngine:GetSpeed"). Il peut donc au passage calculé la vitesse cible pour tel ou tel distance avant le quai.

 

Pour une sortie vers un écran, un fichier peut être créé et alimenté avec ces valeurs et servir de "pipe" pour une application externe qui sera chragée d'afficher les résultats sur un ou plusieurs écrans.

 

voilà voilà, bonne chance dans votre projet!

 

à plus,

Julian M.

Share this post


Link to post
Share on other sites
guda    3

Merci pour ces détails

 

C'est dommage qu'il n'y ait pas un accès vers cette variable. Cela éviterai de devoir créer une usine à gaz... :(

 

Au lieu de modifier le scenario, je pense que le plus simple serait d'utiliser la variable DistanceTravelled (trouvée dans un thread mais non testée) et d'avoir un fichier d'alimentation contenant les paires . Par exemple :

nom_de_la_station, distance depuis le départ

Munich;0

Starvenghen;8.3

 

Je pourrais ainsi savoir grossièrement l'endroit où se trouve le train (+ prendre en compte s'il recule).

 

Je vous tient au courant

 

Dan

Share this post


Link to post
Share on other sites
juju49    357

Si cette variable existe vraiment, c'est un odomètre parfait! ça correspond à la valeur affichée sur l'écran de débriefing de scénario, c'est bien cela?

 

C'est une bonne idée en tout cas!

 

à plus,

Julian M.

Share this post


Link to post
Share on other sites
guda    3

hélas DistanceTravelled semble liée à certaines locos. En tout cas pas celle que j'utilise.

Share this post


Link to post
Share on other sites

×