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)타일을 매개변수로 넘기면 되니까요. 


* 아래는 오브젝트와 연출이 추가된 버전입니다.





* 지적은 언제나 환영입니다.

Posted by 검은거북

블로그 이미지
프로그래밍 공부 요약 및 공부하며 발생한 궁금증과 해결과정을 포스팅합니다.
검은거북

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.10
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함