Да. Векторное столкновение будет намного лучше, чем основанное на плитке. Определите каждый край плитки как линии (есть короткие пути, но пока игнорируйте их.) Теперь, чтобы увидеть, произошло ли столкновение, найдите ближайшую горизонтальную и вертикальную линию. если вы берете знак lastPos.x * LineVector.y - lastPos.y * LineVector.x и сравниваете это с thisTurnsPos.x * LineVector.y - ThisTurnsPos.y * LinePos.x. Если знаки этих двух значений различаются, вы пересекли эту черту в этом тике. Это не проверяет, если вы пересекли конец отрезка линии, хотя. Вы можете сформировать точечное произведение между одним и тем же lineVector и вашим curPosition (здесь небольшая ошибка, но, вероятно, достаточно хорошая), и оно либо отрицательно, либо больше квадрата амплитуды линии, вы не находитесь внутри этого отрезка и не произошло столкновения .
Теперь это очень сложно, и вы, вероятно, могли бы уйти с простой проверкой сетки, чтобы увидеть, не перешли ли вы в область другого квадрата. Но! Преимущество работы с векторами состоит в том, что она решает движение быстрее, чем размер проблемы с коллизионным блоком, и (что более важно), вы можете использовать линии, не выровненные по оси, для ваших коллизий. Эта система работает для любых 2D векторов (и с небольшим массажем, а также для 3D). Она также позволяет довольно легко перемещать вашего персонажа по краю поля столкновения, потому что вы уже выполнили 99% математики, необходимой для найти, где вы должны быть после столкновения.
Я упустил из виду пару деталей реализации, но могу сказать, что я использовал вышеописанный метод в бесчисленных коммерческих видеоиграх, и он сработал как шарм. Удачи!