Для построения навигационного графа мне нужно сделать коллизию точки и тайла, чтобы понять какой тип материала (во избежание вопросов: стандартная навигация Godot не подходит, потому что возвращает тупо массив точек, а не массив отрезков пути с указанием типа поверхности и стиля движения по ней, как мне требуется)
Как можно сделать такую коллизию? У меня удалось это сделать, только если прописать тайлам collision body, однако в этом случае плеер не может ходить по этим тайлам. А как сделать так, чтобы модно было и с direct_space_state проверки на коллизии делать и чтобы в остальной физике не участвовали?
Или как еще можно определить тип тайла в указанной конкретной точке?
Ок, нашел такой способ и в принципе это подходит:
func _input(event): if event is InputEventMouseButton: if event.button_index == BUTTON_LEFT: var click_pos = get_global_mouse_position() var tilemap = $TileMap var tile_pos = tilemap.world_to_map(click_pos) var cell = tilemap.get_cellv(tile_pos) var tile = tilemap.get_cell(tile_pos.x, tile_pos.y) print("TM pos: ", click_pos) print("cell: ", cell) print("tile: ", tile)
Но как теперь по индексу тайла получить сам тайл, чтобы проверить его параметры?
// как теперь по индексу тайла получить сам тайл
Я не знаю.
Но логика в том, чтобы залезть в файл _ресурса (где храним тайлсет).
Могу рекомендовать такой костыль-хак (чистая теория - я сам не пробывал)..
Создай отдельную сцену TSet_Edit, где каждая нода будет названием тайла,
в формате 0_x_name, 1_x_name.
Сконвертируй эту сцену в тайл-сет (подобное было в официальных демках).
После загрузки игры, догрузи сцену TSet_Edit куда-нить в невидимое пространство,
чтобы по номерку (от ноля) брать указатель, и смотреть _что_там в ноде есть.
Robotex
> однако в этом случае плеер не может ходить по этим тайлам
Имеются ведь слои, которые можно игнорировать.
rcsim
> Имеются ведь слои, которые можно игнорировать.
Хммм, а это идея :)
slatazan
> каждая нода будет названием тайла,
> в формате 0_x_name, 1_x_name
Хммм, интересная мысль
Тю, блин, так индекс тайла это не его индекс на игровом поле, а просто id тайла в тайлсете, используемого в данной точке. Грубо говоря, это и есть именно то, что я ищу
Собственно, решилось без всяких коллизий и физики:
var click_pos = get_global_mouse_position() var tilemap = $TileMap var tile_pos = tilemap.world_to_map(click_pos) var cell = tilemap.get_cellv(tile_pos) print("TM pos: ", click_pos) print("cell: ", cell) print("tile: ", tilemap.tile_set.tile_get_name(cell))
Теперь по имени тайла (grass, water, sand и т.п.) можно понять, что за тип поверхности в данной точке