Exemplo n.º 1
0
    // Methods

    public void CreatePuzzle(Puzzle puzzle)
    {
        m_Puzzle = puzzle;

        puzzle.addNode        += AddNode;
        puzzle.removeNode     += RemoveNode;
        puzzle.addEdge        += AddEdge;
        puzzle.removeEdge     += RemoveEdge;
        puzzle.addElement     += AddElement;
        puzzle.removeElement  += RemoveElement;
        puzzle.addItem        += AddItem;
        puzzle.removeItem     += RemoveItem;
        puzzle.addReceiver    += AddReceiver;
        puzzle.removeReceiver += RemoveReceiver;

        if (s_TempDragEdge)
        {
            Destroy(s_TempDragEdge.gameObject);
        }
        s_TempDragEdge = Instantiate(edgePrefab) as EdgeFront;
        s_TempDragEdge.Set(this, null);
        s_TempDragEdge.gameObject.SetActive(false);
        s_TempDragEdge.transform.parent = transform;

        if (s_TempDragNode)
        {
            Destroy(s_TempDragNode.gameObject);
        }
        s_TempDragNode = Instantiate(nodePrefab) as NodeFront;
        s_TempDragNode.Set(this, null);
        s_TempDragNode.gameObject.SetActive(false);
        s_TempDragNode.transform.parent = transform;

        s_TempDragReceiver = new PuzzleGate();
    }
Exemplo n.º 2
0
 void HandleTriggerDrag()
 {
     if (Input.GetMouseButtonUp(0))
     {
         s_DragStartNode.RemoveReceiver(s_TempDragReceiver);
         if (hovered != null && hovered.container.element is PuzzleReceiverElement)
         {
             puzzle.AddReceiver(s_DragStartNode.node, hovered.container.element as PuzzleReceiverElement);
         }
         s_DragStartNode = null;
     }
     else
     {
         Vector2 pos = GetMousePos();
         if (hovered != null && hovered.container.element is PuzzleReceiverElement)
         {
             pos = hovered.GetElementPosition();
             s_DragStartNode.UpdateReceiver(s_TempDragReceiver, pos, false);
         }
         else
         {
             s_DragStartNode.UpdateReceiver(s_TempDragReceiver, pos, true);
         }
     }
 }
Exemplo n.º 3
0
    // Callbacks

    public void AddNode(PuzzleNode node)
    {
        NodeFront nodeFront = Instantiate(nodePrefab) as NodeFront;

        nodeFront.transform.parent = transform;
        nodeFront.gameObject.name  = "Node " + node.name;
        nodeFront.Set(this, node);
        nodes.Add(nodeFront);
    }
Exemplo n.º 4
0
 void UpdatePosition()
 {
     if (edge != null)
     {
         NodeFront a = puzzle.GetNode(edge.nodeA);
         NodeFront b = puzzle.GetNode(edge.nodeB);
         SetPositions(
             a.transform.position,
             b.transform.position
             );
     }
 }
Exemplo n.º 5
0
    public override Vector3 GetElementPosition()
    {
        if (edge == null)
        {
            return(Vector3.zero);
        }

        NodeFront a = puzzle.GetNode(edge.nodeA);
        NodeFront b = puzzle.GetNode(edge.nodeB);

        return(Vector3.Lerp(a.transform.position, b.transform.position, 0.5f));
    }
Exemplo n.º 6
0
 void HandleMoveDrag()
 {
     if (Input.GetMouseButtonUp(0))
     {
         s_DragStartNode.node.SetPosition(VectorToPoint(Snap(GetMousePos())));
         s_DragStartNode = null;
     }
     else
     {
         if (s_DraggingThresholdPassed)
         {
             s_DragStartNode.SetPosition(GetMousePos() - s_MouseDownWorldPos + s_MouseDownNodePos);
         }
     }
 }
Exemplo n.º 7
0
    public void OnContainerMouseDown(ContainerFront container)
    {
        if (playing)
        {
            return;
        }
        s_Selected                = container;
        s_MouseDownWorldPos       = GetMousePos();
        s_MouseDownNodePos        = container.transform.position;
        s_DraggingThresholdPassed = false;

        NodeFront nodeFront = container as NodeFront;

        if (tool == MouseTool.Move)
        {
            s_DragStartNode = nodeFront;
        }

        if (tool == MouseTool.Connect)
        {
            if (nodeFront != null)
            {
                s_DragStartNode = nodeFront;
                s_TempDragEdge.gameObject.SetActive(true);
                s_TempDragEdge.transform.position   = container.transform.position;
                s_TempDragEdge.transform.localScale = new Vector3(0.1f, 1, 1);
            }
        }

        if (tool == MouseTool.Trigger)
        {
            if (nodeFront != null && (nodeFront.container.element as PuzzleTriggerElement) != null)
            {
                s_DragStartNode = nodeFront;
                nodeFront.AddReceiver(s_TempDragReceiver);
            }
        }
    }
Exemplo n.º 8
0
    void StatesGUI()
    {
        Rect area = cam.pixelRect.FlipY();

        GUILayout.BeginArea(area);
        area.position = Vector2.zero;
        int  spacing     = kSpacing;
        Rect optionsRect = new Rect(area.width - 150 - spacing, spacing, 150, kButtonHeight);

        GUI.enabled = puzzleFront.HasUndo();
        if (GUI.Button(GetRectHNeg(ref optionsRect, 70, spacing), "Undo"))
        {
            puzzleFront.Undo();
        }

        if (GUI.Button(GetRectHNeg(ref optionsRect, 70, spacing), "Restart"))
        {
            puzzleFront.Reset();
        }
        GUI.enabled = true;

        showHints = GUI.Toggle(GetRectHNeg(ref optionsRect, 150, spacing), showHints, "Show Hints");

        RefreshStatesGUI();

        if (Time.time > puzzleFront.doneTime)
        {
            for (int i = 0; i < puzzleFront.nodes.Count; i++)
            {
                NodeFront  nodeFront  = puzzleFront.nodes[i];
                PuzzleNode actionNode = nodeFront.node;
                int        nodeIndex  = puzzle.nodes.IndexOf(actionNode);
                if (actionsPerNode[nodeIndex] == null)
                {
                    continue;
                }

                int actionCount = actionsPerNode[nodeIndex].Count;

                Vector3 nodePosition = nodeFront.transform.position - Vector3.up * 0.2f;
                Vector2 pos          = cam.WorldToScreenPoint(nodePosition);
                pos.y = cam.pixelRect.height - pos.y;
                pos  -= cam.pixelRect.min;

                GUI.color = new Color(1, 1, 1, 0.7f);
                Rect rect = new Rect(pos.x - 60, pos.y, 120, 24 + kButtonHeight * actionCount);
                GUI.Box(rect, string.Empty, "OptionBox");

                for (int j = 0; j < actionsPerNode[i].Count; j++)
                {
                    PuzzleStateEdge childAction = actionsPerNode[i][j];
                    GUI.color        = Color.white;
                    GUI.contentColor = Color.green;
                    if (showHints)
                    {
                        // Show as green if goal path that's either
                        // further along or we are not currently on goal path.
                        if (childAction.toNode.goalPath && (childAction.directPath || !state.goalPath))
                        {
                            GUI.color = Color.green;
                        }
                        else if (childAction.toNode.stuck)
                        {
                            GUI.color = Color.red;
                        }
                    }

                    rect = new Rect(pos.x - 58, pos.y + 22 + kButtonHeight * j, 116, kButtonHeight);
                    if (GUI.Button(rect, childAction.name, "MenuOption"))
                    {
                        puzzleFront.GoToState(childAction.toNode);
                    }
                }
            }
            GUI.color = Color.white;
        }

        GUILayout.EndArea();
    }
Exemplo n.º 9
0
    void HandleEdgeDrag()
    {
        if (Input.GetMouseButtonUp(0))
        {
            s_TempDragEdge.gameObject.SetActive(false);
            if (hovered is NodeFront && hovered != s_DragStartNode)
            {
                NodeFront hoveredNode = (hovered as NodeFront);

                // Add new node and edge to it.
                if (hovered == s_TempDragNode)
                {
                    PuzzleNode newNode = new PuzzleNode();
                    newNode.SetPosition(VectorToPoint(Snap(hoveredNode.transform.position)));
                    puzzle.AddNode(newNode);

                    foreach (NodeFront node in nodes)
                    {
                        if (node.node == newNode)
                        {
                            s_Selected = node;
                        }
                    }

                    PuzzleEdge edge = new PuzzleEdge(s_DragStartNode.node, newNode);
                    puzzle.AddEdge(edge);
                }

                // Add edge to existing node.
                else
                {
                    PuzzleEdge edge = new PuzzleEdge(s_DragStartNode.node, hoveredNode.node);
                    puzzle.AddEdge(edge);
                    foreach (EdgeFront edgeFront in edges)
                    {
                        if (edgeFront.edge == edge)
                        {
                            s_Selected = edgeFront;
                        }
                    }
                }
            }
            s_DragStartNode = null;
            s_TempDragNode.gameObject.SetActive(false);
        }
        else
        {
            Vector2 pos = GetMousePos();
            if (hovered is NodeFront)
            {
                pos = hovered.transform.position;
            }
            s_TempDragEdge.SetPositions(s_TempDragEdge.transform.position, pos);

            Vector2 snapped  = Snap(pos);
            Point   position = VectorToPoint(snapped);
            bool    validNew = true;
            if (Vector2.Distance(snapped, pos * 0.5f) > 0.25f)
            {
                validNew = false;
            }
            else
            {
                foreach (PuzzleNode node in puzzle.nodes)
                {
                    if (node.position == position)
                    {
                        validNew = false;
                        break;
                    }
                }
            }

            s_TempDragNode.gameObject.SetActive(validNew);
            s_TempDragNode.SetPoint(position);
        }
    }