Типичное решения сделать два уровня отправки, как это:
class Thing
{
public abstract void Collide(Thing other);
public abstract void CollideWithSpaceship(Spaceship spaceship);
public abstract void CollideWithAsteroid(Asteroid asteroid);
};
class Spaceship : Thing
{
public override void Collide(Thing other) {
other.CollideWithSpaceship(this);
}
public abstract void CollideWithSpaceship(Spaceship spaceship)
{
// Handle Spaceship -> Spaceship collision...
}
public abstract void CollideWithAsteroid(Asteroid asteroid)
{
// Handle Spaceship -> Asteroid collision...
}
}
class Asteroid : Thing
{
public override void Collide(Thing other) {
other.CollideWithAsteroid(this);
}
public abstract void CollideWithSpaceship(Spaceship spaceship)
{
// Handle Asteroid -> Spaceship collision...
}
public abstract void CollideWithAsteroid(Asteroid asteroid)
{
// Handle Asteroid -> Asteroid collision...
}
}
Это становится немного громоздким, как число различных классов идет вверх, но у него есть некоторые вещи, которые идут для этого:
- Это быстро. Он опирается на встроенную динамическую рассылку, которая довольно хорошо оптимизирована.
- Это типичный. Вы заметите, что кастинг не происходит.
Недостатком является:
- Не открытого состава для расширения. Добавление нового класса требует, чтобы вы касались всех остальных.
Более расширяемое решение заключается в создании таблицы 2D-рассылки, в которой каждая ячейка определяет пару сталкивающихся классов. В каждой ячейке вы помещаете функцию, которая обрабатывает столкновение между этими двумя типами классов. Это тоже хорошо работает, но он немного изменяет систему типов. Вы в конечном итоге сделаете кастинг, и вам придётся придумать хороший способ определить класс.
Я бы не использование C# dynamic
поддержка. Моя сильная догадка заключается в том, что он будет слишком медленным для физического движка.
Я также укажу, что есть Game Development Stack Exchange, который намного лучше отвечает на такие вопросы. Увидимся там!
Какие языки задействованы? – Kurru
ну, я сейчас делаю это в C#, но в конце концов, я перенесу его на C++, поэтому я могу использовать его на разных платформах. – brainydexter