예제 #1
0
    void checkBulletStatus(List <kBulletStatus> status)
    {
        bool  firstSide        = false;
        float previousDistance = float.MinValue;

        for (int i = 0; i < status.Count; ++i)
        {
            kBulletStatus bs = status[i];
            if (i == 0)
            {
                firstSide = bs.negativeSide;
            }
            else
            {
                if (!firstSide && bs.negativeSide)
                {
                    Debug.LogError("bullet status order error!");
                }
            }

            if (bs.distance < previousDistance)
            {
                Debug.LogError("bullet distance order error!");
            }

            previousDistance = bs.distance;
        }
    }
예제 #2
0
    public List <kBulletStatus> estimate(Vector3 targetPosition, eGameForce force)
    {
        int keyH = getLocomotionKey(targetPosition, Vector3.right);
        int keyV = getLocomotionKey(targetPosition, Vector3.forward);

        if (keyH == int.MinValue || keyV == int.MinValue)
        {
            Debug.LogWarning("TargetPosition is illegel!");
            return(null);
        }

        bool hasKeyH = false;
        bool hasKeyV = false;

        hasKeyH = bulletLocomotion.ContainsKey(Mathf.Abs(keyH));
        hasKeyV = bulletLocomotion.ContainsKey(Mathf.Abs(keyV));
        if (!hasKeyH && !hasKeyV)
        {
            return(null);
        }

        List <kBulletStatus> dangerousBullets = new List <kBulletStatus>();

        if (hasKeyH)
        {
            List <kBulletStatus> statusHorizonal = gatherBulletStatus(Mathf.Abs(keyH), targetPosition);
            if (statusHorizonal != null)
            {
                checkBulletStatus(statusHorizonal);
                estimateDangerousBullets(statusHorizonal, ref dangerousBullets);
            }
        }

        if (hasKeyV)
        {
            List <kBulletStatus> statusVertical = gatherBulletStatus(Mathf.Abs(keyV), targetPosition);
            if (statusVertical != null)
            {
                checkBulletStatus(statusVertical);
                estimateDangerousBullets(statusVertical, ref dangerousBullets);
            }
        }

        if (force != eGameForce.UNKNOWN_FORCE)
        {
            for (int i = 0; i < dangerousBullets.Count; ++i)
            {
                kBulletStatus status = dangerousBullets[i];
                //if(status.bullet.force != force || Mathf.Abs(status.distance)/status.bullet.speed > 1.0f)
                if (status.bullet.force != force)
                {
                    dangerousBullets.RemoveAt(i);
                    i = 0;
                }
            }
        }

        return(dangerousBullets);
    }
예제 #3
0
    List <kBulletStatus> gatherBulletStatus(int key, Vector3 targetPosition)
    {
        if (key < 0)
        {
            Debug.LogError("key must be a positive vaule!");
            return(null);
        }

        List <Bullet> bullectList = bulletLocomotion[key] as List <Bullet>;

        if (bullectList.Count == 0)
        {
            return(null);
        }

        List <kBulletStatus> bulletStatus = new List <kBulletStatus>();

        bool isHorizonal = key < 100;

        // sort from negative side to positive side
        bulletSorter.isHorizonal = isHorizonal;
        bullectList.Sort(bulletSorter);

        for (int i = 0; i < bullectList.Count; ++i)
        {
            Bullet singleBullet = bullectList[i];
            if (Mathf.Abs(singleBullet.locomotionKey) != key)
            {
                Debug.LogError("Target bullet has a wrong locomotionKey!");
                return(null);
            }

            Vector3 bulletPosition = singleBullet.transform.localPosition;
            float   dotValue       = Vector3.Dot(singleBullet.initDirection, targetPosition - bulletPosition);
            float   distance       = 0.0f;
            if (isHorizonal)
            {
                distance = bulletPosition.x - targetPosition.x;
            }
            else
            {
                distance = bulletPosition.z - targetPosition.z;
            }

            kBulletStatus newStatus = new kBulletStatus();
            newStatus.toward       = dotValue >= 0.0f;
            newStatus.distance     = distance;
            newStatus.negativeSide = distance < 0.0f;
            newStatus.bullet       = singleBullet;
            bulletStatus.Add(newStatus);
        }

        return(bulletStatus);
    }
예제 #4
0
    void estimateDangerousBullets(List <kBulletStatus> status, ref List <kBulletStatus> result)
    {
        int dangerNegative = 0;
        int dangerPositive = 0;

        for (int i = 0; i < status.Count; ++i)
        {
            kBulletStatus bs = status[i];
            if (bs.negativeSide)
            {
                if (bs.toward)
                {
                    result.Add(bs);
                    ++dangerNegative;
                }
                else
                {
                    if (dangerNegative > 0)
                    {
                        result.RemoveAt(result.Count - 1);
                        --dangerNegative;
                    }
                }
            }
            else
            {
                if (bs.toward)
                {
                    ++dangerPositive;
                    if (dangerPositive > 0)
                    {
                        result.Add(bs);
                    }
                }
                else
                {
                    --dangerPositive;
                }
            }
        }
    }