// 퍼즐 초기 세팅. private IEnumerator SetPuzzleProcess() { yield return(new WaitForEndOfFrame()); float wait_second = 0; for (int i = 0; i < tile_lines.Count; i++) { TileLine tile_line = tile_lines[i]; Vector3 first_tile_pos = tile_line.CreatePosition; List <Animal> list = new List <Animal>(); for (int j = 0; j < tile_line.TileCount; j++) { Animal animal = CreateAnimal(); animal.SetData(i, j); animal.AnimalLocalPosition = first_tile_pos + Vector3.up * (140f + 140 * (j + (IsEvneNumber(i) ? 0 : 1))); animal.MovePosition(tile_line.GetTilePosition(j)); list.Add(animal); } arr_animals[i] = list; wait_second += 0.15f; } yield return(new WaitForSeconds(wait_second)); StartCoroutine(StartEventProcess()); }
// 빈곳에 퍼즐을 채워 넣음. private IEnumerator RegenerationAnimalProcess() { float wait_second = 0; for (int i = 0; i < tile_lines.Count; i++) { TileLine tile_line = tile_lines[i]; List <Animal> list = arr_animals[i]; int before_count = list.Count; for (int j = 0; j < tile_line.TileCount; j++) { if (before_count > j) { Animal animal = list[j]; animal.SetData(i, j); animal.MovePosition(tile_line.GetTilePosition(j)); } else { Animal create_animal = CreateAnimal(); create_animal.SetData(i, j); create_animal.AnimalLocalPosition = tile_line.CreatePosition + new Vector3(0, 140f + 140f * (j - before_count)); create_animal.MovePosition(tile_line.GetTilePosition(j)); list.Add(create_animal); wait_second += 0.11f; } } } yield return(new WaitForSeconds(wait_second)); destroy_count = 0; is_click_puzzle = true; }
private void SpawnLines() { while (tileLines[tileLines.Count - 1].transform.position.y < Mathf.Max(TilePlayer.Instance.transform.position.y, transform.position.y) + TileCamera.Instance.camera.orthographicSize) { GameObject newLineObj = Instantiate(possibleLines[0], tileLines[tileLines.Count - 1].transform.position + Vector3.up * lineOffset, Quaternion.identity); TileLine newLine = newLineObj.GetComponent <TileLine>(); newLine.previousLine = tileLines[tileLines.Count - 1]; if (TileLine.lineCount > 5) { List <string> tiles = currentWave.GetTiles(currentLine); if (tiles == null) { FindWave(); tiles = currentWave.GetTiles(currentLine); } newLine.SpawnTiles(tiles); ++currentLine; } else { newLine.SpawnTiles(currentWave.GetWidth()); } tileLines.Add(newLine); } }
public void FindTile() { float minDist = float.MaxValue; TileBase closestTile = null; for (int lineIdx = 0; lineIdx < TileManager.Instance.tileLines.Count; ++lineIdx) { TileLine currentLine = TileManager.Instance.tileLines[lineIdx]; for (int tileIdx = 0; tileIdx < currentLine.tiles.Count; ++tileIdx) { TileBase loopTile = currentLine.tiles[tileIdx]; float dist = Vector3.Distance(loopTile.transform.position, transform.position); // ReSharper disable once InvertIf if (dist < minDist) { minDist = dist; closestTile = loopTile; } } } tileHistory.Add(closestTile); }
private void SpawnGrid() { DestroyGrid(); tileLines = new TileLine[gridSize.x]; for (int x = 0; x < gridSize.x; x++) { tileLines[x] = new TileLine(gridSize.y); for (int z = 0; z < gridSize.y; z++) { tileLines[x].tiles[z] = Instantiate(tilePrefab_a, new Vector3Int(x, defaultY, z), Quaternion.identity, transform); tileLines[x].tiles[z].name = $"Tile[{x}][{z}]"; if ((x + z) % 2 == 0) { tileLines[x].tiles[z].name = tileLines[x].tiles[z].name + "_b"; // Debug.Log(tileLines[x].tiles[z].gameObject.transform.GetChild(1).name); // tileLines[x].tiles[z].transform.GetChild(0).GetComponent<Renderer>().material = alternative_tile_material; } } } }
// 모든 타일에 대해 매칭 판별하는 함수 // 매칭에 해당하는 모든 리스트를 반환한다. public List <TileLine> CheckAllMatch() { List <TileLine> matchLines = new List <TileLine>(); for (int i = 0; i < Constants.HEIGHT; i++) { int beforeTile = -1; int count = 0; int startIndex = -1; for (int j = 0; j < Constants.WIDTH; j++) { if (beforeTile == tileGrid[i, j].index) { if (count == 0) { startIndex = j - 1; } count++; } else { if (count >= 2) { TileLine line = new TileLine(false, i, startIndex, j - 1); matchLines.Add(line); } count = 0; startIndex = -1; } beforeTile = tileGrid[i, j].index; } // 맨 마지막 타일을 위한 예외처리. if (count >= 2) { TileLine line = new TileLine(false, i, startIndex, WIDTH - 1); matchLines.Add(line); } } for (int i = 0; i < Constants.WIDTH; i++) { int beforeTile = -1; int count = 0; int startIndex = -1; for (int j = 0; j < Constants.HEIGHT; j++) { if (beforeTile == tileGrid[j, i].index) { if (count == 0) { startIndex = j - 1; } count++; } else { if (count >= 2) { TileLine line = new TileLine(true, i, startIndex, j - 1); matchLines.Add(line); } count = 0; startIndex = -1; } beforeTile = tileGrid[j, i].index; } if (count >= 2) { TileLine line = new TileLine(true, i, startIndex, Constants.HEIGHT - 1); matchLines.Add(line); } } return(matchLines); }
private void UpdateFov() { //Center view to Hero TextSurface.RenderArea = new Rectangle(hero.Position.X - (TextSurface.RenderArea.Width / 2), hero.Position.Y - (TextSurface.RenderArea.Height / 2), TextSurface.RenderArea.Width, TextSurface.RenderArea.Height); //Move ActorLayer with "parent" ActorLayer.TextSurface.RenderArea = TextSurface.RenderArea; //Tiles in previous version of FOV gets cleared foreach (Point tile in VisibleTiles) { Map[tile].Info.IsInFOV = false; Map[tile].Info.IsExplored = true; Map[tile].RenderToCell(this[tile.X, tile.Y]); } VisibleTiles.Clear(); //Generate new FOV #region CastRays Rectangle sightRect = new Rectangle(hero.Position.X - 50, hero.Position.Y - 50, 100, 100); for (int x = sightRect.X; x < sightRect.Right; x++) { int y = sightRect.Y; // TOP OF SIGHT RECT VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange)); y = sightRect.Bottom; // BOTTOM OF SIGHT RECT VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange)); } for (int y = sightRect.Y; y < sightRect.Bottom; y++) { int x = sightRect.X; // LEFT OF SIGHT RECT VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange)); x = sightRect.Right; // RIGHT OF SIGHT RECT VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange)); } //to the right int distance = 0; int hideOpeningDistance = 3; for (int x = hero.Position.X; x < hero.Position.X + hero.SightRange; x++) { //check horizontal +-1 tiles Point tileUp = new Point(x, hero.Position.Y + 1); Point tileDown = new Point(x, hero.Position.Y - 1); if (!Map.ContainsKey(new Point(x, hero.Position.Y)) || !Map[new Point(x, hero.Position.Y)].Info.IsTransparent) { if (Map.ContainsKey(tileUp) && !Map[tileUp].Info.IsTransparent) { VisibleTiles.Add(tileUp); } if (Map.ContainsKey(tileDown) && !Map[tileDown].Info.IsTransparent) { VisibleTiles.Add(tileDown); } break; } else { if (Map.ContainsKey(tileUp)) { if (distance >= hideOpeningDistance && Map[tileUp].Info.IsTransparent) { VisibleTiles.Remove(tileUp); } else { VisibleTiles.Add(tileUp); } } if (Map.ContainsKey(tileDown)) { if (distance >= hideOpeningDistance && Map[tileDown].Info.IsTransparent) { VisibleTiles.Remove(tileDown); } else { VisibleTiles.Add(tileDown); } } } distance++; } distance = 0; for (int x = hero.Position.X; x > hero.Position.X - hero.SightRange; x--) { //check horizontal +-1 tiles Point tileUp = new Point(x, hero.Position.Y + 1); Point tileDown = new Point(x, hero.Position.Y - 1); if (!Map.ContainsKey(new Point(x, hero.Position.Y)) || !Map[new Point(x, hero.Position.Y)].Info.IsTransparent) { if (Map.ContainsKey(tileUp) && !Map[tileUp].Info.IsTransparent) { VisibleTiles.Add(tileUp); } if (Map.ContainsKey(tileDown) && !Map[tileDown].Info.IsTransparent) { VisibleTiles.Add(tileDown); } break; } else { if (Map.ContainsKey(tileUp)) { if (distance >= hideOpeningDistance && Map[tileUp].Info.IsTransparent) { VisibleTiles.Remove(tileUp); } else { VisibleTiles.Add(tileUp); } } if (Map.ContainsKey(tileDown)) { if (distance >= hideOpeningDistance && Map[tileDown].Info.IsTransparent) { VisibleTiles.Remove(tileDown); } else { VisibleTiles.Add(tileDown); } } } distance++; } //to the up distance = 0; for (int y = hero.Position.Y; y > hero.Position.Y - hero.SightRange; y--) { //check horizontal +-1 tiles Point tileRight = new Point(hero.Position.X + 1, y); Point tileLeft = new Point(hero.Position.X - 1, y); if (!Map.ContainsKey(new Point(hero.Position.X, y)) || !Map[new Point(hero.Position.X, y)].Info.IsTransparent) { if (Map.ContainsKey(tileRight) && !Map[tileRight].Info.IsTransparent) { VisibleTiles.Add(tileRight); } if (Map.ContainsKey(tileLeft) && !Map[tileLeft].Info.IsTransparent) { VisibleTiles.Add(tileLeft); } break; } else { if (Map.ContainsKey(tileRight)) { if (distance >= hideOpeningDistance && Map[tileRight].Info.IsTransparent) { VisibleTiles.Remove(tileRight); } else { VisibleTiles.Add(tileRight); } } if (Map.ContainsKey(tileLeft)) { if (distance >= hideOpeningDistance && Map[tileLeft].Info.IsTransparent) { VisibleTiles.Remove(tileLeft); } else { VisibleTiles.Add(tileLeft); } } } distance++; } //to the Down distance = 0; for (int y = hero.Position.Y; y < hero.Position.Y + hero.SightRange; y++) { //check horizontal +-1 tiles Point tileRight = new Point(hero.Position.X + 1, y); Point tileLeft = new Point(hero.Position.X - 1, y); if (!Map.ContainsKey(new Point(hero.Position.X, y)) || !Map[new Point(hero.Position.X, y)].Info.IsTransparent) { if (Map.ContainsKey(tileRight) && !Map[tileRight].Info.IsTransparent) { VisibleTiles.Add(tileRight); } if (Map.ContainsKey(tileLeft) && !Map[tileLeft].Info.IsTransparent) { VisibleTiles.Add(tileLeft); } break; } else { if (Map.ContainsKey(tileRight)) { if (distance >= hideOpeningDistance && Map[tileRight].Info.IsTransparent) { VisibleTiles.Remove(tileRight); } else { VisibleTiles.Add(tileRight); } } if (Map.ContainsKey(tileLeft)) { if (distance >= hideOpeningDistance && Map[tileLeft].Info.IsTransparent) { VisibleTiles.Remove(tileLeft); } else { VisibleTiles.Add(tileLeft); } } } distance++; } #endregion //Remove duplicate entries from FOV //List<Point> uniq = VisibleTiles.Distinct().ToList(); //VisibleTiles.Clear(); //VisibleTiles = uniq; //Tiles in new FOV set foreach (Point tile in VisibleTiles) { Map[tile].Info.IsInFOV = true; Map[tile].RenderToCell(this[tile.X, tile.Y]); } //Render "Monsters" in FOV foreach (Monster m in actors) { if (!Map[m.Position].Info.IsInFOV) { m.InFov = false; m.UnRenderFromCell(ActorLayer[m.Position.X, m.Position.Y]); } else { m.InFov = true; m.RenderToCell(ActorLayer[m.Position.X, m.Position.Y]); } } }
//public class Fov( ) private void Calculate() { //Tiles in previous version of FOV gets cleared foreach (Point tile in VisibleTiles) { Map[tile].Info.IsInFOV = false; Map[tile].Info.IsExplored = true; Map[tile].RenderToCell(this[tile.X, tile.Y]); } VisibleTiles.Clear(); //Generate new FOV #region CastRays Rectangle sightRect = new Rectangle(hero.Position.X - 50, hero.Position.Y - 50, 100, 100); for (int x = sightRect.X; x < sightRect.Right; x++) { int y = sightRect.Y; // TOP OF SIGHT RECT VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange)); y = sightRect.Bottom; // BOTTOM OF SIGHT RECT VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange)); } for (int y = sightRect.Y; y < sightRect.Bottom; y++) { int x = sightRect.X; // LEFT OF SIGHT RECT VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange)); x = sightRect.Right; // RIGHT OF SIGHT RECT VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange)); } //to the right int distance = 0; int hideOpeningDistance = 3; for (int x = hero.Position.X; x < hero.Position.X + hero.SightRange; x++) { //check horizontal +-1 tiles Point tileUp = new Point(x, hero.Position.Y + 1); Point tileDown = new Point(x, hero.Position.Y - 1); if (!Map.ContainsKey(new Point(x, hero.Position.Y)) || !Map[new Point(x, hero.Position.Y)].Info.IsTransparent) { if (Map.ContainsKey(tileUp) && !Map[tileUp].Info.IsTransparent) { VisibleTiles.Add(tileUp); } if (Map.ContainsKey(tileDown) && !Map[tileDown].Info.IsTransparent) { VisibleTiles.Add(tileDown); } break; } else { if (Map.ContainsKey(tileUp)) { if (distance >= hideOpeningDistance && Map[tileUp].Info.IsTransparent) { VisibleTiles.Remove(tileUp); } else { VisibleTiles.Add(tileUp); } } if (Map.ContainsKey(tileDown)) { if (distance >= hideOpeningDistance && Map[tileDown].Info.IsTransparent) { VisibleTiles.Remove(tileDown); } else { VisibleTiles.Add(tileDown); } } } distance++; } distance = 0; for (int x = hero.Position.X; x > hero.Position.X - hero.SightRange; x--) { //check horizontal +-1 tiles Point tileUp = new Point(x, hero.Position.Y + 1); Point tileDown = new Point(x, hero.Position.Y - 1); if (!Map.ContainsKey(new Point(x, hero.Position.Y)) || !Map[new Point(x, hero.Position.Y)].Info.IsTransparent) { if (Map.ContainsKey(tileUp) && !Map[tileUp].Info.IsTransparent) { VisibleTiles.Add(tileUp); } if (Map.ContainsKey(tileDown) && !Map[tileDown].Info.IsTransparent) { VisibleTiles.Add(tileDown); } break; } else { if (Map.ContainsKey(tileUp)) { if (distance >= hideOpeningDistance && Map[tileUp].Info.IsTransparent) { VisibleTiles.Remove(tileUp); } else { VisibleTiles.Add(tileUp); } } if (Map.ContainsKey(tileDown)) { if (distance >= hideOpeningDistance && Map[tileDown].Info.IsTransparent) { VisibleTiles.Remove(tileDown); } else { VisibleTiles.Add(tileDown); } } } distance++; } //to the up distance = 0; for (int y = hero.Position.Y; y > hero.Position.Y - hero.SightRange; y--) { //check horizontal +-1 tiles Point tileRight = new Point(hero.Position.X + 1, y); Point tileLeft = new Point(hero.Position.X - 1, y); if (!Map.ContainsKey(new Point(hero.Position.X, y)) || !Map[new Point(hero.Position.X, y)].Info.IsTransparent) { if (Map.ContainsKey(tileRight) && !Map[tileRight].Info.IsTransparent) { VisibleTiles.Add(tileRight); } if (Map.ContainsKey(tileLeft) && !Map[tileLeft].Info.IsTransparent) { VisibleTiles.Add(tileLeft); } break; } else { if (Map.ContainsKey(tileRight)) { if (distance >= hideOpeningDistance && Map[tileRight].Info.IsTransparent) { VisibleTiles.Remove(tileRight); } else { VisibleTiles.Add(tileRight); } } if (Map.ContainsKey(tileLeft)) { if (distance >= hideOpeningDistance && Map[tileLeft].Info.IsTransparent) { VisibleTiles.Remove(tileLeft); } else { VisibleTiles.Add(tileLeft); } } } distance++; } //to the Down distance = 0; for (int y = hero.Position.Y; y < hero.Position.Y + hero.SightRange; y++) { //check horizontal +-1 tiles Point tileRight = new Point(hero.Position.X + 1, y); Point tileLeft = new Point(hero.Position.X - 1, y); if (!Map.ContainsKey(new Point(hero.Position.X, y)) || !Map[new Point(hero.Position.X, y)].Info.IsTransparent) { if (Map.ContainsKey(tileRight) && !Map[tileRight].Info.IsTransparent) { VisibleTiles.Add(tileRight); } if (Map.ContainsKey(tileLeft) && !Map[tileLeft].Info.IsTransparent) { VisibleTiles.Add(tileLeft); } break; } else { if (Map.ContainsKey(tileRight)) { if (distance >= hideOpeningDistance && Map[tileRight].Info.IsTransparent) { VisibleTiles.Remove(tileRight); } else { VisibleTiles.Add(tileRight); } } if (Map.ContainsKey(tileLeft)) { if (distance >= hideOpeningDistance && Map[tileLeft].Info.IsTransparent) { VisibleTiles.Remove(tileLeft); } else { VisibleTiles.Add(tileLeft); } } } distance++; } #endregion //Remove duplicate entries from FOV //List<Point> uniq = VisibleTiles.Distinct().ToList(); //VisibleTiles.Clear(); //VisibleTiles = uniq; //Tiles in new FOV set // foreach ( Point tile in VisibleTiles ) // { // Map[tile].Info.IsInFOV = true; // Map[tile].RenderToCell( this[tile.X, tile.Y] ); // } // //Render "Monsters" in FOV // foreach ( Monster m in actors ) // { // if ( !Map[m.Position].Info.IsInFOV ) // { // m.InFov = false; // m.UnRenderFromCell( ActorLayer[m.Position.X, m.Position.Y] ); // } // else // { // m.InFov = true; // m.RenderToCell( ActorLayer[m.Position.X, m.Position.Y] ); // } // } //} //internal void Walk( Point point ) //{ // //Move Hero and open doors when bumped on // Point destination = hero.Position + point; // if ( Map.ContainsKey( destination ) ) // { // if ( Map[destination].Info.BlocksMove == true ) // { // if ( Map[destination] is IOpenable ) // { // IOpenable d = Map[destination] as IOpenable; // d.Open(); // Map[destination].RemoveCellFromView( this[destination.X, destination.Y] ); // Map[destination].RenderToCell( this[destination.X, destination.Y] ); // UpdateFov(); // } // MessagesConsole.Instance.PrintMessage( "Blocked Move!" ); // return; // } // // Handle render to new pos and unrendering from previous pos // if ( new Rectangle( 0, 0, Width - 1, Height - 1 ).Contains( destination ) ) // { // hero.UnRenderFromCell( ActorLayer[hero.Position.X, hero.Position.Y] ); // hero.Position = destination; // MessagesConsole.Instance.PrintMessage( "You see here: " + Map[destination].Info.Description ); // UpdateFov(); // hero.RenderToCell( ActorLayer[destination.X, destination.Y] ); // // Update Stats screen // hero.OnChangedEvent(); // } // } }