public LevelSelectButton(RectCollider collider, LevelSelectScrollBar scrollBar, int levelNo)
            : base(collider)
        {
            LevelNo = levelNo;
            ScrollBar = scrollBar;

            if (LoadedLevelManager.HighestUnlockedLevel == levelNo)
            {
                ButtonSprite = new Sprite(Assets.LevelSelect.Images.UnclearedLevelButton);
            }
            else if (LoadedLevelManager.HighestUnlockedLevel > levelNo)
            {
                ButtonSprite = new Sprite(Assets.LevelSelect.Images.ClearedLevelButton);
            }
            else
            {
                ButtonSprite = new Sprite(Assets.LevelSelect.Images.LockedLevelButton);
                LockInteraction();
                unlockedLevel = false;
            }
            LevelNoFont  = Assets.LevelSelect.Fonts.LevelNo;

            ButtonSprite.Position = collider.TopLeft;
            var textDimensions = LevelNoFont.MeasureString((LevelNo + 1).ToString());
            TextPosition = (ButtonSprite.Bounds - textDimensions) / 2f + collider.TopLeft;
        }
        public override void Construct(MultiformTransmissionData args)
        {
            // We have to set this value to false so that it doesn't automatically start out as
            // true when we reconstruct this multiform, which would cause the player to automatically
            // go back into the last level they selected.
            buttonPressed = false;

            HasScrollBar = false;

            int BUTTON_WIDTH  = Assets.LevelSelect.Images.ClearedLevelButton.Width;
            int BUTTON_HEIGHT = Assets.LevelSelect.Images.ClearedLevelButton.Height;

            int xOffset = INITIAL_LEVEL_SELECT_X_OFFSET;
            int yOffset = INITIAL_LEVEL_SELECT_Y_OFFSET;

            int rowNum          = LoadedLevelManager.SequentialLevels.Length / BUTTONS_PER_ROW,
                totalWidth      = (BUTTON_WIDTH + LEVEL_SELECT_BUTTON_GAP_X - 2) * BUTTONS_PER_ROW,
                totalHeight     = rowNum * BUTTON_HEIGHT + (rowNum - 1) * LEVEL_SELECT_BUTTON_GAP_Y + 200,
                scrollBarHeight = DisplayManager.WindowResolution.Height - 2 * INITIAL_LEVEL_SELECT_Y_OFFSET;

            LevelSelectScrollBar scrollBar = null;

            // We only add a scrollbar if there is not enough room onscreen to fit everything. This occurs
            // when the total vertical space taken up by the level select buttons is greater than that which
            // would've been taken up by the scrollbar.
            if (totalHeight > scrollBarHeight)
            {
                var topLeft = new Vector2(xOffset + totalWidth + 20, yOffset - 10);
                scrollBar = new LevelSelectScrollBar(topLeft, scrollBarHeight, totalHeight, 12, true);
                RegisterForm(ScrollBarFormName, scrollBar);
                HasScrollBar = true;
            }

            // Construct all the buttons.
            int xIndex, yIndex;
            LevelSelectButton button;
            for (int i = 0; i < LoadedLevelManager.SequentialLevels.Length; i++)
            {
                xIndex = i % BUTTONS_PER_ROW;
                yIndex = i / BUTTONS_PER_ROW;
                button = new LevelSelectButton(
                    new RectCollider(
                        xOffset + xIndex * (BUTTON_WIDTH + LEVEL_SELECT_BUTTON_GAP_X),
                        yOffset + yIndex * (BUTTON_HEIGHT + LEVEL_SELECT_BUTTON_GAP_Y),
                        BUTTON_WIDTH,
                        BUTTON_HEIGHT),
                    scrollBar,
                    i);
                RegisterForm(button);
            }

            RegisterForm(BackButtonFormName,
                new GUIButton(BackButtonInfo, BackButtonBottomLeft, PositionType.BottomLeft));

            RegisterForm(new ClickParticleSpawnerForm());

            FadeIn(20, Color.White, Update_Main, Render_Main);
        }