Ваша основная проблема заключается в предположении, что игрок бежит прямо в стену.Рассмотрим случай, когда есть прямоугольник стены (100,100,32,32), а игрок находится на (80,68,32,32).Игрок движется вниз и влево, поэтому player.xspeed <0 и player.yspeed> 0;скажем, следующая позиция для игрока (79,69,32,32).Пересечение тогда (100,100,11,1).
Обратите внимание, что хотя игрок движется влево (и вниз), стена фактически находится справа от игрока.Эта строка:
if (player.xspeed < 0) {
player.x += intersection.getWidth();
}
... заставляет player.x быть внезапно установленным на 90.
Одна вещь, которую вы можете сделать, это проверить, что левая сторона игрока быласодержится в пересечении, т. е.
if (player.xspeed < 0 && player.x >= intersection.x) {
player.x += intersection.getWidth();
}
Очевидно, что аналогичное действие необходимо выполнить и для других направлений.