Этот единый подход к обнаружению коллизий (к сожалению) не сработает. Поскольку он моделирует каждый объект в одной точке, где происходит столкновение, он не учитывает тот факт, что объект мог также столкнуться где-то еще, поэтому он не может двигаться или отскакивать в направлении, которое он пытается вытолкнуть sh.
Вам необходимо проверить все точки, с которыми он сталкивается, с помощью любой системы обнаружения, которую вы используете, а затем отреагировать на это вашей логикой обработки столкновений c, основываясь на действительных направлениях, которые он может go в.
Если вы также строите систему обнаружения (как это звучит из вашего вопроса), то вам понадобится эффективный алгоритм для картирования возможных точек столкновения в 2-мерном пространстве, вы, вероятно, хотите реализовать Поиск ближайших соседей с кд-дерево . Вы можете найти много библиотек C ++, чтобы сделать это для вас.
(Обратите внимание, что дерево kd теряет баланс при каждой вставке и удалении, поэтому у вас должно быть динамическое c дерево для ваших движущихся точек, которое периодически перебалансируется, и дерево c для ваших состояний c баллов, которые можно оставить в покое)