private void RenderContent(TilesLayout.TilesLayout tilesLayout, TilesLayout.TilesLayoutContent content, PathCell[,] cells) { cells.ForeachIndexed((x, y, cell) => { GameObject tileGameObject = null; switch (cell.CellType) { case PathCell.Type.LETTER: tileGameObject = LetterGameObject; break; case PathCell.Type.OBSTACLE: tileGameObject = ObstacleGameObject; break; case PathCell.Type.EMPTY: tileGameObject = EmptyGameObject; break; } content.Items[x, y].GameObject = tileGameObject; }); tilesLayout.Content = content; }
private void CreateCells(TilesLayout.TilesLayoutContent content) { for (int row = 0; row < TilesPerRow; row++) { for (int col = 0; col < TilesPerColumn; col++) { var cell = new TilesLayout.TilesLayoutCell(); content.SetCell(cell, row, col); } } }
// Start is called before the first frame update void Start() { LevelDataRepository = GameObject.Find("LevelDataRepository").GetComponent("LevelDataRepository") as LevelDataRepository; var content = new TilesLayout.TilesLayoutContent(TilesPerColumn, TilesPerRow); CreateCells(content); var tilesLayout = GetTilesLayout(); GenerateLevel(tilesLayout, content); AddSideCollisions(content); AddFinishLine(); }
private void GenerateLevel(TilesLayout.TilesLayout tilesLayout, TilesLayout.TilesLayoutContent content) { var obstaclePositioner = new ObstaclePositioner(); var emptyCellPositioner = new EmptyCellPositioner(); var cells = new PathCell[content.Columns, content.Rows]; cells.ForeachIndexed((x, y, cell) => cells[x, y] = new PathCell(x, y)); int pathLength = EnsurePathExists(cells); var letters = GenerateLetters(pathLength); int maxObstacles = cells.Length - (letters.Count >= pathLength ? (letters.Count) : (pathLength)); obstaclePositioner.PlaceObstacles(cells, maxObstacles); PlaceRemainingLetters(cells, pathLength, letters); emptyCellPositioner.PlaceEmptyCells(cells); cells.Print(); GenerateGameObjects(cells, tilesLayout, content, letters); }
private void AddSideCollisions(TilesLayout.TilesLayoutContent content) { // add extra height above the layout for the starting vertical position of the character // and add the botom when it's supposed to fall off float extraHeight = content.Items[0, 0].MeasuredHeight; float edgeHalfWidth = content.Width * 0.5f; float edgeHalfHeight = content.Height * 0.5f + extraHeight; var colliders = GetComponents <EdgeCollider2D>(); colliders[0].points = new Vector2[] { new Vector2(-edgeHalfWidth, edgeHalfHeight), new Vector2(-edgeHalfWidth, -edgeHalfHeight) }; colliders[1].points = new Vector2[] { new Vector2(edgeHalfWidth, -edgeHalfHeight), new Vector2(edgeHalfWidth, edgeHalfHeight) }; }
private void GenerateGameObjects(PathCell[,] cells, TilesLayout.TilesLayout tilesLayout, TilesLayout.TilesLayoutContent content, List <string> letters) { RenderContent(tilesLayout, content, cells); var letterGenerator = LetterGenerator(letters).GetEnumerator(); letterGenerator.MoveNext(); cells.Flatten() .Where(cell => cell.CellType == PathCell.Type.LETTER) .ToList() .ForEach(cell => { var gameObject = content.Items[cell.Position.x, cell.Position.y].GameObject; var binding = gameObject.GetComponent(typeof(LetterTileBinding)) as LetterTileBinding; binding.Letter = letterGenerator.Current; letterGenerator.MoveNext(); }); }