Я не думаю, что это касается дизайна класса. Ваши занятия в порядке; это алгоритмы, которые требуют работы.
Их нужно много обновлять, много разрушать / создавать и, как правило, много обновлять.
Вместо того, чтобы уничтожать каждый снаряд, рассмотрите возможность помещения его в список мертвых снарядов. Затем, когда вам нужно создать новый, вместо выделения нового объекта, вытащите один из мертвого списка и повторно инициализируйте его. Это часто происходит быстрее, поскольку вы экономите на вызовах управления памятью.
Что касается обновления, вам нужно обновить все, что меняется, - на самом деле этого нет.
Каждый кадр всех активных снарядов проверяется на столкновение с другими объектами.
Во-первых - если вы проверяете каждый объект на предмет соответствия друг другу, то каждая пара объектов сравнивается дважды. Вы можете обойтись половиной этого количества проверок, сравнивая только объекты, которые появятся позже в списке обновлений.
#Bad
for obj1 in all_objects:
for obj2 in all_objects:
if obj1 hit obj2:
resolve_collision
#Good
for obj1 in all_objects:
for obj2 in all_objects_after_obj1:
if obj1 hit obj2:
resolve_collision
Как реализовать 'all_objects_after_obj1', зависит от языка, но если у вас есть массив или другая структура произвольного доступа, содержащая ваши объекты, вы можете просто начать индексирование с 1 после obj1.
Во-вторых, сама проверка попадания может быть медленной. Удостоверьтесь, что вы не выполняете сложную математику, чтобы проверить столкновение, когда более простая опция подойдет. И если мир большой, может помочь схема пространственной базы данных, например. карта сетки или квадродерево, чтобы сократить количество объектов для проверки возможных столкновений. Но это часто неловко и много работы для небольшой выгоды в маленькой игре.
Кажется, что оба шага определенно нуждаются в улучшении.
Они только «кажутся»? Профилируйте приложение и посмотрите, где медленные части. Это редко хорошая идея, чтобы догадываться о производительности, потому что современные языки и аппаратные средства могут удивлять.