I am developing my first game using libGDX and it is a puzzle game wherein you have to click on a tile to rotate it and establish a correct path from source to destination.
The highlightRoute() method can be skipped completely. Instead simply run a loop from starting tile to last tile and call method isConected() in it.:
private boolean isConnected(int position)
{
connected = false;
Tile currentTile = getTile(position);
Tile topTile = null,nextTile= null ,prevTile = null ,downTile = null;
if(currentTile.isFlag_top()){
topTile = currentTile.topLink;
if(currentTile.contains(currentTile.top,topTile.getState()))
{
//Checks if top tile's state matches with the allowed top tile states
currentTile.top_connected = true;
topTile.down_connected = true;
topTile.connected = true;
connected = true;
topTile.checked = true;
if(currentTile.isSource == true || currentTile.connectedToSource == true){
System.out.println("\n\n***Position : "+ position );
System.out.println("###Current tile connected to source hence Top Tile also connected to source###");
topTile.connectedToSource = true;
}
else if(topTile.isSource == true || topTile.connectedToSource == true){
System.out.println("\n\n***Position : "+ position );
System.out.println("###Current tile connected to source as Top Tile is connected to source###");
currentTile.connectedToSource = true;
}
else currentTile.connectedToSource = false;
}
else {
currentTile.top_connected = false;
topTile.down_connected = false;
}
}
else{
//As flag_top of current tile is false , set its top_connected flag to false.
currentTile.top_connected = false;
}
if(currentTile.isFlag_down()){
downTile = currentTile.downLink;
if(currentTile.contains(currentTile.down,downTile.getState()))
{
currentTile.down_connected = true;
downTile.top_connected = true;
downTile.connected = true;
connected = true;
downTile.checked =true;
if(currentTile.isSource == true || currentTile.connectedToSource == true){
System.out.println("\n\n***Position : "+ position );
System.out.println("###Current tile connected to source hence Down Tile also connected to source###");
downTile.connectedToSource = true;
}
else if(downTile.isSource == true || downTile.connectedToSource == true){
System.out.println("\n\n***Position : "+ position );
System.out.println("###Current tile connected to source as Down Tile is connected to source###");
currentTile.connectedToSource = true;
}
else currentTile.connectedToSource = false;
}
else {
currentTile.down_connected = false;
downTile.top_connected = false;
}
}
else{
currentTile.down_connected = false;
}
if(currentTile.isFlag_left()){
prevTile = currentTile.prevLink;
if(currentTile.contains(currentTile.left,prevTile.getState()))
{
currentTile.prev_connected = true;
prevTile.next_connected = true;
prevTile.connected = true;
connected = true;
prevTile.checked=true;
if(currentTile.isSource == true || currentTile.connectedToSource == true){
System.out.println("\n\n***Position : "+ position );
System.out.println("###Current tile connected to source hence Prev Tile also connected to source###");
prevTile.connectedToSource = true;
}
else if(prevTile.isSource == true || prevTile.connectedToSource == true){
System.out.println("\n\n***Position : "+ position );
System.out.println("###Current tile connected to source as Prev Tile is connected to source###");
currentTile.connectedToSource = true;
}
else currentTile.connectedToSource = false;
}
else{
currentTile.prev_connected = false;
prevTile.next_connected = false;
}
}
else{
currentTile.prev_connected = false;
}
if(currentTile.isFlag_right()){
nextTile = currentTile.nextLink;
if(currentTile.contains(currentTile.right,nextTile.getState()))
{
currentTile.next_connected = true;
nextTile.prev_connected =true;
nextTile.connected = true;
connected = true;
nextTile.checked =true;
if(currentTile.isSource == true || currentTile.connectedToSource == true){
System.out.println("\n\n***Position : "+ position );
System.out.println("###Current tile connected to source hence Next Tile also connected to source###");
nextTile.connectedToSource = true;
}
else if(nextTile.isSource == true || nextTile.connectedToSource == true){
System.out.println("\n\n***Position : "+ position );
System.out.println("###Current tile connected to source as Next Tile is connected to source###");
currentTile.connectedToSource = true;
}
else currentTile.connectedToSource = false;
}
else{
currentTile.next_connected = false;
nextTile.prev_connected =false;
}
}
else{
currentTile.next_connected = false;
}
currentTile.connected = connected;
currentTile.checked = true;
return connected;
}
This code is not yet perfectly running , even after you get disconnected from source, the flag does not change if you have connected to source before.
Here is a Pseudocode which should do it:
public void markNodes(Node startnode)
{
colour(startnode);//<-- this highlightes the Tile
if(left != null && startnode.isconnected(neighbourleft))
markNodes(startnode);
if(right != null && startnode.isconnected(neighbourright))
markNodes(startnode);
if(up != null && startnode.isconnected(neighbourup))
markNodes(startnode);
if(down != startnode.isconnected(neighbourdown))
markNodes(startnode);
}
give the as startposition the root tile and it does highlight all tiles that are connected to it. If there is nothing connected anymore it stops automatically. This starts finding all connected to the left edge if its not null and then the right and so on.
If you dont have a Tiledmap that is up to thousands of tiles there shouldnt be any stackoverflow with it. Else do that iterative without the recursion.