private Vector2Int GetTetraminoStartPosition(Tetramino newTetramino) { // Tetramino spawns at top center of grid, in two hidden spawn rows, at center, // shifted to left if size.x of tetramino's bounding box is uneven int startPositionX = grid.Size.x / 2 - (newTetramino.Size.x / 2 + newTetramino.Size.x % 2); // Tetraminos processing starts from top left corner of their bounding box Vector2Int startPosition = new Vector2Int(startPositionX, grid.Size.y - 1); return(startPosition); }
public List <Vector2Int> GetMinosGridPositions() { var result = new List <Vector2Int>(); foreach (var relativeMinoCoordinate in Tetramino.GetMinosCoordinates()) { int gridX = Position.x + Mathf.RoundToInt(relativeMinoCoordinate.x); int gridY = Position.y - Mathf.RoundToInt(relativeMinoCoordinate.y); result.Add(new Vector2Int(gridX, gridY)); } return(result); }
public void Spawn(Tetramino newTetramino) { if (currentTetramino != null) { throw new InvalidOperationException("Attempt to spawn new tetramino while previous one still in active state."); } Vector2Int startPosition = GetTetraminoStartPosition(newTetramino); var newTetraminoInfo = new TetraminoGridData(newTetramino, startPosition); if (ValidateTetramino(newTetraminoInfo, MinoInValidPosition)) { ApplyNewTetramino(newTetraminoInfo); } else { OnSpawnFailed?.Invoke(); } }
public TetraminoGridData(Tetramino tetramino, Vector2Int position) { Tetramino = tetramino; Position = position; Minos = new List <Mino>(); }