Exemplo n.º 1
0
        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;
        }