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); } }
/// <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; } }
/// <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; } }