Exemplo n.º 1
0
    public bool CanConnectToBeltElement(IBeltElement prevElement)
    {
        OutputOrientation orientationPrev = prevElement.GetOutputOrientation();

        if (orientationPrev == OutputOrientation.East)
        {
            return(outputOrientation != OutputOrientation.West);
        }
        else if (orientationPrev == OutputOrientation.North)
        {
            return(outputOrientation != OutputOrientation.South);
        }
        else if (orientationPrev == OutputOrientation.West)
        {
            return(outputOrientation != OutputOrientation.East);
        }
        else if (orientationPrev == OutputOrientation.South)
        {
            return(outputOrientation != OutputOrientation.North);
        }
        return(false);
    }
Exemplo n.º 2
0
    public void InitializeRotated(int rotation)
    {
        rotation = rotation % 4;
        Collider2D[]    resultsX = new Collider2D[3];
        Collider2D[]    resultsY = new Collider2D[3];
        ContactFilter2D filter   = new ContactFilter2D();

        filter.useLayerMask = true;
        filter.layerMask    = 1 << LayerMask.NameToLayer("ConveyorBelt");
        int countX = Physics2D.OverlapBox(this.transform.position, new Vector2(2, 0.25f), 0, filter, resultsX);
        int countY = Physics2D.OverlapBox(this.transform.position, new Vector2(0.25f, 2), 0, filter, resultsY);

        items = new ItemEntity[maxBeltCapacity];
        switch (rotation)
        {
        case 0:
            #region Horizontal ouput east
            rotationState     = Rotation.Horizontal;
            outputOrientation = OutputOrientation.East;

            for (int i = 0; i < countX; i++)
            {
                if (resultsX[i].gameObject == this.gameObject)
                {
                    continue;
                }
                if (resultsX[i].transform.position.x < this.transform.position.x)
                {
                    IBeltElement temp = resultsX[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.East)
                    {
                        prevBelt = temp;
                        prevBelt.SetNextBeltElement(this);
                    }
                }
                else if (resultsX[i].transform.position.x > this.transform.position.x)
                {
                    IBeltElement temp = resultsX[i].GetComponent <IBeltElement>();
                    if (temp.CanConnectToBeltElement(this))
                    {
                        nextBelt = temp;
                        nextBelt.SetPrevBeltElement(this);
                    }
                }
            }

            for (int i = 0; i < countY; i++)
            {
                if (resultsY[i].gameObject == this.gameObject)
                {
                    continue;
                }
                if (resultsY[i].transform.position.y > this.transform.position.y)
                {
                    IBeltElement temp = resultsY[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.South)
                    {
                        prevBeltNorthOrEast = temp;
                        prevBeltNorthOrEast.SetNextBeltElement(this);
                    }
                }
                else if (resultsY[i].transform.position.y < this.transform.position.y)
                {
                    IBeltElement temp = resultsY[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.North)
                    {
                        prevBeltSouthOrWest = temp;
                        prevBeltSouthOrWest.SetNextBeltElement(this);
                    }
                }
            }


            #endregion
            break;

        case 1:
            #region Vertical output north
            rotationState     = Rotation.Vertical;
            outputOrientation = OutputOrientation.North;

            for (int i = 0; i < countY; i++)
            {
                if (resultsY[i].gameObject == this.gameObject)
                {
                    continue;
                }
                if (resultsY[i].transform.position.y < this.transform.position.y)
                {
                    IBeltElement temp = resultsY[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.North)
                    {
                        prevBelt = temp;
                        prevBelt.SetNextBeltElement(this);
                    }
                }
                else if (resultsY[i].transform.position.y > this.transform.position.y)
                {
                    IBeltElement temp = resultsY[i].GetComponent <IBeltElement>();
                    if (temp.CanConnectToBeltElement(this))
                    {
                        nextBelt = resultsY[i].GetComponent <IBeltElement>();
                        nextBelt.SetPrevBeltElement(this);
                    }
                }
            }

            for (int i = 0; i < countX; i++)
            {
                if (resultsX[i].gameObject == this.gameObject)
                {
                    continue;
                }
                if (resultsX[i].transform.position.x > this.transform.position.x)
                {
                    IBeltElement temp = resultsX[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.West)
                    {
                        prevBeltNorthOrEast = temp;
                        prevBeltNorthOrEast.SetNextBeltElement(this);
                    }
                }
                else if (resultsX[i].transform.position.x < this.transform.position.x)
                {
                    IBeltElement temp = resultsX[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.East)
                    {
                        prevBeltSouthOrWest = temp;
                        prevBeltSouthOrWest.SetNextBeltElement(this);
                    }
                }
            }
            #endregion
            break;

        case 2:
            #region Horizontal output west
            rotationState      = Rotation.Horizontal;
            outputOrientation  = OutputOrientation.West;
            velocityMultiplier = -1;

            for (int i = 0; i < countX; i++)
            {
                if (resultsX[i].gameObject == this.gameObject)
                {
                    continue;
                }
                if (resultsX[i].transform.position.x > this.transform.position.x)
                {
                    IBeltElement temp = resultsX[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.West)
                    {
                        prevBelt = temp;
                        prevBelt.SetNextBeltElement(this);
                    }
                }
                else if (resultsX[i].transform.position.x < this.transform.position.x)
                {
                    IBeltElement temp = resultsX[i].GetComponent <IBeltElement>();
                    if (temp.CanConnectToBeltElement(this))
                    {
                        nextBelt = temp;
                        nextBelt.SetPrevBeltElement(this);
                    }
                }
            }

            for (int i = 0; i < countY; i++)
            {
                if (resultsY[i].gameObject == this.gameObject)
                {
                    continue;
                }
                if (resultsY[i].transform.position.y > this.transform.position.y)
                {
                    IBeltElement temp = resultsY[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.South)
                    {
                        prevBeltNorthOrEast = temp;
                        prevBeltNorthOrEast.SetNextBeltElement(this);
                    }
                }
                else if (resultsY[i].transform.position.y < this.transform.position.y)
                {
                    IBeltElement temp = resultsY[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.North)
                    {
                        prevBeltSouthOrWest = temp;
                        prevBeltSouthOrWest.SetNextBeltElement(this);
                    }
                }
            }
            #endregion
            break;

        case 3:
        default:
            #region Vertical output south
            velocityMultiplier = -1;
            rotationState      = Rotation.Vertical;
            outputOrientation  = OutputOrientation.South;

            for (int i = 0; i < countY; i++)
            {
                if (resultsY[i].gameObject == this.gameObject)
                {
                    continue;
                }
                if (resultsY[i].transform.position.y > this.transform.position.y)
                {
                    IBeltElement temp = resultsY[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.South)
                    {
                        prevBelt = temp;
                        prevBelt.SetNextBeltElement(this);
                    }
                }
                else if (resultsY[i].transform.position.y < this.transform.position.y)
                {
                    IBeltElement temp = resultsY[i].GetComponent <IBeltElement>();
                    if (temp.CanConnectToBeltElement(this))
                    {
                        nextBelt = temp;
                        nextBelt.SetPrevBeltElement(this);
                    }
                }
            }

            for (int i = 0; i < countX; i++)
            {
                if (resultsX[i].gameObject == this.gameObject)
                {
                    continue;
                }
                if (resultsX[i].transform.position.x > this.transform.position.x)
                {
                    IBeltElement temp = resultsX[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.West)
                    {
                        prevBeltNorthOrEast = temp;
                        prevBeltNorthOrEast.SetNextBeltElement(this);
                    }
                }
                else if (resultsX[i].transform.position.x < this.transform.position.x)
                {
                    IBeltElement temp = resultsX[i].GetComponent <IBeltElement>();
                    if (temp.GetOutputOrientation() == OutputOrientation.East)
                    {
                        prevBeltSouthOrWest = temp;
                        prevBeltSouthOrWest.SetNextBeltElement(this);
                    }
                }
            }

            #endregion
            break;
        }
        this.GetComponent <SpriteRenderer>().sprite = AnimationPropertiesPool.Instance.rotatedSpriteProperties[rotatedSpritePropertyId].sprites[rotation];
    }