예제 #1
0
        private void OnCollisionEnter2D(Collision2D collision)
        {
            Bubble bubble     = collision.gameObject.GetComponent <Bubble>();
            bool   hitTopWall = collision.gameObject.tag.Equals("TopWall");

            if (bubble == null && hitTopWall == false)
            {
                return;
            }
            _rigidbody.bodyType = RigidbodyType2D.Static;
            if (_hasHitSomething == false)
            {
                HitSomething.Invoke(this, transform.position);
                _hasHitSomething = true;
            }
        }
예제 #2
0
        private Vector2Int FindPositionOfBubble(Bubble bubble)
        {
            Vector2Int result = Vector2Int.zero;

            for (int rowIndex = 0; rowIndex < _height; rowIndex++)
            {
                for (int columnIndex = 0; columnIndex < _width; columnIndex++)
                {
                    if (_grid[rowIndex, columnIndex] == bubble)
                    {
                        result = new Vector2Int(rowIndex, columnIndex);
                    }
                }
            }

            return(result);
        }
예제 #3
0
 public void ShiftDown(int amount)
 {
     // Searching from bottom up.
     for (int rowIndex = _height - 1; rowIndex >= 0; rowIndex--)
     {
         for (int columnIndex = 0; columnIndex < _width; columnIndex++)
         {
             Bubble currentBubble = _grid[rowIndex, columnIndex];
             if (currentBubble == null)
             {
                 continue;
             }
             if (rowIndex == _height - 1)
             {
                 GameManager.Instance.GameState = StateType.GameOver; break;
             }
             _grid[rowIndex + 1, columnIndex]  = currentBubble;
             _grid[rowIndex, columnIndex]      = null;
             currentBubble.transform.position += Vector3.down * amount;
         }
     }
 }
예제 #4
0
 public bool CompareTypes(Bubble other)
 {
     return(_type == other.Type);
 }
예제 #5
0
 public void ListenForCollision(Bubble bubble)
 {
     bubble.HitSomething.AddListener(AddAndSnap);
 }
예제 #6
0
 public void AddToGrid(Vector2Int position, Bubble bubble)
 {
     _grid[position.x, position.y] = bubble;
 }
예제 #7
0
        private List <Bubble> FindNeighbors(Vector2Int location, bool isCheckingColor = true)
        {
            List <Bubble> results = new List <Bubble>();

            Bubble thisBubble = _grid[location.x, location.y];

            if (thisBubble == null)
            {
                return(null);
            }

            // Check up.
            if (location.x > 0)
            {
                Bubble up = _grid[location.x - 1, location.y];
                if (up != null)
                {
                    bool isMatch = thisBubble.CompareTypes(up);
                    if (isMatch || !isCheckingColor)
                    {
                        results.Add(up);
                    }
                }
            }

            // Check down.
            if (location.x < _height - 1)
            {
                Bubble down = _grid[location.x + 1, location.y];
                if (down != null)
                {
                    bool isMatch = thisBubble.CompareTypes(down);
                    if (isMatch || !isCheckingColor)
                    {
                        results.Add(down);
                    }
                }
            }

            // Check left.
            if (location.y > 0)
            {
                Bubble left = _grid[location.x, location.y - 1];
                if (left != null)
                {
                    bool isMatch = thisBubble.CompareTypes(left);
                    if (isMatch || !isCheckingColor)
                    {
                        results.Add(left);
                    }
                }
            }

            // Check right.
            if (location.y < _width - 1)
            {
                Bubble right = _grid[location.x, location.y + 1];
                if (right != null)
                {
                    bool isMatch = thisBubble.CompareTypes(right);
                    if (isMatch || !isCheckingColor)
                    {
                        results.Add(right);
                    }
                }
            }

            // Check diagonal up right.
            if (location.x > 0 && location.y < _width - 1)
            {
                Bubble upRight = _grid[location.x - 1, location.y + 1];
                if (upRight != null)
                {
                    bool isMatch = thisBubble.CompareTypes(upRight);
                    if (isMatch)
                    {
                        results.Add(upRight);
                    }
                }
            }

            // Check diagonal down right.
            if (location.x < _height - 1 && location.y < _width - 1)
            {
                Bubble downRight = _grid[location.x + 1, location.y + 1];
                if (downRight != null)
                {
                    bool isMatch = thisBubble.CompareTypes(downRight);
                    if (isMatch)
                    {
                        results.Add(downRight);
                    }
                }
            }

            // Check diagonal down left.
            if (location.x < _height - 1 && location.y > 0)
            {
                Bubble downLeft = _grid[location.x + 1, location.y - 1];
                if (downLeft != null)
                {
                    bool isMatch = thisBubble.CompareTypes(downLeft);
                    if (isMatch)
                    {
                        results.Add(downLeft);
                    }
                }
            }

            // Check diagonal up left.
            if (location.x > 0 && location.y > 0)
            {
                Bubble upLeft = _grid[location.x - 1, location.y - 1];
                if (upLeft != null)
                {
                    bool isMatch = thisBubble.CompareTypes(upLeft);
                    if (isMatch)
                    {
                        results.Add(upLeft);
                    }
                }
            }

            return(results);
        }
예제 #8
0
        private void AddAndSnap(Bubble bubble, Vector3 positionOnCollision)
        {
            Vector2Int newPos = new Vector2Int(Mathf.RoundToInt(positionOnCollision.x), Mathf.RoundToInt(positionOnCollision.y));

            StartCoroutine(SnapToGrid(bubble.transform, newPos));
        }