コード例 #1
0
        private void OnBrickClick(Brick brick)
        {
            if (GameStateController.GameState != GameState.Play)
            {
                return;
            }

            var triggered     = new HashSet <Brick>();
            var bricksToCheck = new Queue <Brick>();
            var checkedBricks = new HashSet <Brick>();

            bricksToCheck.Enqueue(brick);
            while (bricksToCheck.Count > 0)//check all neighbours to trigger by type
            {
                var targetBrick = bricksToCheck.Dequeue();
                if (checkedBricks.Contains(targetBrick))
                {
                    continue;
                }
                triggered.Add(targetBrick);
                //check left
                if (targetBrick.PosX > 0)
                {
                    var leftBrick = bricks[targetBrick.PosY][targetBrick.PosX - 1];
                    if (leftBrick != null && targetBrick.IsTriggerWith(leftBrick))
                    {
                        bricksToCheck.Enqueue(leftBrick);
                    }
                }
                //check right
                if (targetBrick.PosX < Width - 1)
                {
                    var rightBrick = bricks[targetBrick.PosY][targetBrick.PosX + 1];
                    if (rightBrick != null && targetBrick.IsTriggerWith(rightBrick))
                    {
                        bricksToCheck.Enqueue(rightBrick);
                    }
                }
                //check top
                if (targetBrick.PosY < Height - 1)
                {
                    var topBrick = bricks[targetBrick.PosY + 1][targetBrick.PosX];
                    if (topBrick != null && targetBrick.IsTriggerWith(topBrick))
                    {
                        bricksToCheck.Enqueue(topBrick);
                    }
                }
                //check bottom
                if (targetBrick.PosY > 0)
                {
                    var bottomBrick = bricks[targetBrick.PosY - 1][targetBrick.PosX];
                    if (bottomBrick != null && targetBrick.IsTriggerWith(bottomBrick))
                    {
                        bricksToCheck.Enqueue(bottomBrick);
                    }
                }
                checkedBricks.Add(targetBrick);
            }
            if (triggered.Count < countToTrigger)
            {
                return;
            }

            GameStateController.SetState(GameState.AnimateFall);

            var activatedBricks = new HashSet <Brick>();
            var collectedBricks = new HashSet <Brick>();

            //Execute triggered bricks behaviours
            foreach (var triggeredBrick in triggered)
            {
                Activate(triggeredBrick, activatedBricks, collectedBricks);
            }

            //Collect triggered bricks
            foreach (var collectedBrick in collectedBricks)
            {
                bricks[collectedBrick.PosY][collectedBrick.PosX] = null;
                collectedBrick.OnClick -= OnBrickClick;
                GameStateController.CollectResources(collectedBrick.Resources);
                GameObject.DestroyImmediate(collectedBrick.gameObject);
            }
            currentSpeed = fallingSpeed;
            RecalculatePositions();
        }