コード例 #1
0
        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;
        }
コード例 #2
0
    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);
    }
コード例 #3
0
    public void SetEditMode(LineEditMode e)
    {
        lineEditMode = e;
        HUD.main.SetCurrentTool(e);
        lineDrawState = LineDrawState.None;

        SetInputSystem();
    }
コード例 #4
0
 private void FinishDrawing()
 {
     _currentDotOrigin    = null;
     _currentGridDatum    = null;
     _currentLineData     = null;
     _currentLineRenderer = null;
     _currentLineData     = null;
     _lineDrawState       = LineDrawState.None;
 }
コード例 #5
0
    public void OnDrawLineStart(TKButtonRecognizer t)
    {
        if (lineEditMode == LineEditMode.Camera || lineEditMode == LineEditMode.Erase)
        {
            return;
        }


        if (lineDrawState != LineDrawState.Start)
        {
            lineDrawState = LineDrawState.Start;
            linePos1      = t.touchLocation();
            return;
        }
    }
コード例 #6
0
        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;
        }
コード例 #7
0
    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);
    }
コード例 #8
0
 private void LockDrawing()
 {
     _currentLineDrawState = LineDrawState.Locked;
 }
コード例 #9
0
    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();
                }
            }
        }
    }