Search code examples
javalibgdx

libGDX TiledMap: Check if object exists at a specific cell


I have a TiledMap map with some object layers like "wall", "door", "spike"...
Each layer has only rectangles, at their specific positions.

What is the best way I could check if a specific cell of the tile layer contains an object from a specific object layer?

To do something like if Cell of the tile layer at (x,y) contains an object from a object layer "wall", say "can't move there".


I just started using libGDX and Tiles, and the current way of detecting something like this that I can think of would be to create all those rectangles and check if they overlap with the player rectangle each time a player moves to the next cell.

But that would be checking every single object, and I need to just check the one cell the player is currently in.


Solution

  • One way you could reduce computation (this only works if the walls/doors/etc. are all static and don't move or change shape) is by keeping a 2D array of booleans (basically your TiledMap) with true meaning that tile is blocked and vice versa.

    In pseudocode:

    // Initially all grid cells are un-blocked
    boolean[][] gridBlockedByWall = new boolean[MAP_HEIGHT][MAP_WIDTH]; //Replace with your grid size
    
    // Loop over each wall and set array (change depending on your implementation)
    for (Rectangle wall: walls) {
    
        // Here we run over every wall and column covered by this rectangle and set it as blocked
        for (int row = wall.y; row < wall.y + wall.height; row++) {
            for (int col = wall.x; col < wall.x + wall.width; col++) {
                gridBlockedByWall[row][col] = true;
            } 
        }
    }
    

    Now to test if position (x, y) is blocked by a wall simply do gridBlockedByWall[y][x] which will run in constant time.