H360ru / araxxes

Godot Online Turn Based Strategy
https://araxxes.com/play
GNU General Public License v3.0
3 stars 1 forks source link

Предложения по использованию TileMap #10

Open Germenzi opened 3 years ago

Germenzi commented 3 years ago

Хексы никак не ложатся в прямоугольную сетку смещения ровно, поэтому надо их впихнуть с минимальными потерями. Самым оптимальным мне показался размер a·sqrt(3) по ширине и 3/2·a по высоте, где a это размер хекса. Это для горизонтальных хексов, для вертикальных наоборот. Для изометрии делим высоту пополам. Тогда пропадает только небольшая часть углов побокам: изображение

Также я заметил, что у стандартных tilemap'овских преобразований с сетками смещения проблемы и существует такой неприятный баг, что когда координата ровно на вертикальной линии, то по вертикали координаты считаются криво: изображение

Поэтому я написал нормальные преобразования. Этот баг есть при любых координатах смещения, поэтому я написал функции сразу для всех:

extends TileMap

func _w2m_y_half_pos(point):
    var x = floor(point.x/cell_size.x) as int
    var y = floor((point.y-cell_size.y/2*abs(x%2))/cell_size.y)
    return Vector2(x, y)

func _w2m_y_half_neg(point):
    var x = floor(point.x/cell_size.x) as int
    var y = floor((point.y+cell_size.y/2*abs(x%2))/cell_size.y)
    return Vector2(x, y)

func _w2m_x_half_pos(point):
    var y = floor(point.y/cell_size.y) as int
    var x = floor((point.x-cell_size.y/2*abs(y%2))/cell_size.x)
    return Vector2(x, y)

func _w2m_x_half_neg(point):
    var y = floor(point.y/cell_size.y) as int
    var x = floor((point.x+cell_size.y/2*abs(y%2))/cell_size.x)
    return Vector2(x, y)

func _w2m_offset_disabled(point):
    return Vector2(point.x/cell_size.x, point.y/cell_size.y).floor()

func world_to_map(point):
    match cell_half_offset:
        HALF_OFFSET_Y:
            return _w2m_y_half_pos(point)
        HALF_OFFSET_NEGATIVE_Y:
            return _w2m_y_half_neg(point)
        HALF_OFFSET_NEGATIVE_X:
            return _w2m_x_half_neg(point)
        HALF_OFFSET_X:
            return _w2m_x_half_pos(point)
        HALF_OFFSET_DISABLED:
            return _w2m_offset_disabled(point)
alex7850 commented 3 years ago

Также я заметил, что у стандартных tilemap'овских преобразований с сетками смещения проблемы и существует такой неприятный баг, что когда координата ровно на вертикальной линии, то по вертикали координаты считаются криво

А что там конкретно за баг, если критический для определения клетки, то я только за. Если нет, то предлагаю засунуть в билд опционально

Germenzi commented 3 years ago

Баг присутствует не только в редакторе. Сначала я сделал демку со стандартными преобразованиями и просто водив мышкой баг проскакивал, что конечно ничего страшного, но он создает неприятное ощущение и убивает чувство контроля. Все-таки код не такой уж и большой, поэтому думаю пускай будет, все равно я буду писать класс для хексовых сеток на базе tilemap, запихну и это туда.

alex7850 commented 3 years ago

Я про "по вертикали координаты считаются криво" Тут смотря какая погрешность

Germenzi commented 3 years ago

Ну по картинке же видно, всегда считается на одну выше или одну ниже клетку, чем есть на самом деле.