// 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(); }
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); } } }
// 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); }
void UpdatePosition() { if (edge != null) { NodeFront a = puzzle.GetNode(edge.nodeA); NodeFront b = puzzle.GetNode(edge.nodeB); SetPositions( a.transform.position, b.transform.position ); } }
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)); }
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); } } }
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); } } }
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(); }
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); } }