public static Unit CollideCheck(Unit unit, PointF vector) { for (int i = 0; i < _units.Count; i++) { if (_units[i] != unit) { double length = GameMath.Distance(_units[i].Position, GameMath.Add(unit.Position, vector)); double radiusAnd = _units[i].Radius + unit.Radius; if (length <= radiusAnd) { return(_units[i]); } } } return(null); }
private PointF GetMoveDirection(PointF vector, PointF destination) { Unit frontUnit = Map.CollideCheck(this, vector); if (frontUnit == null) { return(vector); } else { PointF vectorLeft = new PointF(vector.Y, -vector.X); PointF vectorRight = new PointF(-vector.Y, vector.X); Unit LeftUnit = Map.CollideCheck(this, vectorLeft); Unit RightUnit = Map.CollideCheck(this, vectorRight); float distanceLeft = GameMath.Distance(GameMath.Add(_position, vectorLeft), destination); float distanceRight = GameMath.Distance(GameMath.Add(_position, vectorRight), destination); if (LeftUnit == null && RightUnit == null) { if (distanceLeft <= distanceRight) { return(vectorLeft); } else { return(vectorRight); } } else if (LeftUnit == null) { return(vectorLeft); } else if (RightUnit == null) { return(vectorRight); } else { return(PointF.Empty); } } }
/*public void Move(PointF destination) * { * float distance = GameMath.Distance(_position, destination); * if (distance < _moveSpeed || distance > _oldDistance) * Stop(); * //_oldDistance = distance; * PointF vector = GameMath.Normalize(new PointF(destination.X - _position.X, destination.Y - _position.Y)); * vector = GameMath.Multiply(vector, _moveSpeed); * Translate(vector); * }*/ public void Translate(PointF vector) { _position = GameMath.Add(_position, vector); }
public Point ScreenToPoint(Point point) { point = GameMath.Add(point, _position); return(point); }