Войти
ПрограммированиеФорумОбщее

Godot: как получить коллизию одного из методов direct_space_state с тайлом Tilemap?

#0
23:51, 24 фев. 2021

Для построения навигационного графа мне нужно сделать коллизию точки и тайла, чтобы понять какой тип материала (во избежание вопросов: стандартная навигация Godot не подходит, потому что возвращает тупо массив точек, а не массив отрезков пути с указанием типа поверхности и стиля движения по ней, как мне требуется)

Как можно сделать такую коллизию? У меня удалось это сделать, только если прописать тайлам collision body, однако в этом случае плеер не может ходить по этим тайлам. А как сделать так, чтобы модно было и с direct_space_state проверки на коллизии делать и чтобы в остальной физике не участвовали?

Или как еще можно определить тип тайла в указанной конкретной точке?


#1
0:00, 25 фев. 2021

Ок, нашел такой способ и в принципе это подходит:

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)

Но как теперь по индексу тайла получить сам тайл, чтобы проверить его параметры?

#2
23:04, 25 фев. 2021

// как теперь по индексу тайла получить сам тайл
Я не знаю.
Но логика в том, чтобы залезть в файл _ресурса (где храним тайлсет).

Могу рекомендовать такой костыль-хак (чистая теория - я сам не пробывал)..
Создай отдельную сцену TSet_Edit, где каждая нода будет названием тайла,
в формате 0_x_name, 1_x_name.

Сконвертируй эту сцену в тайл-сет (подобное было в официальных демках).

После загрузки игры, догрузи сцену TSet_Edit куда-нить в невидимое пространство,
чтобы по номерку (от ноля) брать указатель, и смотреть _что_там в ноде есть.

#3
23:27, 25 фев. 2021

Robotex
> однако в этом случае плеер не может ходить по этим тайлам

Имеются ведь слои, которые можно игнорировать.

#4
15:07, 26 фев. 2021

rcsim
> Имеются ведь слои, которые можно игнорировать.
Хммм, а это идея :)

slatazan
> каждая нода будет названием тайла,
> в формате 0_x_name, 1_x_name
Хммм, интересная мысль

#5
15:12, 26 фев. 2021

Тю, блин, так индекс тайла это не его индекс на игровом поле, а просто id тайла в тайлсете, используемого в данной точке. Грубо говоря, это и есть именно то, что я ищу

#6
(Правка: 15:17) 15:17, 26 фев. 2021

Собственно, решилось без всяких коллизий и физики:

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 и т.п.) можно понять, что за тип поверхности в данной точке

ПрограммированиеФорумОбщее