Tenho uma array bi-dimensional que utilizo para desenhar um mapa através de tiling.
Quero que, quando eu clicar em um determinado tile, o programa me retorne todos os tiles de mesmo id que estejam conectados.
Basicamente, quero fazer um "paint bucket" que substitua os tiles "grudados" por outros tiles.
Tenho o seguinte código:
private void getAdjacents(int x, int y) {
if(x >= 0 && x < total_cols && y >= 0 && y < total_rows){
if(selectionArray[x][y] != 1 && map.getGroundTile(x, y).getId() == selectedID){
selectionArray[x][y] = 1;
if(x <= tile_to_repaint[0]){
getAdjacents(x-1, y);
}
if(x >= tile_to_repaint[0]){
getAdjacents(x+1, y);
}
if(y <= tile_to_repaint[1]){
getAdjacents(x, y-1);
}
if(y >= tile_to_repaint[1]){
getAdjacents(x, y+1);
}
}
}
}
ele funciona perfeitamente, se todos os tiles no mapa tiverem o mesmo ID, porém a coisa complica um pouco com a seguinte situação:
se eu tenho
01100
10100
11100
00000
quando eu mando pegar os 1, ele me retorna as seguintes posições
0[color=cyan]11[/color]00
[color=red]1[/color]0[color=cyan]1[/color]00
[color=cyan]111[/color]00
00000
os que estão em azul são os retornados
como pode-se notar, um dos 1 é ignorado
se eu retiro as comparações <= e >= tile_to_repaint[0/1] tal problema desaparece, porem, com um mapa um pouco maior já ocorre um StackOverflowError
Imagino que seja porque o programa percorre as mesmas linhas e colunas muitas vezes (bem mais do que o necessário)
Por acaso alguem sabe de um código funcional que faça o que eu preciso? (ou tem uma sugestão que conserte esse erro?)