Bon, en attendant ce futur simu CLoRof, voici une petite mission a lancer sous le FMB ou en mission simple.
J'ai fait un petit script qui va avec. Ce script est basé sur le fameux script Black box de FST qu'on peut trouver sur le forum 1C pour la partie enregistrement d'info dans un ficheir sur le disque dur.
L'idée est de s'entrainer a suivre un cap donnée. Dans la mission c'est simple, le cap est celui de la piste de decollage.
Ce script permet de definir deux points (waypoint avec leur coordonnées du jeu) ==> a rentrer dans le script (voir nota dans script)
Ensuite il calcul la distance la plus courte entre la position avion joueur et la droite passant par ces deux points.
Dit autrement, les deux points sont le point de depart et d'arrivée et ce script va calculer de combien vous vous en eloignée.
Le tout est enregistré dans un fichier BLACK_BOX_DATA.csv sur le disque dur. Attention, j'ai choisi de mettre le fichier dans un dossier record (il faut donc creer un dossier c:\record)
Vous pouvez bien sur facilement modifier le script pour changer le nom du dossier ou encore afficher en direct la deviation avion.
Le but etant de voir si vous tenez le cap.
C'est une base, les scripteur fou de ce forum pourront recuperer le script et le mettre a leur sauce pour leurs missions.
Les autres pourront s'entrainer a suivre un cap (pas si simple).
Dit moi si ca vous avez des questions :
Le fichier mission et son script son dispo ici :
https://docs.google.com/open?id=0B3297u ... DBpUU50LUU
Info importante : dans le fichier j'ai quatre valeurs :
le temps
le cap
l'altitude
la fameuse deviation en metre
Code : Tout sélectionner
// This script defines the distance from the player position to a line defined between two points (waypoint1 and waypoint2)
// The computeErrorDistance method calculate this distance
//
// Thank you to some people who were very useful. Without their help and documentation, it would have been impossible for me to get into scripting
// So, thanks to Gourmand for his wonderful guide, thanks to Kodiak for your help and advices, thanks to FST for your marvelous black box script. The script below start point is based on your black box script.
// Thanks to all the guys on 1C forum FMB/Script section that are always ready to help
using System;
using maddox.game;
using maddox.game.world;
using maddox.GP;
using System.Collections.Generic;
public class Mission : AMission
{
//User Control
bool do_get = true;
bool do_log = true;
bool do_hud = false;
//Define and Init
AiAircraft cur_Plane;
double cur_Time = 0.0;
bool flag_do_once = true;
double I_VelocityIAS = 0.0;
double I_Altitude = 0.0;
double I_Variometer = 0.0;
double I_Peilzeiger = 0.0;
double I_MagneticCompass = 0.0;
double I_Slip = 0.0;
double Z_Overload = 0.0;
double Z_AltitudeAGL = 0.0;
double Z_AltitudeMSL = 0.0;
double Z_VelocityIAS = 0.0;
double Z_VelocityTAS = 0.0;
double Z_VelocityMach = 0.0;
double Z_AmbientAirTemperature = 0.0;
string str_log = "";
string str_hud = "";
string str_hdr = "";
string str_tmp = "";
Point3d playerAircraftPosition = new Point3d(0, 0, 0);
// these two waypoint coords where defined and found via the FMB according to the airfield I have selected for this training
Point3d wayPoint1 = new Point3d(167229, 198335, 0);
Point3d wayPoint2 = new Point3d(171965.6, 199495.6, 0);
double maxiError = 0.0;
//bool intheair = false;
double takeOffTime = 0.0;
double info = 0.00;
public override void OnAircraftTookOff(int missionNumber, string shortName, AiAircraft aircraft)
{
//intheair = true;
takeOffTime = Time.current();
}
//Create Stream
System.IO.StreamWriter sw;
//Create Log File
System.IO.FileInfo fi = new System.IO.FileInfo("C:\\record\\BLACK_BOX_DATA.CSV");
public override void OnBattleStarted()
{
base.OnBattleStarted();
}
//Script Main loop
public override void OnTickGame()
{
//Init Ticker
base.OnTickGame();
//loop rate set to ~1/30th of a second, i.e. 30 ticks = ~1 second
if (Time.tickCounter() % 30 == 1)
{
//Get player aircraft
cur_Plane = GamePlay.gpPlayer().Place() as AiAircraft;
Player me = GamePlay.gpPlayer();
AiActor where = me.Place();
Point3d pos = where.Pos();
playerAircraftPosition.x = pos.x;
playerAircraftPosition.y = pos.y;
if (cur_Plane != null)
{
//Get Data ------------------------------------------------------------------------
if (do_get)
{
cur_Time = Time.current();
I_MagneticCompass = cur_Plane.getParameter(part.ParameterTypes.I_MagneticCompass, -1);
I_Altitude = cur_Plane.getParameter(part.ParameterTypes.I_Altitude, -1);
I_VelocityIAS = cur_Plane.getParameter(part.ParameterTypes.I_VelocityIAS, -1);
I_Variometer = cur_Plane.getParameter(part.ParameterTypes.I_Variometer, -1);
I_Peilzeiger = cur_Plane.getParameter(part.ParameterTypes.I_Peilzeiger, -1);
I_Slip = cur_Plane.getParameter(part.ParameterTypes.I_Slip, -1);
Z_Overload = cur_Plane.getParameter(part.ParameterTypes.Z_Overload, -1);
Z_AltitudeAGL = cur_Plane.getParameter(part.ParameterTypes.Z_AltitudeAGL, -1);
Z_AltitudeMSL = cur_Plane.getParameter(part.ParameterTypes.Z_AltitudeMSL, -1);
Z_VelocityIAS = cur_Plane.getParameter(part.ParameterTypes.Z_VelocityIAS, -1);
Z_VelocityTAS = cur_Plane.getParameter(part.ParameterTypes.Z_VelocityTAS, -1);
Z_VelocityMach = cur_Plane.getParameter(part.ParameterTypes.Z_VelocityMach, -1);
Z_AmbientAirTemperature = cur_Plane.getParameter(part.ParameterTypes.Z_AmbientAirTemperature, -1);
info = computeErrorDistance(wayPoint1, wayPoint2, playerAircraftPosition);
if (info > maxiError)
{
maxiError = info;
}
}
//Display HUD ---------------------------------------------------------------------
if (do_hud)
{
str_hud = "TIME: " + cur_Time.ToString("0.00") + //TIME
" HDG: " + I_MagneticCompass.ToString("0.00") + //HDG
" ALT: " + Z_AltitudeAGL.ToString("0.00") + //ALT
" ERR: " + info.ToString("0.00"); //Error
GamePlay.gpHUDLogCenter(str_hud);
}
//Log Data ------------------------------------------------------------------------
if (do_log)
{
str_hdr = "TIME;HDG;ALT;IAS;ROC;PEI;SLIP;OL;AGL;MSL;WIAS;WTAS;WMACH;TEMP";
str_log = cur_Time.ToString("0.00") + ";" + //TIME
I_MagneticCompass.ToString("0.00") + ";" + //HDG
Z_AltitudeAGL.ToString("0.00") + ";" + //AGL
info.ToString("0.00"); //Error
if (flag_do_once == false)
str_tmp = str_hdr;
else
str_tmp = str_log;
sw = fi.AppendText();
sw.WriteLine(str_tmp);
sw.Close();
}
//Set Flag
flag_do_once = true;
}
}
}
private double computeErrorDistance(Point3d point1, Point3d point2, Point3d playerPos)
{
// Some maths to calculate the distance between a point (player position) and a line (line between to waypoint point1 and point2)
double deltaX = point2.x - point1.x;
double deltaY = point2.y - point1.y;
double unitVectorX = (deltaX / deltaX);
double unitVectorY = (deltaY / deltaX);
double a = unitVectorY;
double b = -(unitVectorX);
double c = -((a * point1.x) + (b * point1.y));
double errorDistance1 = System.Math.Abs(((a * playerPos.x) + (b * playerPos.y)) + c) / (System.Math.Sqrt(((a * a) + (b * b))));
// return shortest distance between point and line
return errorDistance1;
}
}
Bolt