Développement pour OpenBVE
0 - Tutoriel Route
1 - L'Objet csv
2 - L'Objet X
3 - L'Objet Animated
4 - La Route csv
5 - La Route rw
6 - Le Fichier train.dat
7 - Le Fichier extensions.cfg
8 - Le Fichier panel.cfg
9 - Le Fichier panel2.cfg
10 - Le Fichier panel.animated

Contenus

1. Aperçu général
2. Sections
3. Liste des opérateurs de notation infix (insérer)
4. Liste des fonctions
5. Liste des variables
6. Performance
7. Conseils
8. Exemple de fonctions


1. Aperçu général

Le format d'objet ANIMATED est un format de contenant qui vous permet de référencer d'autres objets (B3D/CSV/X) et de leur appliquer une animation. Il permet aussi de juste grouper d'autres objets (y compris d'autres objets ANIMATED) sans les animer.

Les objets animés peuvent être utilisés dans les routes CSV/RW (à moins qu'explicitement non admise par quelques commandes), comme les objets d'extérieur de train via extensions.cfg, ainsi que les cabines 3D via le fichier panel.animated.

● Principes fondamentaux

L'animation est exécutée via les primitives suivantes :
● State changes – de base permettre de changer différents objets à tout moment
● Translation – déplace les objets dans trois directions indépendantes
● Rotation – rotation d'objets autour de trois axes indépendantes
● Texture shifts - permettre de changer les coordonnées de texture d'objets dans deux directions indépendantes

● Une petite formalité

Le fichier est un fichier texte simple codé dans un codage arbitraire, cependant, UTF-8 avec une marque d'ordre des octets est le choix de préférence. Le modèle d'analyse pour les nombres est Strict. Le nom du fichier est arbitraire, mais doit avoir l'extension .animated. Le fichier est interprété sur une base de ligne par ligne, du début à la fin.


2. Sections

● La section [Include]

Vous pouvez utiliser la section [Include] juste pour inclure d'autres objets, mais sans les animer. Ceci vous permet d'utiliser le fichier d'objet ANIMATED comme un container pour grouper d'autres objets. Il peut y avoir n'importe quel nombre de section [Include] dans le fichier.

[Include]
Début de la section.

FileName0
FileName1
FileName2
...

Définit une série d'objets B3D/CSV/X/ANIMATED qui seront inclus comme ils sont.

Position = X, Y, Z
Définit la position des objets, vous permettant essentiellement de les décaler par rapport au reste du fichier d'objet ANIMATED.

● La section [Object]

Vous pouvez utiliser la section [Object] pour créer une animation seule. Ce qui exige d'établir au moins un état via le paramètre States , et d'utiliser n'importe quelle combinaison de fonctions que vous voulez, qui fournit un contrôle sur l'animation Il peut y avoir n'importe quel nombre de section [Object] dans le fichier.

[Object]
Début de la section.

Position = X, Y, Z
Définit la position de l'objet. Ce qui corresponds essentiellement à la commande TranslateAll à la fin du fichier respectif CSV/B3D, mais est exécuté après que n'importe laquel des fonctions soient exécutés. Par exemple, si vous voulez utiliser la rotation, garder présent à l'esprit que la rotation se fait autour de l'origine (0,0,0). La commande Position vous permet de repositionner l'objet après que la rotation soit exécutée.

States = File0, File1, ..., Filen-1
Charge les n objets d'extension CSV/B3D/X. S'il vous plaît notez que le premier fichier indiqué a l'état d'index 0. Utilisé plusieurs fichier si vous voulez utiliser un changement d'état.

StateFunction = Formula
Définit la fonction pour les changements d'état. Le résultat de Formula est arrondi vers le nombre entier le plus proche. Si ce nombre entier est entre 0 et n-1, où n est le nombre d'états défini via States, l'état respectif est montré, autrement, aucun objet n'est montré. Vous pouvez utiliser le dernier si vous voulez un objet pour basculer sur on/off avec seulement un état.

TranslateXDirection = X, Y, Z
TranslateYDirection = X, Y, Z
TranslateZDirection = X, Y, Z
Cela définit les directions pour respectivement TranslateXFunction, TranslateYFunction et TranslateZFunction. Les directions par défaut sont :

TranslateXDirection = 1, 0, 0
TranslateYDirection = 0, 1, 0
TranslateZDirection = 0, 0, 1

Cela signifie que TranslateXFunction déplacera par défaut vers la droite, TranslateYFunction vers le haut et TranslateZFunction vers l'avant, c'est aussi pourquoi TranslateXFunction et les suivant portent leurs noms. Si vous définissez d'autres directions, alors pensez simplement aux trois fonctions et directions associées comme trois façons indépendantes de déplacer l'objet dans chaque direction.

TranslateXFunction = Formula
TranslateYFunction = Formula
TranslateZFunction = Formula
Cela définit les fonctions pour déplacer l'objet dans la direction respective. La Formule a besoin de retourner la quantité de mètres pour se déplacer de la position initiale. les paramètres X, Y et Z dans leur direction respective sont multipliés par le résultat de la Formule, donc vous pouvez par exemple multiplier la formule par 2 ou la direction par 2 si vous voulez doubler la vitesse de mouvement.

RotateXDirection = X, Y, Z
RotateYDirection = X, Y, Z
RotateZDirection = X, Y, Z
Cela définit les directions pour respectivement RotateXFunction, RotateYFunction et RotateZFunction. Les directions par défaut sont:

RotateXDirection = 1, 0, 0
RotateYDirection = 0, 1, 0
RotateZDirection = 0, 0, 1

Cela signifie que RotateXFunction tournera par défaut autour de l'axe X, RotateYFunction autour de l'axe Y, et RotateZFunction autour de l'axe Z, c'est aussi pourquoi RotateXFunction et les suivant portent leurs noms. Si vous définissez d'autres directions, alors pensez simplement aux trois fonctions et directions associées comme trois façons indépendantes de tourner l'objet.

RotateXFunction = Formula
RotateYFunction = Formula
RotateZFunction = Formula
Cela définit les fonctions une rotation le long des directions respectives dans le sens inverse des aiguilles d'une montre. La Formule a besoin de retourner l'angle de la rotation en radians. L'ordre dans lequel les rotations sont exécutées sont : RotateXFunction (premier), RotateYFunction (second) et RotateZFunction (dernier). Si vous utilisez plus d'une fonction de rotation, garder cet ordre à l'esprit. Si nécessaire, superposer les directions par défaut des rotations si vous avez besoin d'un ordre différent.

RotateXDamping = NaturalFrequency, DampingRatio
RotateYDamping = NaturalFrequency, DampingRatio
RotateZDamping = NaturalFrequency, DampingRatio
Cela définit l'amortissement pour les fonctions correspondantes. Si n'est pas utilisé, l'amortissement ne sera pas exécuté. NaturalFrequency est une valeur positive correspondant à la fréquence angulaire pour un oscillateur assumé non amortie en radians par second. DampingRatio est une valeur positive indiquant le type d’amortissement. Les valeur entre 0 et 1 représentent un sous amortissement, 1 représente un amortissement critique, et les valeurs au dessus de 1 représentent un sur amortissement.

TextureShiftXDirection = X, Y
TextureShiftYDirection = X, Y
Cela définit les directions pour TextureShiftXFunction et TextureShiftYFunction, respectivement. Les directions par défaut sont :

TextureShiftXDirection = 1, 0
TextureShiftYDirection = 0, 1

Cela signifie que TextureShiftXFunction changera la texture par défaut à droite, et TextureShiftYFunction en bas, c'est aussi pourquoi TextureShiftXFunction et le suivant portent leurs noms. Si vous définissez d'autres directions, alors pensez simplement aux deux, fonctions et directions associées, comme deux façons indépendantes de changer les textures des objets.

TextureShiftXFunction = Formula
TextureShiftYFunction = Formula
Cela définit les fonctions pour changer la texture dans la direction respective. La texture est décalé de la valeur retourné par la Formule des coordonnées de la texture. La partie de nombre entier du résultat est ignoré, et une fraction de 0,5 représente le déplacement à mi-chemin de la texture. Les commandes SetTextureCoordinate dans le fichier objet définissent les coordonnées, qui sont ensuite ajoutés à l'issue de ces formules.

TextureOverride = Value
Value = Timetable : Toutes les faces montrerons le fichier bipmap timetable comme défini par les routes CSV/RW.
Value = None : Les textures originales seront affichées sur les faces (comportement par défaut).

RefreshRate = Seconds
Cela définit la quantité minimum de temps passer avant que les fonctions soient mises à jour. Une valeur de 0 forces les fonctions à se mettre à jour dans chaque cadre. S'il vous plaît notez que les objets hors du champ visuel pourraient être mis à jour moins fréquemment sans tenir compte de ce paramètre. Utilisez RefreshRate quand vous n'avez pas besoin d'une animation parfaitement lisse (pour optimiser les performances), ou quand vous voulez directement que l'objet soit mis à jour seulement dans des intervalles fixes.

Note de compatibilité pour openBVE 2 :
Durant le développement d'openBVE (v0.9) et durant le développement du format animated object, il y avait certaines commandes en fin d’existence avec RPN, comme TranslateXFunctionRPN. Ces commandes n'ont jamais été inséré dans la version officielle (v1.0) et n'étaient donc jamais destiné à être utilisé en dehors d'environnements de développement. Alors qu'elles sont encore disponibles mais non documenté, elles seront supprimé de la version openBVE 2. Si vous utilisez ces commandes, s'il vous plaît débarrasser vous d'elles dès que possible.

● A propos des formules

Tout d'abord, la notation infixe, qui est ce que vous pouvez entrer pour Formula, est convertie en notation fonctionnelle. Ainsi, pour chaque notation infixe, il existe une notation fonctionnelle correspondante. Certaines fonctions n'ont pas un opérateur infixe et ne peut donc être entrés en notation fonctionnelle. Pour les opérateurs, la priorité joue un rôle important. Vous pouvez utiliser des parenthèses pour modifier l'ordre de préséance comme dans n'importe quelle formule mathématique habituelle. Les noms des fonctions sont insensibles à la casse.

S'il vous plaît noter que si le résultat de toute opération mathématique ou d'une fonction soit infini, indéterminé ou non réel, zéro sera renvoyé. Le débordement numérique n'est pas empêchée, vous devez donc en tenir compte vous-même.


3. Liste des opérateurs de notation infix

● Arithmétique de base

Infix Fonctionnelle Description
a + b Plus[a,b, ...] Représente une addition
a - b Subtract[a,b] Représente une soustraction
- a Minus[a] Rend négatif le nombre
a * b Times[a,b,...] Représente une multiplication
a / b Divide[a,b] Représente une division

● Comparaisons

Toutes les comparaisons retournent 1 pour vrai et 0 pour faux.

Infix Fonctionnelle Description
a == b Equal[a,b] Vrai (1) si a égal b
a != b Unequal[a,b] Vrai (1) si a est différent de b
a < b Less[a,b] Vrai (1) si a est plus petit que b
a > b Greater[a,b] Vrai (1) si a est plus grand que b
a <= b LessEqual[a,b] Vrai (1) si a est plus petit ou égal à b
a >= b GreaterEqual[a,b] Vrai (1) si a est plus grand ou égal à b

● Les opérations logiques

Toutes les opérations de traitement de valeur 0 sont faux et toutes les autres sont vrai, et retourne 1 pour vraie et 0 pour faux.

Infix Fonctionnelle Description
!a Not[a] Vrai (1) si a est faux
a & b And[a,b] Vrai (1) si a et b sont vrais
a | b Or[a,b] Vrai (1) si chacun d'eux a ou b sont vrai
a ^ b Xor[a,b] True (1) si l'un d'eux a ou b est vrai

● La priorité des opérateurs

Du plus prioritaire au moins prioritaire. Les opérateurs de même priorité sont évalués de gauche à droite dans l'ordre qu'ils se présentent dans la formule.

- (Moins)
/
*
+, - (Soustraction)
==, !=, <, >, <=, >=
!
&
^
|

S'il vous plaît noter que certaines combinaisons d'opérateurs de préfixe et infix ne sont pas reconnus. Par exemple a*-b n'est pas acceptée. Utilisez a*(-b) ou -a*b à la place.


4. Liste des fonctions

● Arithmétique de base

Fonction Description
Reciprocal[x] Retourne le réciproque, égal à 1/x
Power[a,b,...] Retourne a élevé à la puissance bth. b doit être un nombre non-négatif. Par souci de cohérence, Power[0,b] renvoie toujours 1, même dans le cas détérioré Power[0,0], et a étant négatif retourne toujours 0.

● Fonctions numériques

Fonction Description
Quotient[a,b] Divise a par b et arrondit le résultat vers le bas, égal à Floor[a/b].
Mod[a,b] Retourne le reste de la division de a par b, égal à a-b*Floor[a/b].
Min[a,b,...] Retourne le plus petit de ces termes.
Max[a,b,...] Retourne le plus grand de ces termes.
Abs[x] Retourne la valeur absolue.
Sign[x] Retourne le signe de x, qui est soit -1, 0 ou 1.
Floor[x] Arrondit vers le bas à l'entier le plus proche.
Ceiling[x] Arrondit vers le haut à l'entier le plus proche.
Round[x] Arrondit à l'entier le plus proche. Numéros se terminant par 0,5 est arrondi au même nombre entier.

● Fonctions élémentaires

Fonction Description
Exp[x] La fonction exponentielle, ou e à la puissance xth.
Log[x] Le logarithme naturel, à base e.
Sqrt[x] La racine carrée.
Sin[x] Le sinus (entrée en radians).
Cos[x] Le cosinus ( entrée en radians).
Tan[x] La tangente ( entrée en radians).
ArcTan[x] La tangente inverse (sortie en radians).

● Conditions

Fonction Description
If[cond,truevalue,falsevalue] Si cond est != 0, retourne truevalue, autrement falsevalue.


5. Liste des variables

● Primitives

Variable Description
value La valeur retournée par la fonction dans la dernière évaluation. Au début de la simulation, il s'agit de 0.
delta La différence de temps depuis la dernière évaluation de la fonction en secondes. S'il vous plaît noter qu'il n'y a aucune garantie du temps qui s'écoule entre les appels successifs des fonctions.

● Temps et camera

Variable Description
time Le temps courant dans le jeu mesuré en secondes depuis minuit du premier jour.
cameraDistance La distance cartésienne non-négative mesurée de l'objet à la caméra en mètres.

● Trains

Généralement, les objets attachés à un train et voiture particulière retourne des valeurs pour ce train et cette voiture, sauf indication contraire. Pour les objets du paysage, la référence est la voiture du conducteur du train le plus proche (pas nécessairement le train du joueur).

Dans certaines des variables suivantes, carIndex a la signification suivante : 0 est la 1st voiture de devant, 1 est la 2nd voiture de devant, etc., alors que -1 est la 1st voiture de derrière, -2 est la 2nd voiture de derrière, etc. En général, l'indice de voiture de -cars à cars-1 représente des voitures existantes, ou cars est le nombre de voitures du train, tandis que les valeurs en dehors de cette plage représente les voitures inexistantes. Comme tous les trains ont au moins 1 voiture, les indices -1 et 0 sont garantis d'exister pour chaque trains.

● Trains (général)

Variable Description
cars Le nombre de voitures du train.
speed La vitesse réelle signalé de la voiture courante en m/s. Est positive lorsque le train se déplace vers l'avant, et négative lorsque le train se déplace vers l'arrière.
speed[carIndex] La vitesse réelle signalé de la voiture carIndex en m/s. Est positive lorsque le train se déplace vers l'avant, et négative lorsque le train se déplace vers l'arrière.
speedometer La vitesse signalée perçue de la voiture courante en m/s comme elle apparaîtrait sur un compteur de vitesse entre le patinage et le blocage des roues.
speedometer[carIndex] La vitesse signalée perçue de la voiture carIndex en m/s comme elle apparaîtrait sur un compteur de vitesse entre le patinage et le blocage des roues.
acceleration L’accélération réelle de la voiture courante en m/s².
acceleration[carIndex] L’accélération réelle de la voiture carIndex en m/s².
accelerationMotor L'accélération que le moteur de la première voiture motorisée génère actuellement en m/s².
accelerationMotor[carIndex] L'accélération que le moteur de la voiture carIndex génère actuellement en m/s².
distance La distance cartésienne non-négative mesurée de l'objet à la voiture la plus proche en mètres. Seulement significatif pour les objets du paysage.
distance[carIndex] La distance cartésienne non-négative mesurée de l'objet à la voiture carIndex en mètres, ou 0 si la voiture n'existe pas. Seulement significatif pour les objets du paysage.
trackDistance La distance de la voie signalé mesuré de l'objet à l'extrémité la plus proche du train en mètres. Est positive quand le train est devant l'objet, négative quand il est derrière, et zéro quand l'objet se trouve entre les extrémités du train. Seulement significatif pour les objets du paysage.
trackDistance[carIndex] La distance de la voie signalé mesuré de l'objet à la voiture carIndex en mètres. Est positif lorsque le centre de la voiture est devant l'objet, et négative si elle est derrière. Retourne 0 si la voiture n'existe pas. Seulement significatif pour les objets du paysage.

● Trains (frein)

Variable Description
mainReservoir La pression courante dans le réservoir principal de cette voiture, mesuré en Pa.
mainReservoir[carIndex] La pression courante dans le réservoir principal de la voiture carIndex, mesuré en Pa.
emergencyReservoir La pression courante dans le réservoir d'urgence de cette voiture, mesuré en Pa.
emergencyReservoir[carIndex] La pression courante dans le réservoir d'urgence de la voiture carIndex, mesuré en Pa.
brakePipe La pression courante dans le tuyau de frein de cette voiture, mesuré en Pa.
brakePipe[carIndex] La pression courante dans le tuyau de frein de la voiture carIndex, mesuré en Pa.
brakeCylinder La pression courante dans le cylindre de frein de cette voiture, mesuré en Pa.
brakeCylinder[carIndex] La pression courante dans le cylindre de frein de la voiture carIndex, mesuré en Pa.
straightAirPipe La pression courante dans le tuyaux d'air de cette voiture, mesuré en Pa.
straightAirPipe[carIndex] La pression courante dans le tuyaux d'air de la voiture carIndex, mesuré en Pa.

● Trains (portes)

Variable Description
doors L'état des portes. Retourne 0 si pleinement fermée, 1 si pleinement ouverte, ou n'importe quelle valeur intermédiaire, prévenant que les portes sont dans l'état ouvert complètement.
doors[carIndex] L'état des portes de la voiture carIndex. Retourne 0 si pleinement fermée, 1 si pleinement ouverte, ou n'importe quelle valeur intermédiaire, prévenant que les portes sont dans l'état ouvert complètement.
leftDoors L'état des portes de gauche. Retourne 0 si pleinement fermée, 1 si pleinement ouverte, ou n'importe quelle valeur intermédiaire, prévenant que les portes sont dans l'état ouvert complètement.
leftDoors[carIndex] L'état des portes de gauche de la voiture carIndex. Retourne une valeur comprise entre 0 et 1, prévenant que les portes sont dans l'état ouvert complètement, ou -1 si la voiture n'existe pas.
rightDoors L'état des portes de droite. Retourne 0 si pleinement fermée, 1 si pleinement ouverte, ou n'importe quelle valeur intermédiaire, prévenant que les portes sont dans l'état ouvert complètement.
rightDoors[carIndex] L'état des portes de droite de la voiture carIndex. Retourne une valeur comprise entre 0 et 1, prévenant que les portes sont dans l'état ouvert complètement, ou -1 si la voiture n'existe pas.
leftDoorsTarget Cible l'état anticipé des portes gauches. Retourne soit 0 (fermé) ou 1 (ouvert).
leftDoorsTarget[carIndex] Cible l'état anticipé des portes gauches de la voiture carIndex. Retourne soit 0 (fermé) ou 1 (ouvert).
rightDoorsTarget Cible l'état anticipé des portes droites. Retourne soit 0 (fermé) ou 1 (ouvert).
rightDoorsTarget[carIndex] Cible l'état anticipé des portes droites de la voiture carIndex. Retourne soit 0 (fermé) ou 1 (ouvert).

● Trains (Divers)

Variable Description
reverserNotch L'état de l'inverseur, qui est soit -1 (en arrière), 0 (neutre), ou 1 (en avant).
powerNotch Le cran de la puissance actuelle, à savoir 0 pour N, 1 pour P1, 2 pour P2, 3 pour P3, etc.
powerNotches La quantité de cran de puissance qu'a le train.
brakeNotch Le cran de frein actuel.
● Pour les trains sans frein à air automatique : 0 pour N, 1 pour B1, 2 pour B2, 3 pour B3, etc.
● Pour les trains avec frein à air automatique : 0 pour REL, 1 pour LAP et 2 pour SRV.
brakeNotches La quantité de cran de frein qu'a le train. Pour les trains avec le frein à air comprimé automatique, cela retourne 2.
brakeNotchLinear Une combinaison de cran de frein, frein de maintenance et frein d'urgence.
● Pour les trains sans le frein à air comprimé automatique et sans le frein de maintenance : 0 pour N, 1 pour B1, 2 pour B2, 3 pour B3, etc., jusqu'à BrakeNotches+1 pour EMG.
● Pour les trains sans le frein à air comprimé automatique mais avec le frein de maintenance : 0 pour N, 1 pour HLD, 2 pour B1, 3 pour B2, 4 pour B3, etc., jusqu'a BrakeNotches+2 pour EMG.
● Pour les trains avec le frein à air comprimé automatique : 0 pour REL, 1 pour LAP, 2 pour SRV or 3 pour EMG.
brakeNotchesLinear La plus haute valeur retournée par brakeNotchesLinear.
● Pour les trains sans le frein à air comprimé automatique et sans le frein de maintenance, c'est BrakeNotches+1.
● Pour les trains sans le frein à air comprimé automatique mais avec le frein de maintenance, c'est BrakeNotches+2.
● Pour les trains avec le frein à air comprimé automatique, Cela retourne 3.
emergencyBrake Que le frein d'urgence est actuellement actif (1) ou pas (0).
hasAirBrake Que le train a des freins a air automatiques (1) ou non (0).
holdBrake Que le frein d'immobilisation est actuellement actif (1) ou pas (0).
hasHoldBrake Que le train a des freins d'immobilisation (1) ou non (0).
constSpeed Que le système de vitesse constante est actuellement actif (1) ou pas (0).
hasConstSpeed Que le train a un système de vitesse constante (1) ou non (0).
hasPlugin Que le train utilise un plugin (1) ou non (0).
pluginState[i] L'état de la variable de plugin ith, retournant un nombre entier qui dépend du plugin. Est le même que pour atsi dans le panel2.cfg.

Si pluginState[i] est utilisé avec les systèmes intégrés de sécurité ATS et ATC, les mappages suivants pour i s'appliquent :

i Anglais 日本語 Valeurs de retour pluginState
[271]
Signification
256 ATS ATS 0 (non éclairé) ou 1 (éclairé) 0 ATC pas disponible
257 ATS RUN ATS 作動 0 (non éclairé), 1 (éclairé) ou 2 (clignotant) 1 0 km/h
258 ATS RUN ATS 作動 0 ( non éclairé / non clignotant), 1 ( éclairé / clignotant) 2 15 km/h
259 P POWER P 電源 0 (non éclairé) ou 1 (éclairé) 3 25 km/h
260 PTN APPROACH パターン接近 0 (non éclairé) ou 1 (éclairé) 4 45 km/h
261 BRAKE RELEASE ブレーキ開放 0 (non éclairé) ou 1 (éclairé) 5 55 km/h
262 BRAKE APPLY ブレーキ動作 0 (non éclairé) ou 1 (éclairé) 6 65 km/h
263 ATS P ATS P 0 (non éclairé) ou 1 (éclairé) 7 75 km/h
264 FAILURE 故障 0 (non éclairé) ou 1 (éclairé) 8 90 km/h
265 ATC ATC 0 (non éclairé) ou 1 (éclairé) 9 100 km/h
266 ATC POWER ATC 電源 0 (non éclairé) ou 1 (éclairé) 10 110 km/h
267 ATC SRV ATC 常用 0 (non éclairé) ou 1 (éclairé) 11 120 km/h
268 ATC EMG ATC 非常 0 (non éclairé) ou 1 (éclairé) 12 ATS is active
269 CONST SPEED 定速 0 (non éclairé) ou 1 (éclairé)    
270 EB EB 0 (non éclairé) ou 1 (éclairé)    
271 ATC speed indicator   0 - 12, voir le tableau sur la droite    

● Sections (signalling)

Le contexte de la section est définie lorsque l'objet est placé en utilisant Track.SigF.

Variable Description
section La valeur de l'aspect de la section actuellement affiché.
Si cette variable est utilisée en dehors d'un contexte Track.SigF, le comportement est actuellement indéfinie et sujet à changement.


6. Performance

Il y a certains types d'animation qui sont moins expansive, et d'autres qui le sont plus. En outre, l'objet sous-jacent joue un rôle important. Si vous souhaitez concevoir vos objets animés avec la meilleure performance possible pour les future versions d'openBVE, jetez un oeil à la table des performances suivantes:


7. Conseils

● De façon générale, essayez de garder la complexité des fonctions aussi légère que possible. Ce n'est pas l'aspect le plus critique, même si, la plupart de l'impact des performances résultera de l'application des résultats d'une fonction, par exemple, la rotation d'un objet, et non l'évaluation de la fonction.

● Utilisez le paramètre de rafraîchissement lorsque cela est possible pour optimiser les performances. Habituellement, vous pouvez utiliser ce paramètre lorsque vous n'avez pas besoin d'une animation fluide, ou lorsque vous voulez délibérément ne mettre à jour les fonctions qu'à intervalles réguliers.

● N'utiliser pas les fonctions qui sont toujours évaluées à la même constante. Par exemple, n'utilisez pas RotateXFunction = 3,14159, mais faire pivoter l'objet CSV/B3D/X sous-jacent.

● Les changements d'état sont très peut coûteuse (en performance) aussi longtemps que l'état ne change pas réellement entre deux exécutions de StateFunction. Si un changement se produit, ce sera cependant une opération relativement coûteuse.

● Essayez d'optimiser les conditions if. Surtout essayer d'éviter d'imbriquées des fonctions if. Souvent, il y a une solution mathématiques élégante.

● Certaines fonctions, par exemple Exp, Sin, Cos, etc., sont relativement coûteuses. Utilisez-les seulement si c'est absolument nécessaire pour un effet. Ne pas inclure d'opérations inutiles. Par exemple, le résultat de StateFunction est automatiquement arrondi vers le plus proche entier, donc n'appliquer pas un Round explicite supplémentaire.

● Lorsque vous travaillez avec des objets voiture, garder à l'esprit que certaines variables ont un index de voiture optionnel. Vous devriez utiliser cet index si vous voulez interroger l'état d'une voiture particulière (qui n 'est pas nécessairement celle attaché à l'objet). Si, toutefois, vous voulez juste interroger la valeur de la voiture particulière attaché à l'objet, utilisez la variable sans index. Pour les objets de décor, vous ne devriez généralement pas utiliser des index de voiture que vous ne pouvez pas être sûr du nombre de voitures qu'a le train interrogé.


8. Exemple de fonctions

● Lumière clignotante

Modèle pour une lumière clignotante :
States = OBJECT0, OBJECT1
StateFunction = value == 0
RefreshRate = SECONDS

● Rotation de la roue

Modèle pour le code utilisé dans un objet extérieur d'une voiture :
States = OBJECT
RotateXFunction = value + delta * speedometer / RADIUS_OF_THE_WHEEL

● Cycle d'objets d'une liste

Modèle pour les objets qui doivent être dans le cycle :
States = OBJECT0, OBJECT1, OBJECT2, ...
StateFunction = mod[value + 1, AMOUNT_OF_OBJECTS]
RefreshRate = TIME_PER_OBJECT

● Signal (3 aspects) pour Track.Section(0; 2; 4)

Modèle pour le signal (Track.Section) :
States = RED_OBJECT, YELLOW_OBJECT, GREEN_OBJECT
StateFunction = section / 2

● Employer un délai d'approche qui contrôle des signaux

Si vous voulez créer un signal qui ne cesse d'être rouge jusqu'à ce que le train s'approche à une certaine distance, puis un compte à rebours d'une minuterie avant qu'il ne passe au vert, s'il vous plaît se référer à ce post (anglais) sur ​​le forum pour une explication détaillée. Une fois que vous comprenez les concepts, vous pouvez utiliser ce modèle de code :

Modèle du délai d'approche qui contrôle un signal avec deux aspects :
States = RED_OBJECT, GREEN_OBJECT
StateFunction = if[trackDistance>DISTANCE | section==0, 0, min[value + 0.5*delta/DELAY, 1]]
Modèle du délai d'approche qui contrôle un signal avec un certain nombre d'aspects :
States = RED_OBJECT, ..., GREEN_OBJECT
StateFunction = if[trackDistance>DISTANCE | section==0, 0, if[value<0.5, value + 0.5*value/DELAY, section]]

mise à jour 14 Juin 2022 - Webmaster : Hervé Duliscouët -