private void OnDragBeganOnDotHandler(object grid) { var cellView = (GridCellView)grid; _currentDotOrigin = cellView as DotView; var gridDatum = cellView.GridDatum; if (_lineLookup.ContainsKey(gridDatum.ColorData.ColorId)) { _currentLineRenderer = _lineLookup[gridDatum.ColorData.ColorId]; if (_completedLines.ContainsKey(gridDatum.ColorData.ColorId)) { ClearLine(gridDatum.ColorData.ColorId); } } else { _currentLineRenderer = Instantiate(_linePrefab, transform, false); _currentLineRenderer.startColor = _currentLineRenderer.endColor = gridDatum.ColorData.UnityColor; _lineLookup.Add(gridDatum.ColorData.ColorId, _currentLineRenderer); } var lineData = new List <Vector3Int>(); var gridData = new List <GridDatum>(); lineData.Add(GridUtility.GetLocalPositionFromIndices(gridDatum.PosX, gridDatum.PosY)); UpdateLine(_currentLineRenderer, lineData); _currentGridDatum = gridDatum; _currentLineColorData = gridDatum.ColorData; _currentLineData = lineData; _currentLineGridData = gridData; _lineDrawState = LineDrawState.Drawing; }
public void OnDrawLineEnd(TKButtonRecognizer t) { if (lineEditMode == LineEditMode.Camera || lineEditMode == LineEditMode.Erase) { return; } if (lineDrawState != LineDrawState.Start) { return; } linePos2 = t.touchLocation(); lineDrawState = LineDrawState.None; if ((linePos1 - linePos2).magnitude <= 10) { return; } linePos1 = Camera.main.ScreenToWorldPoint(linePos1); linePos2 = Camera.main.ScreenToWorldPoint(linePos2); LineWorld.main.AddLine(linePos1, linePos2, lineType); }
public void SetEditMode(LineEditMode e) { lineEditMode = e; HUD.main.SetCurrentTool(e); lineDrawState = LineDrawState.None; SetInputSystem(); }
private void FinishDrawing() { _currentDotOrigin = null; _currentGridDatum = null; _currentLineData = null; _currentLineRenderer = null; _currentLineData = null; _lineDrawState = LineDrawState.None; }
public void OnDrawLineStart(TKButtonRecognizer t) { if (lineEditMode == LineEditMode.Camera || lineEditMode == LineEditMode.Erase) { return; } if (lineDrawState != LineDrawState.Start) { lineDrawState = LineDrawState.Start; linePos1 = t.touchLocation(); return; } }
private void CancelCurrentLine() { if (_currentLineRenderer == null) { return; } _currentLineRenderer.positionCount = 0; _currentLineRenderer = null; _currentLineColorData = null; _currentDotOrigin = null; foreach (var gridDatum in _currentLineGridData) { gridDatum.ColorData = null; } _lineDrawState = LineDrawState.None; }
void Update() { // If game is paused, prevent any interaction if (GetGameState() != GameState.Running && GetGameState() != GameState.Pregame) return; // Make decision on which state is currently active switch (_currentLineDrawState) { case LineDrawState.Neutral: // We only select a draw state when current state is neutral if (Input.GetMouseButtonDown(0)) { _currentLineDrawState = LineDrawState.Drawing; // Preserve active line, because GetComponent is relatively expensive var __o = (GameObject)(Instantiate(linePrefab)); __o.transform.parent = _lineContainer.transform; _line = __o.GetComponent<MagicLine>(); // Set starting position Vector3 __t = Camera.main.ScreenToWorldPoint(Input.mousePosition); _line.SetStartingPosition(new Vector2(__t.x, __t.y)); } else if (Input.GetMouseButtonDown(1)) { _currentLineDrawState = LineDrawState.Erasing; } break; case LineDrawState.Drawing: // Reset to neutral state if (Input.GetMouseButtonUp(0)) { _currentLineDrawState = LineDrawState.Neutral; _line = null; } break; case LineDrawState.Erasing: // Reset to neutral state if (Input.GetMouseButtonUp(1)) { _currentLineDrawState = LineDrawState.Neutral; } break; } // Handle draw state _HandleDrawState(_currentLineDrawState); }
private void LockDrawing() { _currentLineDrawState = LineDrawState.Locked; }
private void _HandleDrawState(LineDrawState state) { // Drawing is locked, don't do anything if (state == LineDrawState.Locked) return; if (state == LineDrawState.Drawing) { // Advance magic line by one frame if (_line != null) { _line.Step(); } } else if (state == LineDrawState.Erasing) { // Get mouse position and convert to world pos Vector3 __pos = Camera.main.ScreenToWorldPoint(Input.mousePosition); __pos.z = 0f; // Ditch z-axis, because line renderer only accepts Vector3 Vector2 __pos2d = new Vector2(__pos.x, __pos.y); /* * Goal is to find the closest line to cursor. * Since lines have multiple points, and we are only interested * in endpoints, distances have to be computed for two points for * each line instead of one. */ var __c = _lineContainer.GetComponentsInChildren<MagicLine>(); if (__c != null) { float __furthestPoint = Mathf.Infinity; MagicLine __closestLine = null; // Find closest line foreach (var line in __c) { Vector2 __a = line.GetStartPoint(); Vector2 __b = line.GetEndPoint(); // Select only closest of the two for consideration float __distA = Vector2.Distance(__a, __pos2d); float __distB = Vector2.Distance(__b, __pos2d); float __considered = (__distA < __distB) ? __distA : __distB; if (__considered < __furthestPoint) { __furthestPoint = __considered; __closestLine = line; } } // Finally strip the line if (__closestLine != null) { __closestLine.Strip(); } } } }