Видео выглядит красиво!Это скорее предложение, но оно было слишком длинным для комментария.
За пределами этого кода нет вращения или других причудливых вещей, верно?Только гравитация, движение и некоторые границы проверяют y = 0 (на земле) или подобное?
Кажется немного странным, что расстояние, которое вы перемещаете в каждом квадрате, пропорционально расстоянию между квадратами.Тогда квадраты прямо друг на друга не должны даже двигаться.Вы можете увидеть это несколько мест в видео.
Попробуете ли вы это и дадите мне знать, если это улучшение?
Вместо этого:
dir.x = dir.x / (Tile::size / 2.0f);
dir.y = dir.y / (Tile::size / 2.0f);
tile->position += dir;
Попробуйте это:
float dmax = max(abs(dir.x), abs(dir.y));
float scaleFactor = Tile::size / dmax;
dir.x *= scaleFactor;
dir.y *= scaleFactor;
tile->position = other->position + dir;
И сохраните
tile->velocity *= 0.0f;
Я на самом деле не знаю C ++, но я думаю, что приведенный выше код действителен.Надеюсь, это поможет.