コード例 #1
0
        /// <summary>
        /// Ищет путь от одной звездной системы до другой. (Старый метод)
        /// </summary>
        /// <param name="from">Начальная точка полета.</param>
        /// <param name="to">Конечная точка полета.</param>
        public static List <StarSystem> FindWay(StarSystem from, StarSystem to)
        {
            List <StarSystem> path = new List <StarSystem>();

            if (from == null || to == null)
            {
                return(path);
            }

            StarSystem currSys = from, s, tS = null;

            path.Add(currSys);
            int breakPoint = 90;

            while (true)
            {
                Vector3 mainDirection = new Vector3(to.x - currSys.x, to.y - currSys.y, to.z - currSys.z);
                double  minDistance   = double.MaxValue;
                for (int i = 0; i < Program.Game.Galaxy.stars.Count; i++)
                {
                    s = Program.Game.Galaxy.stars[i];
                    if (s == currSys)
                    {
                        continue;
                    }

                    Vector3 direction = new Vector3(s.x - currSys.x, s.y - currSys.y, s.z - currSys.z);
                    double  angle     = mainDirection.ScalarWith(direction);
                    double  distance  = DrawController.Distance(currSys, s);
                    if (distance < minDistance && angle > 0)
                    {
                        minDistance = distance;
                        tS          = s;
                    }
                }
                currSys = tS;
                path.Add(tS);
                if (path.Count > breakPoint) //Если путь не находится, тупо делаем как было)
                {
                    path.Clear();
                    path.Add(from);
                    path.Add(to);
                    break;
                }
                if (tS == to)
                {
                    break;
                }
            }
            return(path);
        }
コード例 #2
0
ファイル: Fleet.cs プロジェクト: paskyale/galaxyconquest
        /// <summary>
        /// Осуществляет движение флота.
        /// </summary>
        /// <param name="time">Время галактики</param>
        public override void Move(double time)
        {
            if (s2 == null)//обновляем координаты флота, если во время шага он остается в своей системе
            {
                y = s1.y;
                z = s1.z;
                x = s1.x;
            }
            else if (starDistanse > 0.5)//Обновляем координаты, если флот летит. динамический рассчет дистанции нужен для равномерного движения
            {
                onWay = true;

                double dx = (s2.x - x) / starDistanse;
                double dy = (s2.y - y) / starDistanse;
                double dz = (s2.z - z) / starDistanse;

                x += dx;
                y += dy;
                z += dz;

                starDistanse = DrawController.Distance(this, s2);
            }
            else//Флот долетел до звезды
            {
                s1            = s2;
                s2            = null;
                starDistanse  = 0;
                onWay         = false;
                s1.Discovered = true;
                s2            = path.Next();

                if (s2 == null)
                {
                    path.Clear();
                    starDistanse = 0;
                    onWay        = false;

                    s1.Discovered = true;
                }
                else
                {
                    starDistanse = DrawController.Distance(s1, s2);
                }

                x = s1.x;
                y = s1.y;
                z = s1.z;
            }
        }
コード例 #3
0
ファイル: Fleet.cs プロジェクト: paskyale/galaxyconquest
 /// <summary>
 /// Устанавливает цель для флота.
 /// </summary>
 /// <param name="s">Звездная система</param>
 public void setTarget(StarSystem s)
 {
     if (s == null)
     {
         path.Clear();
         s2           = null;
         starDistanse = 0;
     }
     else
     {
         path.CalculateWay(s1, s);
         s2           = path.First;
         starDistanse = DrawController.Distance(path.First, this);
     }
 }
コード例 #4
0
 /// <summary>
 /// Расчитывает дистанции от каждой системы до каждой и заносит их в массив Distances
 /// </summary>
 public static void FillDistancesFrom(List <StarSystem> systems)
 {
     Distances = new double[systems.Count][];
     for (int i = 0; i < systems.Count; i++)
     {
         Distances[i] = new double[systems.Count];
         for (int j = 0; j < systems.Count; j++)
         {
             if (i == j)
             {
                 Distances[i][j] = double.MaxValue;
             }
             else
             {
                 Distances[i][j] = DrawController.Distance(systems[i], systems[j]);
             }
         }
     }
 }