Array of used tiles in a column/row/defined region

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By elek95eel
:warning: Old Version Published before Godot 3 was released.

How would I use get_used_cells()to generate an array of row and an array of column positions based on a tile position?

Tile position from mouse

func get_n_pos():
var grid_tile = world_to_map(get_local_mouse_pos())
return grid_tile

A concept that I’ve been trying to adapt based on what I know so far…

func get_cells_row(tile_pos):
var all = get_used_cells()
var new_array = []
for r in all:
	for y in range(0,9):
		all.find(tile_pos,y)
		new_array.append(r)
		all.pop_front()
	#if tile_pos:
		#new_array.append(r)
print(new_array)
return new_array
:bust_in_silhouette: Reply From: Zylann

Is it for a “bomberman-like” rows and columns query?
Do you really want every single tile in the tilemap width and height?

Using get_used_cell(), you can do this, but it will be slower on big tilemaps. If you have a small tilemap and you don’t do this every frame, it should be ok:

func get_cell_row(tile_pos):
	var row = []
	var used_cells = tilemap.get_used_cells()
	for cell in used_cells:
		if cell.y == tile_pos.y:
			row.append(cell)
	return row

Alternatively, if you know the extents of your tilemap, you can do this instead, which is faster because it queries only a row instead of every tile:

func get_cell_row(tile_pos):
	var row = []
	for x in range(tilemap_min_x, tilemap_max_x):
		if tilemap.get_cell(x, tile_pos.y) != -1:
			row.append(Vector2(x, tile_pos.y))
	return row

If you want tiles in a rectangular region, you need a different if test in the first version, and a double-for in the second version.

In your second code you used all.find(tile_pos,y), which is not going to do what you want. If it ever works, what it does instead is “find the index in the list at which the value tile_pos is, ignoring all indexes before y, then return it as an integer”, which you aren’t storing anyways. Not what you asked at all, right^^