Ejemplo n.º 1
0
    internal bool CheckToDestroy(bool isForward, SphereBehaviour sb)                                                                    //виклик по ланцюгу перевірки на один колір
    {
        if ((sb.TypeSphere != TypeSphere && sb.TypeSphere != TypesSphere.MULCOLOR && TypeSphere != TypesSphere.MULCOLOR) || Health > 0) //перервати виконання, в разі якщо кулі не однакові
        {
            // Debug.Log("3 sb.TypeSphere != TypesSphere.MULCOLOR = " + sb.TypeSphere);
            return(false);
        }

        //Debug.Log("Add. forward="+ isForward +" Type="+TypeSphere);
        BallController.GetBalls(RespIndex).Add(gameObject);
        //Debug.Log("1_destroyList.count=" + BallController.GetBalls(RespIndex).Count);

        if (isForward)
        {
            if (FrontBall != null)
            {
                BallController.lastForwardBallIndex++;
                FrontBall.GetComponent <BallBehaviour>().CheckToDestroy(true, this);
            }
        }
        else if (BackBall != null)
        {
            BackBall.GetComponent <BallBehaviour>().CheckToDestroy(false, this);
        }

        return(true);
    }
Ejemplo n.º 2
0
    public void MoveForwardBall() => MoveForwardBall(Speed, Step, false);    //варіант, який використовує власну швидкість кулі

    public void MoveForwardBall(float speed, int step, bool isSmoothStart)   //рекурсивний початок руху передніх куль
    {
        if (isSmoothStart)
        {
            StopAllCoroutines();            //в разі якщо буде плавний старт, то зупинити виконання інших корутин(може бути повторний старт тієї ж корутини з вильотом гри)
        }
        //Debug.Log("MoveForwardBall "+TypeSphere);
        if (FrontBall != null)                  //почати рух передньої кулі
        {
            if (FrontBall == BackBall)
            {
                Debug.LogError("задня та передня куля співпадають");
                Destroy(gameObject);
            }
            FrontBall.GetComponent <BallBehaviour>().MoveForwardBall(speed, step, isSmoothStart);
        }

        if (isSmoothStart)
        {
            StartCoroutine(AccelerationCoroutine(speed, 0.25f, step));
        }
        else
        {
            Move(speed, step);                            //продовжити рух самій
        }
    }
Ejemplo n.º 3
0
 public GameObject SearchFirstBall()                    //Повернути першу кулю в послідовності. Не використовую
 {
     if (FrontBall != null)
     {
         return(FrontBall.GetComponent <BallBehaviour>().SearchFirstBall());
     }
     else
     {
         return(gameObject);
     }
 }
Ejemplo n.º 4
0
 /* public void MoveAndAlignBalls(float speed, int step, bool isSmoothStart)
  * {
  *   if (FrontBall != null)
  *       FrontBall.GetComponent<BallBehaviour>().MoveAndAlignBalls(speed, step, isSmoothStart);
  *   Move(speed, step);
  *
  *   if (BackBall != null)
  *   {
  *       float distance = Vector3.Distance(BackBall.transform.position, transform.position);
  *
  *       if (distance < ((radius * 2) - 0.2f))
  *       {
  *           MoveForwardBall(4.0f, 1);
  *           StartCoroutine(AlignBallsCoroutine());
  *       }
  *   }
  * }*/
 public void ChangeSpeedForwardBalls(float Speed, bool changeBaseSpeed)    //рекурсивна зміна швидкості без команди на початок руху
 {
     // Debug.Log("Speed "+TypeSphere);
     this.Speed = Speed;                      //Змінити швидкість без запуску руху
     if (changeBaseSpeed)
     {
         this.BaseSpeed = Speed;
     }
     if (FrontBall != null)
     {
         FrontBall.GetComponent <BallBehaviour>().ChangeSpeedForwardBalls(Speed, changeBaseSpeed);
     }
     //StopAllCoroutines();
 }
Ejemplo n.º 5
0
    public void StopForwardBall(bool isSmoothStop)               //рекурсивна зупинка передніх куль
    {
        StopAllCoroutines();

        if (FrontBall != null)                  //зупинити передню кулю
        {
            FrontBall.GetComponent <BallBehaviour>().StopForwardBall(isSmoothStop);
        }

        if (isSmoothStop)
        {
            StartCoroutine(AccelerationCoroutine(Speed, -0.15f, Step));
        }
        else
        {
            Stop(true);                               //зупинитись самій
        }
    }
Ejemplo n.º 6
0
    public int powerMulticolorSkill;                //встановити при виклику з геймконтрола

    override internal void PlayerCheckToDestroy()
    {
        Debug.Log("BallMulticolor Type=" + TypeSphere);

        List <GameObject> destroyList = new List <GameObject>();

        destroyList = BallController.GetBalls(RespIndex);

        //Debug.Log("powerMulticolorSkill="+powerMulticolorSkill);

        if (powerMulticolorSkill < 1)
        {
            destroyList.Add(gameObject);
        }
        else
        {
            destroyList.Add(null);
        }

        powerMulticolorSkill--;
        BallController.lastForwardBallIndex = 0;

        if (FrontBall != null)
        {
            FrontBall.GetComponent <BallBehaviour>().CheckToDestroy(true, this);
        }
        else
        {
            BallController.readyToDestroy = true;       //якщо передніх куль немає (і їх не потрібно зсувати) - то розблокувати процес знищення куль
        }
        if (BackBall != null)
        {
            BackBall.GetComponent <BallBehaviour>().CheckToDestroy(false, this);
        }
        else
        {
            BallController.readyToDestroy = true;       //якщо задніх куль не має і зсуву передніх робити також не потрібно - то розблокувати процес знищення куль
        }
    }
Ejemplo n.º 7
0
    public override void CollisionOfBalls(GameObject collBall)
    {
        if (collBall.tag != "ball")                      //Тільки при ударі в кулю
        {
            return;
        }

        if (isCollidet)
        {
            base.CollisionOfBalls(collBall);           //Якщо зіткнення вже відбувалось, то опрацьовувати як звичайну кулю
            return;
        }

        isCollidet = true;                             //Помітити що зіткнення відбулось, та викликати базову реалізацію

        angle = Mathf.Atan2((transform.position.y - collBall.transform.position.y), (transform.position.x - collBall.transform.position.x));
        if (angle < 0)
        {
            angle += TPi;
        }

        GameObject collidetBall = collBall;

        collBallSb = collidetBall.GetComponent <BallBehaviour>();


        // isTryClockwise = PathAngle(collBall) < 90? true: false;
        // Debug.Log(PathAngle(collBall));

        //Три основні варіанти зіткнення - з заходом в перед кулі, в зад кулі та в перед кулі але з перенаправленням на задню кулю (для обрахунку більшості ударів одноманітним чином - з закотом проти часової стрілки)
        if (PathAngle(collBall) >= 90)                          //1. Удар в передню частину кулі
        {
            BackBall   = collBall;
            collBallSb = BackBall.GetComponent <BallBehaviour>();

            if (collBallSb.FrontBall != null)
            {
                FrontBall = collBallSb.FrontBall;               //призначити передню кулю, якщо вона є
                FrontBall.GetComponent <BallBehaviour>().BackBall = gameObject;
            }
            collBallSb.FrontBall = gameObject;                  //призначити поточну кулю як нову передню для задньої
        }
        else if (collBallSb.BackBall != null)                   //2. Псевдо удар в задню частину кулі, який рахується як удар в передню частину задньої кулі
        {
            //Debug.Log("point 0");
            FrontBall = collBallSb.gameObject;
            BackBall  = collBallSb.BackBall;

            float beta = Mathf.Atan2((BackBall.transform.position.y - collBall.transform.position.y), (BackBall.transform.position.x - collBall.transform.position.x));
            if (beta < 0)
            {
                beta += TPi;
            }

            if (beta < Mathf.PI)
            {
                angle = beta - (Mathf.PI * 4.0f / 3.0f);
            }
            else
            {
                angle = beta + Mathf.PI - (Mathf.PI / 3.0f);
            }

            collBallSb.BackBall = gameObject;
            collBallSb          = BackBall.GetComponent <BallBehaviour>();

            collBallSb.FrontBall = gameObject;

            isTryClockwise = PathAngle(collBallSb.BackBall) < 90 ? true : false;
        }
        else                                                    //3. Дійсний удар в задню частину кулі, якщо інших варіантів не лишилось(удар в хвіст потоку, або по одиночній кулі)
        {
            // isTryClockwise = true;
            isClockwise = true;
            //Debug.Log("REAL BACK");
            FrontBall  = collBall;
            collBallSb = FrontBall.GetComponent <BallBehaviour>();
            if (collBallSb.BackBall != null)
            {
                BackBall = collBallSb.BackBall;
                BackBall.GetComponent <BallBehaviour>().FrontBall = gameObject;
            }
            collBallSb.BackBall = gameObject;
        }

        if (FrontBall != null && BackBall != null)      //Якщо потрібно від'їхати вперед, та звільнити місце
        {
            FrontBall.GetComponent <BallBehaviour>().MoveOneStepForward(this);
        }

        pathPoints = new List <Transform>(collBallSb.pathPoints);

        RespIndex = collBall.GetComponent <BallBehaviour>().RespIndex;                     //отримує індекс списку куль
    }