Пример #1
0
    /// <summary>
    /// Calculate the best position from which I can shoot to the target using the weapon
    /// First = position closest to the player
    /// Second = position closer to the target
    /// </summary>
    private Tuple <Vector2, Vector2> GetShootPositionTo(Vector2 pShootTarget, EWeaponId pWeapon)
    {
        float maxDist   = GetWeaponMaxUseDistance(pWeapon);
        float idealDist = GetWeaponIdealUseDistance(pWeapon);

        //ideal distance shouldnt be bigger. (probably not configured)
        if (idealDist > maxDist)
        {
            idealDist = maxDist;
        }

        Tuple <Vector2, Vector2> posHorizontal =
            GetShootPositions(pShootTarget, maxDist, idealDist, true,
                              GetDontHitLayer(pWeapon));
        Tuple <Vector2, Vector2> posVertical =
            GetShootPositions(pShootTarget, maxDist, idealDist, false,
                              GetDontHitLayer(pWeapon));

        //TESTING - Select the closest shoot position
        //- simple distance compare - select the closest
        const bool useSimpleDistCompare = true;

        if (useSimpleDistCompare)
        {
            if (Vector2.Distance(playerPosition, posHorizontal.Item1) < Vector2.Distance(playerPosition, posVertical.Item1))
            {
                return(posHorizontal);
            }
            else
            {
                return(posVertical);
            }
        }

        //- calculate path and compare their lengths
        //-- seems very costly, player lags
        MovePath pathHorizontal = pathFinder.GetPath(playerPosition, posHorizontal.Item1);    //, AiMovement.PATH_STEP);
        MovePath pathVertical   = pathFinder.GetPath(playerPosition, posVertical.Item1);      //, AiMovement.PATH_STEP);

        if (pathHorizontal.GetLength() < pathVertical.GetLength())
        {
            return(posHorizontal);
        }
        else
        {
            return(posVertical);
        }
    }