Quick answer: GameMaker tilemap collision checks treating tile ID 0 as empty? ID 0 is the ‘empty’ tile by convention — if you use the first tile for solid walls, shift IDs or special-case.

Top-row tile in the tileset (tile 0) is solid wall in the level, but the player walks through it. tile_get_index returns 0 = empty by default.

Tile 0 is Reserved

GameMaker reserves tile index 0 as empty. Painting tile 0 in a TileMap layer leaves a hole. Move solid tiles to indices ≥ 1.

Convert Tileset

Open the tileset, add a blank first tile (index 0). Re-paint your level — previous “wall is tile 0” now shows as tile 1. tile_get_index is robust.

Collision Code Check

var t = tile_get_index(tilemap_get_at_pixel(tm, x, y));
if (t != 0) { // solid }

The standard pattern. Works as long as “solid” tiles aren’t at index 0.

Verifying

Player collides with all painted walls. No invisible holes at the top-left tileset position.

“Tile 0 is empty. Solid tiles start at 1.”

Set up your tileset template with a blank tile at 0 from project day one — reshuffling solid tiles after a level is painted is painful.