Существует множество подходов.Вы можете использовать один таймер и заставить его вызывать функцию обновления для каждого объекта в массиве или коллекции.Или вы можете создавать отдельные объекты, которые вызывают свои собственные функции обновления и имеют собственный таймер.
Первый вариант обычно более эффективен.
У вас есть еще одна проблема - если у каждого круга есть свой таймер, вы не можете просто перерисовывать весь холст каждый раз, как вы это делаете сейчас.Если вы это сделаете, то каждый раз, когда он перерисовывает один шар, он удаляет остальные, поэтому он будет мерцать между ними.Это можно исправить, удалив шарик только самого себя перед перерисовкой на новом месте - но тогда вам придется иметь дело с перекрывающимися шариками.
Таким образом, лучший подход - один таймер, который перерисовывает все шары каждыйвремя в последовательности, поэтому «сверху» всегда перекрывают нижние.