2018. 4. 16. 01:38 IT/Unity 게임개발
[unity 게임개발] Flood 게임 로직 개발 2
Flood 영역을 탐색하는 로직은 아래와 같습니다.
1. SearchFlood
public void SearchFlood(ref int[,] _tileArray, ref bool[,] _tileSelect, int _searchTile) { IntVector2[] checkPosition = { new IntVector2(1,0), new IntVector2(0,1), new IntVector2(-1,0), new IntVector2(0,-1) }; bool[,] visitArray = new bool[HEIGHT,WIDTH]; IntVector2 tile = new IntVector2(0,0); Queue<intvector2> tileQueue = new Queue<intvector2>(); tileQueue.Enqueue(tile); visitArray[tile.y, tile.x] = true; while (tileQueue.Count > 0) { tile = tileQueue.Dequeue(); // 큐에서 꺼낼 때 타일을 변경한다. _tileArray[tile.y, tile.x] = _searchTile; _tileSelect[tile.y, tile.x] = true; for (int i = 0; i < 4; i++) { IntVector2 checkTile = new IntVector2(tile.x + checkPosition[i].x, tile.y + checkPosition[i].y); // 예외처리 위치가 벗어났는지, 이미 접근했던 곳인지 if (checkTile.x<0 || checkTile.y <0 || checkTile.x>=WIDTH || checkTile.y>=HEIGHT || visitArray[checkTile.y,checkTile.x] == true) { continue; } // 접근했다는 표식을 남긴다. visitArray[checkTile.y, checkTile.x] = true; // 선택영역이거나 클릭된 타일이면 큐에 넣는다. if(_tileSelect[checkTile.y,checkTile.x] == true) { tileQueue.Enqueue(checkTile); }else if(_tileArray[checkTile.y, checkTile.x] == _searchTile) { tileQueue.Enqueue(checkTile); } } } }
최초 (0,0)의 타일을 큐에 넣고, 큐에서 하나씩 꺼내어 4방향으로 탐색하여, 선택영역이거나 클릭된 타일과 동일한 타일이면 큐에 넣습니다. 큐에 더 이상 타일이 없을 때까지 반복하여 4방향 탐색을 진행합니다.( 너비탐색이죠.)
만약 2번째 방식 (테두리를 별도로 저장)으로 하려면 선택 영역이거나 클릭된 타일을 큐에 넣는 곳에서 그 외일때 tile 위치를 테두리 큐에 별도로 저장하면 되겠네요.
* 위의 함수는 최초 생성 후에 최초 선택영역을 지을때도 사용가능합니다. (0,0)타일을 매개변수로 넘기면 되니까요.
* 아래는 오브젝트와 연출이 추가된 버전입니다.
* 지적은 언제나 환영입니다.
'IT > Unity 게임개발' 카테고리의 다른 글
[unity 게임개발] 지렁이 키우기 로직 개발 2 (0) | 2018.04.16 |
---|---|
[unity 게임개발] 지렁이 키우기 로직 개발 1 (0) | 2018.04.16 |
[unity 게임개발] Flood 게임 개발하기 1 (0) | 2018.04.14 |
[unity 게임개발] match3 기본 로직 개발 3 (0) | 2018.04.12 |
[unity 게임개발] match3 기본 로직 개발 2 (0) | 2018.04.11 |