Я согласен, что идея злого цыпленка - лучшая. Я просто предлагаю другой подход все же.
Что я делал, когда кодировал похожую игру (много лет назад), так это разделил игровую зону на сетку N * N. Теперь, чтобы проверить, происходит ли столкновение, я проверил только те объекты, которые находились в том же квадрате сетки, что и шар, или в любом из 8 квадратов, смежных с этим квадратом. Тщательный выбор значения N может сделать это довольно быстро.
Конечно, это дает хорошие результаты, только если все объекты более или менее равномерно распределены по игровой зоне. Но в то время этот подход выглядел для меня проще, чем кодирование более сложной структуры данных (я еще учился в средней школе и только изучал программирование).