Пример #1
0
        private void StartGame()
        {
            UnityEngine.Random.InitState(42);

            for (int i = 0; i < matrixSize; i++)
            {
                collidableMatrix.Add(new List <List <CollidableObj> >());
                for (int j = 0; j < matrixSize; j++)
                {
                    collidableMatrix[i].Add(new List <CollidableObj>());
                    if (i >= matrixSize / 2 - asteroidAmountX / 2 && i < matrixSize / 2 + asteroidAmountX / 2 && j >= matrixSize / 2 - asteroidAmountX / 2 && j < matrixSize / 2 + asteroidAmountX / 2)
                    {
                        //velocity == 0 is possible but i don't think that thats what this part of the task was about
                        collidableMatrix[i][j].Add(new Asteroid(i, j, new Vector2(UnityEngine.Random.Range(-asteroidMaxV, asteroidMaxV), UnityEngine.Random.Range(-asteroidMaxV, asteroidMaxV)), asteroidRadious, asteroidInstantiationTime));
                        UpdateUnviableGreyzone(i, j, matrixSize, collidableMatrix[i][j][0]);
                    }
                }
            }
            playerObj = new CollidableObj(matrixSize / 2 + 0.5f, matrixSize / 2 + 0.5f, Vector2.zero, playerRadious);

            for (int i = 0; i < bulletLifetime / bulletFireTime; i++)
            {
                bullets.Add(new Bullet(0, 0, Vector2.zero, bulletRadious));
                bullets[i].simulated = false;
                collidableMatrix[0][0].Add(bullets[i]);
            }
        }
Пример #2
0
 private void UpdateUnviableGreyzone(int i, int j, int max, CollidableObj obj) //greyzone= area near edge of cell, directions clockwise 1-8 starting with up
 {
     if (i == 0)
     {
         if (j == 0)
         {
             obj.unviableGreyzone = 6;
         }
         else if (j + 1 == max)
         {
             obj.unviableGreyzone = 8;
         }
         else
         {
             obj.unviableGreyzone = 7;
         }
     }
     else if (i + 1 == max)
     {
         if (j == 0)
         {
             obj.unviableGreyzone = 4;
         }
         else if (j + 1 == max)
         {
             obj.unviableGreyzone = 2;
         }
         else
         {
             obj.unviableGreyzone = 3;
         }
     }
     else if (j == 0)
     {
         obj.unviableGreyzone = 5;
     }
     else if (j + 1 == max)
     {
         obj.unviableGreyzone = 1;
     }
     else
     {
         obj.unviableGreyzone = 0;
     }
 }
Пример #3
0
 CollidableObj CheckCollisionMatrix(CollidableObj a, int i, int j)
 {
     for (int p = 0; p < collidableMatrix[i][j].Count; p++)
     {
         if (loopUpdateCycle != collidableMatrix[i][j][p].updatedInLoop)
         {
             UpdateObject(collidableMatrix[i][j][p]);
         }
         if (collidableMatrix[i][j][p].simulated == true && a != collidableMatrix[i][j][p])
         {
             chk++;
             if ((a.xPosition - collidableMatrix[i][j][p].xPosition) * (a.xPosition - collidableMatrix[i][j][p].xPosition) + (a.yPosition - collidableMatrix[i][j][p].yPosition) * (a.yPosition - collidableMatrix[i][j][p].yPosition) < ((a.diameter + collidableMatrix[i][j][p].diameter) * (a.diameter + collidableMatrix[i][j][p].diameter)) / 4)
             {
                 return(collidableMatrix[i][j][p]);
             }
         }
     }
     return(null);
 }
Пример #4
0
        //I know that the code could be tidier, but I assume that this is mostly an optimization task
        private void Update()
        {
            if (dead)
            {
                return;
            }
            InputHandle();
            BulletHandle();
            CheckPlayerCollision();

            asteroidsInFrustum4x4.Clear();

            camPos = mainCamTrans.position;
            right  = camPos.x + camSizeX;
            left   = camPos.x - camSizeX;
            top    = camPos.y + camSizeY;
            bottom = camPos.y - camSizeY;

            for (int i = 0; i < collidableMatrix.Count; i++)
            {
                for (int j = 0; j < collidableMatrix[i].Count; j++)
                {
                    for (int k = 0; k < collidableMatrix[i][j].Count; k++)
                    {
                        CollidableObj currentObj = collidableMatrix[i][j][k];
                        if (loopUpdateCycle != currentObj.updatedInLoop)
                        {
                            UpdateObject(currentObj);
                        }

                        if (currentObj.simulated == true)
                        {
                            //checking if obj changed the cell
                            int chkBnds = collidableMatrix[i][j][k].CheckUnbound(i, j);
                            if (chkBnds != 0)
                            {
                                if (chkBnds != currentObj.unviableGreyzone)
                                {//directions 1-8 clockwise, start at up
                                    switch (chkBnds)
                                    {
                                    case 1:

                                        if (j + 1 < collidableMatrix[i].Count)
                                        {
                                            collidableMatrix[i][j + 1].Add(collidableMatrix[i][j][k]);
                                            collidableMatrix[i][j].RemoveAt(k);
                                            k--;
                                            UpdateUnviableGreyzone(i, j + 1, collidableMatrix.Count, currentObj);
                                        }

                                        break;

                                    case 2:

                                        if (i + 1 < collidableMatrix.Count)
                                        {
                                            if (j + 1 < collidableMatrix[i + 1].Count)
                                            {
                                                collidableMatrix[i + 1][j + 1].Add(collidableMatrix[i][j][k]);
                                                collidableMatrix[i][j].RemoveAt(k);
                                                k--;
                                                UpdateUnviableGreyzone(i + 1, j + 1, collidableMatrix.Count, currentObj);
                                            }
                                            else
                                            {
                                                collidableMatrix[i + 1][j].Add(collidableMatrix[i][j][k]);
                                                collidableMatrix[i][j].RemoveAt(k);
                                                k--;
                                                UpdateUnviableGreyzone(i + 1, j, collidableMatrix.Count, currentObj);
                                            }
                                        }
                                        else if (j + 1 < collidableMatrix[i].Count)
                                        {
                                            collidableMatrix[i][j + 1].Add(collidableMatrix[i][j][k]);
                                            collidableMatrix[i][j].RemoveAt(k);
                                            k--;
                                            UpdateUnviableGreyzone(i, j + 1, collidableMatrix.Count, currentObj);
                                        }
                                        break;

                                    case 3:

                                        if (i + 1 < collidableMatrix.Count)
                                        {
                                            if (j < collidableMatrix[i + 1].Count)
                                            {
                                                collidableMatrix[i + 1][j].Add(collidableMatrix[i][j][k]);
                                                collidableMatrix[i][j].RemoveAt(k);
                                                k--;
                                                UpdateUnviableGreyzone(i + 1, j, collidableMatrix.Count, currentObj);
                                            }
                                        }

                                        break;

                                    case 4:

                                        if (i + 1 < collidableMatrix.Count)
                                        {
                                            if (j != 0)
                                            {
                                                collidableMatrix[i + 1][j - 1].Add(collidableMatrix[i][j][k]);
                                                collidableMatrix[i][j].RemoveAt(k);
                                                k--;
                                                UpdateUnviableGreyzone(i + 1, j - 1, collidableMatrix.Count, currentObj);
                                            }
                                            else
                                            {
                                                collidableMatrix[i + 1][j].Add(collidableMatrix[i][j][k]);
                                                collidableMatrix[i][j].RemoveAt(k);
                                                k--;
                                                UpdateUnviableGreyzone(i + 1, j, collidableMatrix.Count, currentObj);
                                            }
                                        }
                                        else if (j != 0)
                                        {
                                            collidableMatrix[i][j - 1].Add(collidableMatrix[i][j][k]);
                                            collidableMatrix[i][j].RemoveAt(k);
                                            k--;
                                            UpdateUnviableGreyzone(i, j - 1, collidableMatrix.Count, currentObj);
                                        }

                                        break;

                                    case 5:

                                        if (j != 0)
                                        {
                                            collidableMatrix[i][j - 1].Add(collidableMatrix[i][j][k]);
                                            collidableMatrix[i][j].RemoveAt(k);
                                            k--;
                                            UpdateUnviableGreyzone(i, j - 1, collidableMatrix.Count, currentObj);
                                        }

                                        break;

                                    case 6:

                                        if (j != 0)
                                        {
                                            if (i != 0)
                                            {
                                                collidableMatrix[i - 1][j - 1].Add(collidableMatrix[i][j][k]);
                                                collidableMatrix[i][j].RemoveAt(k);
                                                k--;

                                                UpdateUnviableGreyzone(i - 1, j - 1, collidableMatrix.Count, currentObj);
                                            }
                                            else
                                            {
                                                collidableMatrix[i][j - 1].Add(collidableMatrix[i][j][k]);
                                                collidableMatrix[i][j].RemoveAt(k);
                                                k--;

                                                UpdateUnviableGreyzone(i, j - 1, collidableMatrix.Count, currentObj);
                                            }
                                        }
                                        else if (i != 0)
                                        {
                                            collidableMatrix[i - 1][j].Add(collidableMatrix[i][j][k]);
                                            collidableMatrix[i][j].RemoveAt(k);
                                            k--;

                                            UpdateUnviableGreyzone(i - 1, j, collidableMatrix.Count, currentObj);
                                        }

                                        break;

                                    case 7:

                                        if (i != 0)
                                        {
                                            collidableMatrix[i - 1][j].Add(collidableMatrix[i][j][k]);
                                            collidableMatrix[i][j].RemoveAt(k);
                                            k--;
                                            UpdateUnviableGreyzone(i - 1, j, collidableMatrix.Count, currentObj);
                                        }

                                        break;

                                    case 8:

                                        if (i != 0)
                                        {
                                            if (j + 1 < collidableMatrix[i - 1].Count)
                                            {
                                                collidableMatrix[i - 1][j + 1].Add(collidableMatrix[i][j][k]);
                                                collidableMatrix[i][j].RemoveAt(k);
                                                k--;
                                                UpdateUnviableGreyzone(i - 1, j + 1, collidableMatrix.Count, currentObj);
                                            }
                                            else
                                            {
                                                collidableMatrix[i - 1][j].Add(collidableMatrix[i][j][k]);
                                                collidableMatrix[i][j].RemoveAt(k);
                                                k--;
                                                UpdateUnviableGreyzone(i - 1, j, collidableMatrix.Count, currentObj);
                                            }
                                        }
                                        else if (j + 1 < collidableMatrix.Count)
                                        {
                                            collidableMatrix[i][j + 1].Add(collidableMatrix[i][j][k]);
                                            collidableMatrix[i][j].RemoveAt(k);
                                            k--;
                                            UpdateUnviableGreyzone(i, j + 1, collidableMatrix.Count, currentObj);
                                        }

                                        break;

                                    default: break;
                                    }
                                }
                            }
                            int grz = 0;
                            grz = currentObj.CheckGeryzone(i, j); //greyzone is the area near the edge of the cell
                            CollidableObj collided = null;
                            collided = CheckCollisionMatrix(currentObj, i, j);
                            if (collided != null)
                            {
                                if (collided.GetType() == typeof(Bullet) || currentObj.GetType() == typeof(Bullet))
                                {
                                    AddScore();
                                }
                                collided.OnCollision();
                                currentObj.OnCollision();
                            }
                            //checking nearby cells if object close to edge, if yes check collision
                            else if (grz != 0)
                            {
                                if (currentObj.unviableGreyzone != grz)
                                {
                                    //directions 1-8 clockwise, start at up
                                    switch (grz)
                                    {
                                    case 1:
                                        if (j + 1 < collidableMatrix.Count)
                                        {
                                            collided = CheckCollisionMatrix(currentObj, i, j + 1);
                                        }
                                        break;

                                    case 2:
                                        if (j + 1 < collidableMatrix.Count)
                                        {
                                            if (i + 1 < collidableMatrix.Count)
                                            {
                                                collided = CheckCollisionMatrix(currentObj, i + 1, j + 1);
                                                if (collided == null)
                                                {
                                                    collided = CheckCollisionMatrix(currentObj, i, j + 1);
                                                }
                                                if (collided == null)
                                                {
                                                    collided = CheckCollisionMatrix(currentObj, i + 1, j);
                                                }
                                            }


                                            else
                                            {
                                                collided = CheckCollisionMatrix(currentObj, i, j + 1);
                                            }
                                        }
                                        else if (i + 1 < collidableMatrix.Count)
                                        {
                                            collided = CheckCollisionMatrix(currentObj, i + 1, j);
                                        }

                                        break;

                                    case 3:
                                        if (i + 1 < collidableMatrix.Count)
                                        {
                                            collided = CheckCollisionMatrix(currentObj, i + 1, j);
                                        }
                                        break;

                                    case 4:
                                        if (j != 0)
                                        {
                                            if (i + 1 < collidableMatrix.Count)
                                            {
                                                collided = CheckCollisionMatrix(currentObj, i + 1, j - 1);
                                                if (collided == null)
                                                {
                                                    collided = CheckCollisionMatrix(currentObj, i, j - 1);
                                                }
                                                if (collided == null)
                                                {
                                                    collided = CheckCollisionMatrix(currentObj, i + 1, j);
                                                }
                                            }
                                            else
                                            {
                                                collided = CheckCollisionMatrix(currentObj, i, j - 1);
                                            }
                                        }
                                        else if (i + 1 < collidableMatrix.Count)
                                        {
                                            collided = CheckCollisionMatrix(currentObj, i + 1, j);
                                        }
                                        break;

                                    case 5:
                                        if (j != 0)
                                        {
                                            collided = CheckCollisionMatrix(currentObj, i, j - 1);
                                        }
                                        break;

                                    case 6:
                                        if (j != 0)
                                        {
                                            if (i != 0)
                                            {
                                                collided = CheckCollisionMatrix(currentObj, i - 1, j - 1);
                                                if (collided == null)
                                                {
                                                    collided = CheckCollisionMatrix(currentObj, i, j - 1);
                                                }
                                                if (collided == null)
                                                {
                                                    collided = CheckCollisionMatrix(currentObj, i - 1, j);
                                                }
                                            }
                                            else
                                            {
                                                collided = CheckCollisionMatrix(currentObj, i, j - 1);
                                            }
                                        }
                                        else if (i != 0)
                                        {
                                            collided = CheckCollisionMatrix(currentObj, i - 1, j);
                                        }
                                        break;

                                    case 7:
                                        if (i != 0)
                                        {
                                            collided = CheckCollisionMatrix(currentObj, i - 1, j);
                                        }
                                        break;

                                    case 8:
                                        if (j + 1 < collidableMatrix.Count)
                                        {
                                            if (i != 0)
                                            {
                                                collided = CheckCollisionMatrix(currentObj, i - 1, j + 1);
                                                if (collided == null)
                                                {
                                                    collided = CheckCollisionMatrix(currentObj, i - 1, j);
                                                }
                                                if (collided == null)
                                                {
                                                    collided = CheckCollisionMatrix(currentObj, i, j + 1);
                                                }
                                            }
                                            else
                                            {
                                                collided = CheckCollisionMatrix(currentObj, i, j + 1);
                                            }
                                        }
                                        else if (i != 0)
                                        {
                                            collided = CheckCollisionMatrix(currentObj, i - 1, j);
                                        }
                                        break;



                                    default:
                                        break;
                                    }
                                    if (collided != null)
                                    {
                                        if (collided.GetType() == typeof(Bullet) || currentObj.GetType() == typeof(Bullet))
                                        {
                                            AddScore();
                                        }
                                        collided.OnCollision();
                                        currentObj.OnCollision();
                                    }
                                }
                            }


                            // ok I know bullets out of asteroids is not a real optimazation, but it works
                            // if (currentObj.GetType() == typeof(Asteroid) || currentObj.GetType() == typeof(Bullet))
                            // {
                            if (currentObj.inFrustum(top, bottom, left, right))
                            {
                                if (asteroidsInFrustum4x4.Count < 1023) //I know it could be better but it's not really possible that there are more than 1023 obj on screen in this case
                                {
                                    asteroidsInFrustum4x4.Add(currentObj.Matrice());
                                }
                            }
                            // }
                        }
                        else
                        {
                            //respawning asteroids
                            if (currentObj.spawned == true)
                            {
                                currentObj.spawned   = false;
                                currentObj.xPosition = UnityEngine.Random.Range(matrixSize / 2 - asteroidAmountX / 2, matrixSize / 2 + asteroidAmountX / 2);

                                if (currentObj.xPosition < left || currentObj.xPosition > right || bottom > asteroidAmountX / 2 + matrixSize / 2 || top < 0)
                                {
                                    currentObj.yPosition = UnityEngine.Random.Range(matrixSize / 2 - asteroidAmountX / 2, matrixSize / 2 + asteroidAmountX / 2);
                                }
                                else
                                {
                                    do
                                    {
                                        currentObj.yPosition = UnityEngine.Random.Range(matrixSize / 2 - asteroidAmountX / 2, matrixSize / 2 + asteroidAmountX / 2);
                                    } while (!(bottom > currentObj.yPosition || top < currentObj.yPosition));
                                }
                                currentObj.simulated = true;
                                collidableMatrix[(int)currentObj.xPosition][(int)currentObj.yPosition].Add(currentObj);
                                collidableMatrix[i][j].Remove(currentObj);

                                currentObj.velocity = new Vector2(UnityEngine.Random.Range(-asteroidMaxV, asteroidMaxV), UnityEngine.Random.Range(-asteroidMaxV, asteroidMaxV));
                                UpdateUnviableGreyzone((int)currentObj.xPosition, (int)currentObj.yPosition, matrixSize, currentObj);
                            }
                        }
                    }
                }
            }
            loopUpdateCycle = !loopUpdateCycle;// ensures no objects move twice in cycle
            playerGObj.transform.SetPositionAndRotation(new Vector3(playerObj.xPosition, playerObj.yPosition, 0), Quaternion.LookRotation(Vector3.forward, new Vector3(playerDirection.x, playerDirection.y, 0)));
            mainCamTrans.position = new Vector3(playerObj.xPosition, playerObj.yPosition, -10);
            Graphics.DrawMeshInstanced(asteroidMesh, 0, asteroidMaterial, asteroidsInFrustum4x4);
        }
Пример #5
0
 void UpdateObject(CollidableObj obj)
 {
     obj.UpdateObject();
 }