Пример #1
0
 void SetPatterns(List <Vector2> _patternPoints, Cell.STATES _cellState, Vector2 _centerPoint)
 {
     for (int i = 0; i < _patternPoints.Count; i++)
     {
         GameManager.Instance.GetGridManager.Field[(int)(_centerPoint.x + _patternPoints[i].x), (int)(_centerPoint.y + _patternPoints[i].y)].SetCellState(_cellState);
     }
 }
Пример #2
0
    /// <summary>Versetzt die übergebene Zelle in den übergebenen Zustand</summary>
    /// <param name="_cell">Die Zelle deren Zustand geändert werden soll</param>
    /// <param name="_newState">Der Zustand in den die Zelle geändert werden soll</param>
    /// <remarks>Die Methode versetzt die übergebene Zelle in den übergebenen Zustand. Hier werden dann auch alle relevanten Events ausgelöst und der Zellen Counter erhöht oder verringert</remarks>
    void SetCellStateTo(Cell _cell, Cell.STATES _newState)
    {
        switch (_newState)
        {
        case Cell.STATES.ALIVE:
        {
            //Überprüfen ob die Zelle schon als "Lebendig" markiert wurde. Wenn nicht wird diese als "Lebendig" markiert und der Zähler der "Lebendigen" Zellen wird um eins erhöht
            if (_cell.CurrentState != Cell.STATES.ALIVE)
            {
                m_CellCounter++;

                //Überprüfen ob das Event das sich die Anzahl der Lebendigen Zellen geändert hat abonniert wurde, wenn ja wird das Event aufgerufen
                if (OnChangeCellAsAlive != null)
                {
                    OnChangeCellAsAlive(m_CellCounter);
                }

                _cell.SetCellState(Cell.STATES.ALIVE);
            }
        } break;

        case Cell.STATES.DEAD:
        {
            //Überprüfen ob die Zelle schon als "Gestorben" markiert wurde. Wenn nicht wird diese als "Gestorben" markiert und der Zähler der "Lebendigen" Zellen wird um eins verringert
            if (_cell.CurrentState != Cell.STATES.DEAD)
            {
                m_CellCounter--;

                //Überprüfen ob das Event das sich die Anzahl der Lebendigen Zellen geändert hat abonniert wurde, wenn ja wird das Event aufgerufen
                if (OnChangeCellAsAlive != null)
                {
                    OnChangeCellAsAlive(m_CellCounter);
                }

                _cell.SetCellState(Cell.STATES.DEAD);
            }
        } break;
        }
    }
Пример #3
0
    /// <summary>Die Routine die eine ausgewählte Zelle in den entsprechenden Zustand versetzt</summary>
    /// <param name="_cell">Die Zelle deren Zustand geändert werden soll</param>
    /// <param name="_newState">Der Zustand in den die Zelle geändert werden soll</param>
    /// <remarks>Die Methode überprüft ob in einer Routine mehr wie eine Zelle gespeichert ist. Ist dies der Fall, wird automatisch eine Linie mit ausgewählten Zellen zwischen den gespeicherten Zellen
    /// generiert und in den entsprechenden Zustand versetzt</remarks>
    void SwitchCellStateRoutine(Cell _cell, Cell.STATES _newState)
    {
        //Die ausgewählte Zelle in dem aktuellen Frame Speichern
        if (m_FirstFrameSelectedCell == null)
        {
            m_FirstFrameSelectedCell = _cell; //Anfangszelle zwischen speichern
            SetCellStateTo(_cell, _newState); //Den State der Zelle ändern
        }
        else if (m_FirstFrameSelectedCell != null && _cell != m_FirstFrameSelectedCell)
        {
            m_SecondFrameSelectedCell = _cell;                       //Endzelle zwischen speichern

            Vector2 TempStartPos = m_FirstFrameSelectedCell.GridPos; //Die Startzelle festlegen

            //Festlegen das die Startzellen X Position immer kleiner ist als die X Position der Endzelle. Damit wird sichergestellt das immer mit der Linken ausgewählten Zelle begonnen wird
            if (m_SecondFrameSelectedCell.GridPos.x < m_FirstFrameSelectedCell.GridPos.x)
            {
                TempStartPos.x = (int)m_SecondFrameSelectedCell.GridPos.x;
            }

            //Festlegen das die Startzellen Y Position immer kleiner ist als die Y Position der Endzelle. Damit wird sichergestellt das immer mit der untersten ausgewählten Zelle begonnen wird
            if (m_SecondFrameSelectedCell.GridPos.y < m_FirstFrameSelectedCell.GridPos.y)
            {
                TempStartPos.y = (int)m_SecondFrameSelectedCell.GridPos.y;
            }

            //Die zu überprüfende Spielfeld Größe festlegen. Es wird immer nur das Rechteck geprüft in dem die beiden Zellen die Ecken Oben/Rechts und unten Links bilden
            int TempFieldWitdh  = (int)Mathf.Abs(m_FirstFrameSelectedCell.GridPos.x - m_SecondFrameSelectedCell.GridPos.x) + 1;
            int TempFieldHeight = (int)Mathf.Abs(m_FirstFrameSelectedCell.GridPos.y - m_SecondFrameSelectedCell.GridPos.y) + 1;

            //Durch das Spielfeld iterieren
            for (int y = 0; y < TempFieldHeight; y++)
            {
                for (int x = 0; x < TempFieldWitdh; x++)
                {
                    //Den Abstand der Zelle zu dem Vector durch die Start und Endzelle berechnen. Wenn diese unter einem bestimmten Wert ist, befindet sich die geprüfte Zelle auf der Linie durch die Start und Endzelle. Wenn dies der Fall ist,
                    //wird der Zustand der Zelle geändert
                    #if (UNITY_ANDROID && !UNITY_EDITOR)
                    if (m_CreateState == CREATESTATE.CREATE)
                    {
                        if (DistanceToLine(m_FirstFrameSelectedCell.transform.position, m_SecondFrameSelectedCell.transform.position, GameManager.Instance.GetGridManager.Field[(int)TempStartPos.x + x, (int)TempStartPos.y + y].transform.position) < .35f)
                        {
                            //Zellenzustand ändern
                            SetCellStateTo(GameManager.Instance.GetGridManager.Field[(int)TempStartPos.x + x, (int)TempStartPos.y + y], _newState);
                        }
                    }
                    else
                    {
                        if (DistanceToLine(m_FirstFrameSelectedCell.transform.position, m_SecondFrameSelectedCell.transform.position, GameManager.Instance.GetGridManager.Field[(int)TempStartPos.x + x, (int)TempStartPos.y + y].transform.position) < 10f)
                        {
                            //Zellenzustand ändern
                            SetCellStateTo(GameManager.Instance.GetGridManager.Field[(int)TempStartPos.x + x, (int)TempStartPos.y + y], _newState);
                        }
                    }
                    #else
                    if (DistanceToLine(m_FirstFrameSelectedCell.transform.position, m_SecondFrameSelectedCell.transform.position, GameManager.Instance.GetGridManager.Field[(int)TempStartPos.x + x, (int)TempStartPos.y + y].transform.position) < .35f)
                    {
                        //Zellenzustand ändern
                        SetCellStateTo(GameManager.Instance.GetGridManager.Field[(int)TempStartPos.x + x, (int)TempStartPos.y + y], _newState);
                    }
                    #endif
                }
            }

            //Gespeicherte Zellen wieder löschen
            m_FirstFrameSelectedCell  = m_SecondFrameSelectedCell;
            m_SecondFrameSelectedCell = null;
        }
    }