Пример #1
0
    override public void Build(Vector2 mousePos)
    {
        if (Input.GetMouseButtonDown(0))
        {
            selected.transform.parent = null;
            startBuildPos             = mousePos;
            buildingGhosts.Push(selected);
            lastMousePos = mousePos;
        }
        else if (Input.GetMouseButton(0))
        {
            if (mousePos == lastMousePos)
            {
                return;
            }
            if (lastMousePos == startBuildPos)
            {
                if (mousePos.x != lastMousePos.x)
                {
                    isVertical = false;
                }
                else if (mousePos.y != lastMousePos.y)
                {
                    isVertical = true;
                }
            }
            //Switch from y direction to x direction
            if (Mathf.Abs(mousePos.x - startBuildPos.x) > Mathf.Abs(mousePos.y - startBuildPos.y) && isVertical && buildingGhosts.Count > 1)
            {
                isVertical = false;
                Stack <GameObject> newOrientation = new Stack <GameObject>(buildingGhosts.Count);

                int factor = 0;
                int dir    = 1;
                if (mousePos.x < startBuildPos.x)
                {
                    dir = -1;
                }
                bool firstRun = true;
                while (buildingGhosts.Count != 0)
                {
                    GameObject newPosObj = buildingGhosts.Pop();
                    if (firstRun)
                    {
                        selected      = newPosObj;
                        selected.name = "Selected";
                        firstRun      = false;
                    }
                    newPosObj.transform.position = startBuildPos + Vector2.right * factor * dir;
                    factor += 1;
                    newOrientation.Push(newPosObj);
                }
                buildingGhosts = newOrientation;
            }//Switch from x direction to y direction
            else if (Mathf.Abs(mousePos.y - startBuildPos.y) > Mathf.Abs(mousePos.x - startBuildPos.x) && !isVertical && buildingGhosts.Count > 1)
            {
                isVertical = true;
                Stack <GameObject> newOrientation = new Stack <GameObject>(buildingGhosts.Count);

                int factor = 0;
                int dir    = 1;
                if (mousePos.y < startBuildPos.y)
                {
                    dir = -1;
                }

                bool firstRun = true;
                while (buildingGhosts.Count != 0)
                {
                    GameObject newPosObj = buildingGhosts.Pop();
                    if (firstRun)
                    {
                        selected      = newPosObj;
                        selected.name = "Selected";
                        firstRun      = false;
                    }
                    newPosObj.transform.position = startBuildPos + Vector2.up * factor * dir;
                    factor += 1;
                    newOrientation.Push(newPosObj);
                }
                buildingGhosts = newOrientation;
            }

            GameObject currentCheck        = buildingGhosts.Peek();
            float      currMousePos        = mousePos.x;
            float      currStartBuildPos   = startBuildPos.x;
            float      currCurrentCheckPos = currentCheck.transform.position.x;
            Vector3    vectorTransform     = Vector3.right;

            if (isVertical)
            {
                currMousePos        = mousePos.y;
                currStartBuildPos   = startBuildPos.y;
                currCurrentCheckPos = currentCheck.transform.position.y;
                vectorTransform     = Vector3.up;
            }
            while (currCurrentCheckPos != currMousePos)
            {
                if (currMousePos > currStartBuildPos)
                {
                    if (currCurrentCheckPos < currStartBuildPos)
                    {
                        Destroy(buildingGhosts.Pop());
                    }
                    else if (currMousePos > currCurrentCheckPos)
                    {
                        buildingGhosts.Push(Instantiate(selected, currentCheck.transform.position + vectorTransform, Quaternion.identity));
                    }
                    else
                    {
                        Destroy(buildingGhosts.Pop());
                    }
                }
                else if (currMousePos < currStartBuildPos)
                {
                    if (currCurrentCheckPos > currStartBuildPos)
                    {
                        Destroy(buildingGhosts.Pop());
                    }
                    else if (currMousePos < currCurrentCheckPos)
                    {
                        buildingGhosts.Push(Instantiate(selected, currentCheck.transform.position - vectorTransform, Quaternion.identity));
                    }
                    else
                    {
                        Destroy(buildingGhosts.Pop());
                    }
                }
                else
                {
                    Destroy(buildingGhosts.Pop());
                }
                currentCheck        = buildingGhosts.Peek();
                currCurrentCheckPos = currentCheck.transform.position.x;
                if (isVertical)
                {
                    currCurrentCheckPos = currentCheck.transform.position.y;
                }
            }
            lastMousePos = mousePos;
        }
        else if (Input.GetMouseButtonUp(0))
        {
            selected = null;
            RoadInfo prevRoad = null;
            while (buildingGhosts.Count != 0)
            {
                GameObject tempObj = buildingGhosts.Pop();
                Vector3    tempPos = tempObj.transform.position;
                tempObj.transform.position = new Vector3(Mathf.RoundToInt(tempPos.x), Mathf.RoundToInt(tempPos.y), Mathf.RoundToInt(tempPos.z));
                SpriteRenderer temp = tempObj.GetComponent <SpriteRenderer>();
                temp.color = new Color(temp.color.r, temp.color.g, temp.color.b, 1f);
                RoadInfo currRoad = tempObj.GetComponent <RoadInfo>();
                currRoad.setInteractable(true);
                if (prevRoad != null)
                {
                    currRoad.setGroupMember(0, prevRoad);
                    prevRoad.setGroupMember(1, currRoad);
                }
                prevRoad = currRoad;
            }
            buttonsInteractable(true);
        }
    }