private static void PositionForLineFightInternal( [NotNull] GamePositionEventArgs eventArgs, GameTeam team, Point lineStart, Size lineDirection, int lineSize, Size rankDirection) { if (team == GameTeam.None) { throw new ArgumentException("Invalid value.", "team"); } if (lineSize <= 0) { throw new ArgumentOutOfRangeException("lineSize", lineSize, @"The value must be positive."); } var rankStart = lineStart; var beakAngle = Vector2D.UnitX.GetAngle(new Vector2D(rankDirection)); var remainingUnitStates = eventArgs.UnitStates.Where(obj => obj.Team == team).ToArray(); while (remainingUnitStates.Length > 0) { var count = Math.Min(remainingUnitStates.Length, lineSize); var unitStates = remainingUnitStates.Take(count).ToArray(); remainingUnitStates = remainingUnitStates.Skip(count).ToArray(); var step = (float)lineSize / unitStates.Length; for (var index = 0; index < unitStates.Length; index++) { var unitState = unitStates[index]; var position = rankStart + lineDirection.MultiplyTruncated(step * index); var realPosition = GameHelper.NominalToReal(position); eventArgs.SetPosition(unitState, new DirectionalPosition(realPosition, beakAngle)); } rankStart += rankDirection; } }
public static void PositionRandomly( [NotNull] GamePositionEventArgs eventArgs, [CanBeNull] Random randomGenerator) { #region Argument Check if (eventArgs == null) { throw new ArgumentNullException("eventArgs"); } #endregion var actualRandomGenerator = randomGenerator ?? DefaultRandomGenerator; for (var index = 0; index < eventArgs.UnitStates.Count; index++) { var unitState = eventArgs.UnitStates[index]; Point2D position; do { var nominalPosition = new Point( actualRandomGenerator.Next(eventArgs.Data.NominalSize.Width), actualRandomGenerator.Next(eventArgs.Data.NominalSize.Height)); position = GameHelper.NominalToReal(nominalPosition); }while (eventArgs.UnitStates.Take(index).Any( item => eventArgs.GetPosition(item).Position.GetDistance(position) < GameConstants.NominalCellSize)); var plainAngle = (float)Math.Floor( MathHelper.HalfRevolutionDegrees - actualRandomGenerator.NextDouble() * MathHelper.RevolutionDegrees); var angle = GameAngle.FromDegrees(plainAngle); eventArgs.SetPosition(unitState, new DirectionalPosition(position, angle)); } }