private void _Move(string behavior, Vector2 direction, Map map) { if ((Destination != Position) && !IsAtDestination) { if (behavior == "linear") { direction.Normalize(); } else if (behavior == "steering") { float previousSpeed = Speed; float desiredSpeed = _FindMaxSpeed(Destination, direction); Speed = MathHelper.Clamp(desiredSpeed, previousSpeed - MaxSpeedDelta*timer, previousSpeed + MaxSpeedDelta*timer); float facingDirection = (float) Math.Atan2(direction.Y, direction.X); facingDirection = _TurnToFace(Position, Destination, facingDirection, MaxAngularVelocity*timer); direction = new Vector2((float) Math.Cos(facingDirection), (float) Math.Sin(facingDirection)); } bool collided = false; // If there's no color data, we're not colliding foreach (string inMobility in InMobility) { Color? collColor = map.GetColorAt(inMobility, Position + (direction * 5)); if (collColor != null && collColor.Value.A > 0) {// There is color data, we're interested in anything that's not fully transparent collided = true; break; } } // Only move if we've not collided if (!collided) { Position += Speed*direction; LastMovement = Speed*direction; IsAnimating = true; } else { Collision(); IsAnimating = false; } } if ((Destination != Position) && IsAtDestination) { Destination = Position; Speed = 0; if (GetType().Name == "UAV") { Destination = HQ_Position; Direction = Direction.SouthWest; } //IsAnimating = false; } if (!IsAtDestination) Direction = (Direction)_ConvertDirectionToEnum(direction); if (Direction != PreviousDirection) Speed = Math.Max(maxSpeed * 0.5f, Speed * 0.7f); PreviousDirection = Direction; }