Example #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);
        }
    }
 override public void Build(Vector2 mousePos)
 {
     if (buildingState == 0)
     {
         if (Input.GetMouseButtonDown(0))
         {
             selected.transform.parent = null;
             firstRoad     = selected;
             startBuildPos = mousePos;
             selected      = Instantiate(selected, mousePos, Quaternion.identity);
             secondRoad    = selected;
             selected.name = "Selected";
             buildingState = 1;
             isVertical    = false;
         }
     }
     else if (buildingState == 1)
     {
         Vector2 temp      = (mousePos - startBuildPos);
         Vector2 placement = new Vector2(0, 0);
         if (temp.x >= 0 && temp.y > 0)
         {
             quadrant  = 0;
             placement = Vector3.Project(temp, diagonalVectors[0]);
         }
         else if (temp.x < 0 && temp.y >= 0)
         {
             quadrant  = 1;
             placement = Vector3.Project(temp, diagonalVectors[1]);
         }
         else if (temp.x <= 0 && temp.y < 0)
         {
             quadrant  = 2;
             placement = Vector3.Project(temp, diagonalVectors[2]);
         }
         else if (temp.x > 0 && temp.y <= 0)
         {
             quadrant  = 3;
             placement = Vector3.Project(temp, diagonalVectors[3]);
         }
         placement = new Vector2(Mathf.RoundToInt(placement.x), Mathf.RoundToInt(placement.y));
         selected.transform.position = placement + startBuildPos;
         if (Input.GetMouseButtonDown(0) && mousePos.x != startBuildPos.x && mousePos.y != startBuildPos.y)
         {
             buildingState = 2;
             Vector2 vecOffset = Vector2.left;
             if (quadrant == 0 || quadrant == 3)
             {
                 vecOffset = Vector2.right;
             }
             dirIndicator = Instantiate(selected, startBuildPos + vecOffset, Quaternion.identity);
         }
     }
     else if (buildingState == 2)
     {
         if (Input.GetMouseButtonDown(0))
         {
             RoadInfo tempRoad = firstRoad.GetComponent <RoadInfo>();
             tempRoad.setSpeedLimit(4);
             tempRoad.setTurnRadius(Mathf.Abs(secondRoad.transform.position.x - firstRoad.transform.position.x) - 0.5f);
             if ((isVertical && (quadrant == 0 || quadrant == 2)) ||
                 !isVertical && (quadrant == 3 || quadrant == 1))
             {
                 tempRoad.setTurnDirection(-1);
             }
             else if ((isVertical && quadrant == 1 || quadrant == 3) ||
                      !isVertical && quadrant == 0 || quadrant == 2)
             {
                 tempRoad.setTurnDirection(1);
             }
             tempRoad.setInteractable(true);
             tempRoad = secondRoad.GetComponent <RoadInfo>();
             tempRoad.setIsEntrance(false);
             if (isVertical && (quadrant == 0 || quadrant == 3))
             {
                 tempRoad.setExitAngle(0);
             }
             else if (isVertical && (quadrant == 1 || quadrant == 2))
             {
                 tempRoad.setExitAngle(180);
             }
             else if (!isVertical && (quadrant == 0 || quadrant == 1))
             {
                 tempRoad.setExitAngle(90);
             }
             else if (!isVertical && (quadrant == 2 || quadrant == 3))
             {
                 tempRoad.setExitAngle(-90);
             }
             tempRoad.setInteractable(true);
             foreach (GameObject gameIter in new GameObject[] { firstRoad, secondRoad })
             {
                 SpriteRenderer temp    = gameIter.GetComponent <SpriteRenderer>();
                 Vector3        tempPos = gameIter.transform.position;
                 temp.color = new Color(temp.color.r, temp.color.g, temp.color.b, 1f);
             }
             Destroy(dirIndicator);
             selected      = null;
             buildingState = 0;
             buttonsInteractable(true);
         }
         else if (Input.GetMouseButtonDown(1))
         {
             isVertical = !isVertical;
             Vector2 tempPos = (Vector2)dirIndicator.transform.position - startBuildPos;
             if (quadrant == 0 || quadrant == 2)
             {
                 dirIndicator.transform.position = new Vector2(tempPos.y, tempPos.x) + startBuildPos;
             }
             else if (quadrant == 1 || quadrant == 3)
             {
                 dirIndicator.transform.position = new Vector2(tempPos.y * -1, tempPos.x * -1) + startBuildPos;
             }
         }
     }
 }