Хорошо, здесь есть несколько вещей:
1) Слишком много магических чисел. Не уверен, что именно означают +2, +1 и т. Д. Я хотел бы видеть их как константы. Кроме того, я параноик по поводу порядка операций, поэтому я бы заключил все в круглые скобки, на всякий случай:)
2) Не знаете, какие у вас типы. Предполагается, что поплавки, но они чувствуются как целые.
3) Большая проблема, ваш код в том виде, в котором он разработан, не будет правильно обрабатывать "большую" скорость Что-то, движущееся быстрее, чем ширина / высота вашей зоны, где вы можете столкнуться, не будет надежно обнаружено. Вы не можете легко с этим типом кода столкновения. Это один из побочных эффектов, которые вы уже видите, и я думаю, что фактор помадки добавляет, что вы внесли свой вклад в остальное.
Попробуйте вместо этого использовать векторную систему столкновений. Рассматривайте каждый край поля как линейный вектор. Затем вы можете выполнить очень простую математику, чтобы определить, начинается ли точка с одной стороны линии и заканчивается на другой (знак перекрестного произведения), а знак точки скажет, находилась ли точка внутри отрезка. Кроме того, он позволяет вашим объектам столкновения иметь любую форму и даже делает математику легко расширяемой до 3D. Такая система также более удобна для параллельной обработки.