forked from 2121578/gai-ca2
80 lines
2.6 KiB
GDScript
80 lines
2.6 KiB
GDScript
class_name TileMapLayerAccess
|
|
extends Node
|
|
|
|
var tilemap: TileMapLayer = null
|
|
var sid: int = 0
|
|
|
|
|
|
func setup() -> void:
|
|
pass
|
|
|
|
|
|
func get_cells_by_type(atlas_coords: Vector2i) -> Array[Vector2i]:
|
|
return tilemap.get_used_cells_by_id(sid, atlas_coords)
|
|
|
|
|
|
func get_cells_by_custom_data(field_name: String, custom_data: Variant) -> Array[Vector2i]:
|
|
var tiles_with_custom_data: Array = []
|
|
for coords in tilemap.get_used_cells():
|
|
var tile_data: TileData = tilemap.get_cell_tile_data(coords)
|
|
if tile_data.get_custom_data(field_name) == custom_data:
|
|
tiles_with_custom_data.append(coords)
|
|
return tiles_with_custom_data
|
|
|
|
|
|
func get_custom_data(coords: Vector2i, field_name: String) -> Variant:
|
|
var tile_data: TileData = tilemap.get_cell_tile_data(coords)
|
|
return tile_data.get_custom_data(field_name)
|
|
|
|
|
|
func get_cells(positions: Array[Vector2i]) -> Array[TileData]:
|
|
var tiles: Array = []
|
|
for coords in positions:
|
|
tiles.append(tilemap.get_cell_tile_data(coords))
|
|
return tiles
|
|
|
|
|
|
func get_cell(position: Vector2i) -> TileData:
|
|
return tilemap.get_cell_tile_data(position)
|
|
|
|
|
|
func set_cell(position: Vector2i, atlas_coords: Vector2i) -> void:
|
|
tilemap.set_cell(position, sid, atlas_coords)
|
|
|
|
|
|
func clear_cell(position: Vector2i) -> void:
|
|
tilemap.set_cell(position, -1)
|
|
|
|
|
|
func clear_cells() -> void:
|
|
for coords in tilemap.get_used_cells():
|
|
tilemap.set_cell(coords, -1)
|
|
|
|
|
|
func local_to_cell(global_position: Vector2) -> Vector2i:
|
|
return tilemap.local_to_map(global_position)
|
|
|
|
|
|
func cell_to_local(cell_position: Vector2i) -> Vector2:
|
|
return tilemap.map_to_local(cell_position)
|
|
|
|
|
|
func fill_area(start: Vector2i, end: Vector2i, atlas_coords: Vector2i) -> void:
|
|
for x in range(start.x, end.x + 1):
|
|
for y in range(start.y, end.y + 1):
|
|
tilemap.set_cell(Vector2i(x, y), sid, atlas_coords)
|
|
|
|
|
|
func fill_circle(center: Vector2i, radius: int, atlas_coords: Vector2i) -> void:
|
|
for x in range(center.x - radius, center.x + radius + 1):
|
|
for y in range(center.y - radius, center.y + radius + 1):
|
|
if center.distance_to(Vector2i(x, y)) <= radius:
|
|
tilemap.set_cell(Vector2i(x, y), sid, atlas_coords)
|
|
|
|
|
|
func fill_ellipse(center: Vector2i, radius_x: int, radius_y: int, atlas_coords: Vector2i) -> void:
|
|
for x in range(center.x - radius_x, center.x + radius_x + 1):
|
|
for y in range(center.y - radius_y, center.y + radius_y + 1):
|
|
if (pow(x - center.x, 2) / pow(radius_x, 2) + pow(y - center.y, 2) / pow(radius_y, 2)) <= 1:
|
|
tilemap.set_cell(Vector2i(x, y), sid, atlas_coords)
|