Instructeur - suivit de cap

Salle dédiée à IL-2 Cliffs of Dover et ses évolutions

Topic author
bolt
WSO Co-pilote
WSO Co-pilote
Messages : 953
Inscription : 02 mars 2003

Instructeur - suivit de cap

#1

Message par bolt »

Bonsoir a tous,

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; } }
Bon vol,
Bolt
Avatar de l’utilisateur

OBT~Mikmak
Jeune Pilote
Jeune Pilote
Messages : 1773
Inscription : 08 mars 2009

#2

Message par OBT~Mikmak »

Génial ! merci Bolt :notworthy

Topic author
bolt
WSO Co-pilote
WSO Co-pilote
Messages : 953
Inscription : 02 mars 2003

#3

Message par bolt »

Salut Mikmak,

De rien. J'ai essayé de faire une méthode le plus autonome possible afin de faciliter le portage dans d'autre script. Je vais essayer ce WE de récupérer les waypoint du fichiers mission afin de ne pas avoir a saisir les coords en manuel dans le script.

Bolt
Répondre

Revenir à « IL-2 Cliffs of Dover »