Допустим, у меня есть два разных типа коллайдеров, кругов и прямоугольников, которые получены из одного базового класса коллайдеров. У меня есть класс сущности, который содержит указатель на коллайдер, который может быть коллайдером круга или коллайдером коробки.
class Collider {};
class CircleCollider : public Collider
{
// Defines a circle
};
class BoxCollider : public Collider
{
// Defines a rectangle
};
class Entity
{
Collider* collider;
};
Я хочу создать обработчик коллизий, чтобы я мог просто пропустить несколько объектов и позволить ему выяснить, как разрешать их коллизии, но для этого обработчик должен знать, с какими типами коллайдеров он имеет дело.
Когда проблема была сформулирована так, как это, единственным решением, по-видимому, является уныние, но мне интересно, просто ли я подхожу к ней неправильно. Это похоже на обычный сценарий, но у меня возникают проблемы с поиском решений, из-за которых я подозреваю, что либо есть какой-то другой подход, которого я не вижу, либо это тот случай, когда нужно просто использовать даункинг.
Поскольку обработка коллизий специфична для разных пар коллайдеров, не похоже, что я могу использовать здесь шаблон посетителя, или я ошибаюсь?
Если вы добавите виртуальный метод collidesWith (Collider c) в класс Collider и добавите конкретную реализацию в BoxCollider и CircleCollider, которая будет выяснять, сталкиваются ли эти конкретные экземпляры, внешний обработчик столкновений никогда не должен будет понижать или даже знать, какой конкретный тип коллайдера он использовал.
Других решений пока нет …