Пример #1
0
    // Draw the player's UI
    void OnGUI()
    {
        // Get a UI scaling variable
        float UIScale = Screen.width / 2560f;

        // Draw the panel UI if need be
        if (_LevelManager.ViewingPanel)
        {
            // Draw a 'toolbox' at the top of the screen
            // First the tool box itself
            GUI.DrawTexture(new Rect(0, 0, 2560f * UIScale, 360f * UIScale), ToolboxImage);

            // Then the tools. Loop through the 'all logic gates' list
            float ToolImageWidth = 240f * UIScale;
            float ToolBaseX      = 50f * UIScale;

            // AND Gate
            HandleToolClick(true, "AND", UIScale, ToolBaseX, 0, Gates.Gate_AND.GateSprite.texture);

            // OR Gate
            HandleToolClick(true, "OR", UIScale, ToolBaseX, 1, Gates.Gate_OR.GateSprite.texture);

            // XOR Gate
            HandleToolClick(true, "XOR", UIScale, ToolBaseX, 2, Gates.Gate_XOR.GateSprite.texture);

            // NAND Gate
            HandleToolClick(true, "NAND", UIScale, ToolBaseX, 3, Gates.Gate_NAND.GateSprite.texture);

            // NOR Gate
            HandleToolClick(true, "NOR", UIScale, ToolBaseX, 4, Gates.Gate_NOR.GateSprite.texture);

            // XNOR Gate
            HandleToolClick(true, "XNOR", UIScale, ToolBaseX, 5, Gates.Gate_XNOR.GateSprite.texture);

            // NOT Gate
            HandleToolClick(true, "NOT", UIScale, ToolBaseX, 6, Gates.Gate_NOT.GateSprite.texture);

            // Wire tool
            HandleToolClick(false, "Wire", UIScale, ToolBaseX, 7, WireToolIcon);

            // Return to ship
            HandleToolClick(false, "Ship", UIScale, ToolBaseX, 8, ShipIcon);

            // Render tooltips
            // AND Gate
            HandleTooltip("AND", UIScale, ToolBaseX, 0);

            // OR Gate
            HandleTooltip("OR", UIScale, ToolBaseX, 1);

            // XOR Gate
            HandleTooltip("XOR", UIScale, ToolBaseX, 2);

            // NAND Gate
            HandleTooltip("NAND", UIScale, ToolBaseX, 3);

            // NOR Gate
            HandleTooltip("NOR", UIScale, ToolBaseX, 4);

            // XNOR Gate
            HandleTooltip("XNOR", UIScale, ToolBaseX, 5);

            // NOT Gate
            HandleTooltip("NOT", UIScale, ToolBaseX, 6);

            // Wire tool
            HandleTooltip("Wire", UIScale, ToolBaseX, 7);

            // Return to ship
            HandleTooltip("Ship", UIScale, ToolBaseX, 8);

            // Render the inputs and outputs
            for (int i = 0; i < _Gates.InputCount; i++)
            {
                // Calculate positions
                float ButtonX     = SourceBasePos.x;
                float ButtonY     = SourceBasePos.y + 90f * i * UIScale;
                float ButtonWidth = 28 * UIScale;

                // Draw the button. Stay consistent in the colour and icons as the rest of the gates
                if (GUI.Button(new Rect(ButtonX, ButtonY, ButtonWidth, ButtonWidth), "", OutputButtonStyle) && CurrentTool == PlayerTool.CreateWire)
                {
                    // If we aren't already dragging, make it so
                    if (!IsDraggingWire)
                    {
                        // Play sound
                        PickupSound.Play();

                        // Pickup wire
                        IsDraggingWire     = true;
                        DraggingOutput     = false;
                        DraggingSource     = true;
                        DraggingEnd        = false;
                        GateDraggingFrom   = null;
                        SourceDraggingFrom = _Gates.InputConnections[i];
                        DraggingOrigin     = new Vector2(ButtonX, Screen.height - ButtonY);
                    }
                    else if (IsDraggingWire && !DraggingOutput && !DraggingSource && !DraggingEnd)
                    {
                        // Play sound
                        DropSound.Play();

                        // Stop dragging wire
                        IsDraggingWire = false;

                        // Connect the source
                        _Gates.InputConnections[i].Gates.Add(GateDraggingFrom);
                        _Gates.InputConnections[i].GateInputIDs.Add(GateDraggingFromInputID);

                        // Connect the gate
                        GateDraggingFrom.Sources[GateDraggingFromInputID] = _Gates.InputConnections[i];

                        // Create a wire
                        LineRenderer NewWire = CreateSourceEndWire(true, ButtonWidth, ButtonX, ButtonY);

                        // Parent it to the gate
                        NewWire.transform.parent = GateDraggingFrom.transform;

                        // Assign it to the gate
                        if (DraggingOutput)
                        {
                            // Assign it as an end wire
                            GateDraggingFrom.EndWire = NewWire;
                        }
                        else
                        {
                            // Assign it as a source wire
                            GateDraggingFrom.SourceWires[GateDraggingFromInputID] = NewWire;
                        }
                    }
                }

                // Handle the tooltip
                HandleTooltip(_Gates.InputConnections[i].Label, UIScale, 0, i, _Gates.InputConnections[i].Description, true);
            }

            // Render outputs
            for (int i = 0; i < _Gates.OutputCount; i++)
            {
                // Calculate positions
                float ButtonX     = OutBasePos.x;
                float ButtonY     = OutBasePos.y + 90f * i * UIScale;
                float ButtonWidth = 28 * UIScale;

                // Draw the button. Stay consistent in the colour and icons as the rest of the gates
                if (GUI.Button(new Rect(ButtonX, ButtonY, ButtonWidth, ButtonWidth), "", InputButtonStyle) && CurrentTool == PlayerTool.CreateWire)
                {
                    // If we aren't already dragging, make it so
                    if (!IsDraggingWire)
                    {
                        // Play sound
                        PickupSound.Play();

                        // Pickup wire
                        IsDraggingWire     = true;
                        DraggingOutput     = false;
                        DraggingSource     = false;
                        DraggingEnd        = true;
                        GateDraggingFrom   = null;
                        SourceDraggingFrom = _Gates.OutputConnections[i];
                        DraggingOrigin     = new Vector2(ButtonX, Screen.height - ButtonY);
                    }
                    else if (IsDraggingWire && DraggingOutput && !DraggingSource && !DraggingEnd)
                    {
                        // Sever connections first if the output is connected already
                        if (_Gates.OutputConnections[i].Gates.Count > 0)
                        {
                            _Gates.OutputConnections[i].RemoveAllConnections();
                        }

                        // Play sound
                        DropSound.Play();

                        // Stop dragging wire
                        IsDraggingWire = false;

                        // Connect the source
                        _Gates.OutputConnections[i].Gates.Add(GateDraggingFrom);
                        _Gates.OutputConnections[i].GateInputIDs.Add(GateDraggingFromInputID);

                        // Connect the gate
                        GateDraggingFrom.EndConnection = _Gates.OutputConnections[i];

                        // Create a wire
                        LineRenderer NewWire = CreateSourceEndWire(false, ButtonWidth, ButtonX, ButtonY);

                        // Parent it to the gate
                        NewWire.transform.parent = GateDraggingFrom.transform;

                        // Assign it as an end wire
                        GateDraggingFrom.EndWire = NewWire;
                    }
                }

                // Handle the tooltip
                HandleTooltip(_Gates.OutputConnections[i].Label, UIScale, 0, i, _Gates.OutputConnections[i].Description, true, false);
            }

            // Fetch a local copy of the gates list
            List <GateBehaviour> GateList = Gates.CurrentGates;

            // Loop through each gate and draw 4 buttons; one for each input,
            // one for the output, and one to delete it
            for (int i = 0; i < GateList.Count; i++)
            {
                // Get the screen position of the logic gate
                Vector2 GatePosition = Camera.main.WorldToScreenPoint(GateList[i].transform.position);
                GatePosition.y = Screen.height - GatePosition.y;

                // Draw the output button
                float OutputX     = GatePosition.x + 46f * UIScale;
                float OutputY     = GatePosition.y + 16f * UIScale;
                float CrossY      = GatePosition.y - 44f * UIScale;
                float OutputWidth = 28 * UIScale;

                // Toggle the player dragging status if clicked on
                if (GUI.Button(new Rect(OutputX, OutputY, OutputWidth, OutputWidth), "", OutputButtonStyle) && CurrentTool == PlayerTool.CreateWire)
                {
                    HandleOutputClicking(OutputX, OutputY, OutputWidth, i);
                }

                // Now draw the input buttons
                if (!GateList[i].LogicGate.HasOneInput)
                {
                    // Two inputs
                    float InputX     = GatePosition.x - 68f * UIScale;
                    float InputY1    = GatePosition.y - 44f * UIScale;
                    float InputY2    = GatePosition.y + 16f * UIScale;
                    float InputWidth = 28 * UIScale;

                    // Handle clicking (button 0)
                    HandleInputClicking(InputX, InputY1, InputWidth, i, 0);

                    // Handle clicking (button 1)
                    HandleInputClicking(InputX, InputY2, InputWidth, i, 1);
                }
                else
                {
                    // One input
                    float InputX     = GatePosition.x - 68f * UIScale;
                    float InputY     = GatePosition.y - 14f * UIScale;
                    float InputWidth = 28 * UIScale;

                    // Handle clicking
                    HandleInputClicking(InputX, InputY, InputWidth, i, 0);
                }

                // Gate delete button
                if (GUI.Button(new Rect(OutputX, CrossY, OutputWidth, OutputWidth), "", CrossButtonStyle))
                {
                    // Play sound
                    DropSound.Play();

                    // Destroy gate
                    Gates.DestroyGate(Gates.GetGateID(Gates.CurrentGates[i]));
                }
            }
        }
        else
        {
            // Setup a GUI style
            ToolMiscStyle.normal.background = PanelIcon;
            ToolMiscStyle.hover.background  = PanelIconHover;
            ToolMiscStyle.active.background = PanelIcon;

            // Create the button
            if (GUI.Button(new Rect(50f * UIScale, 50f * UIScale, 160f * UIScale, 160f * UIScale), "", ToolMiscStyle))
            {
                // Play sound
                PickupSound.Play();

                // View panel
                _LevelManager.ViewingPanel = true;
                _LevelManager.RecalculateUI();
            }
        }
    }