/// <summary> /// Проверка столкновения игрока с заданным юнитом. Игрок представляется сферой с радиусом SphereRadius /// </summary> /// <param name="unit">Заданный юнит</param> /// <returns></returns> public override bool Intersects(Unit unit) { if (unit == this) return false; _boundingSphere = new BoundingSphere(Position, SphereRadius); return unit.Intersects(_boundingSphere); }
/// <summary> /// Проверяет пересекает ли заданный юнит хотя бы один юнит на карте /// </summary> /// <param name="unit">Заданный юнит</param> public bool Intersects(Unit unit) { return Units.Any(unit.Intersects); }
/// <summary> /// Перемещает текущий юнит в направлении заданного на заданное расстояние /// </summary> /// <param name="unit">Заданный юнит</param> /// <param name="distance">Расстояние</param> public void Step(Unit unit, float distance) { Position += Vector3.Normalize(unit.Position - Position)*distance; }
/// <summary> /// Поворот юнита вокруг оси Y по напрввлению к заданному /// </summary> /// <param name="unit">Заданный юнит</param> public void RotateTo(Unit unit) { Vector3 direction = unit.Position - Position; float angleY = (float)Math.Atan(direction.Z / direction.X); if (direction.X > 0) angleY = -angleY - (float)Math.PI / 2.0f; else angleY = -angleY + (float)Math.PI / 2.0f; Angles = new Vector3(Angles.X, angleY, Angles.Z); }
public virtual bool Intersects(Unit unit) { if (unit == this) return false; if (Type.Model == null || unit.Type.Model == null) return false; //Проверка столкновения каждой сферы юнита с каждой сферой заданного юнита foreach (var mesh in Type.Model.Meshes) { foreach (var mesh1 in unit.Type.Model.Meshes) { if (mesh.BoundingSphere.Transform(GetResultingTransformation(Transforms[mesh.ParentBone.Index])).Intersects( mesh1.BoundingSphere.Transform(unit.GetResultingTransformation(Transforms[mesh1.ParentBone.Index])))) return true; } } return false; }
/// <summary> /// Вычисление расстояния до заданного юнита /// </summary> /// <param name="unit">Заданный юнит</param> /// <returns>Расстояние</returns> public float DistanceTo(Unit unit) { return Vector3.Distance(Position, unit.Position); }