Я строй XNA игры со следующей упрощенной структурой:Автоматического литья общего списка <Entity>
class Entity
{
Vector3 Speed;
Matrix World;
}
class Mirror : Entity {}
class Lightbeam : Entity {}
class CollisionDetector
{
/*
...
*/
public override void Update(GameTime gameTime)
{
List<Entity> entities = entityManager.level.CurrentSection.Entities;
for (int i = 0; i < entities.Count - 1; i++)
{
for (int j = i + 1; j < entities.Count; j++)
{
if(entities[i].boundingBox.Intersects(entities[j].boundingBox))
{
collisionResponder.Collide(entities[i], entities[j]);
}
}
}
base.Update(gameTime);
}
}
class CollisionResponder
{
public void Collide(Entity e1, Entity e2)
{
Console.WriteLine("Normal entity collision response");
}
public void Collide(Mirror mirror, Lightbeam beam)
{
Collide(beam, mirror);
}
public void Collide(Lightbeam beam, Mirror mirror)
{
Console.WriteLine("Specific lightbeam with mirror collision response");
}
}
То, что я пытаюсь достичь, что (луч Лайтбруса, зеркальце) Collide метод вызывается, когда детектор столкновения обнаруживает столкновение между лучом и зеркалом (поэтому объекты [i] являются зеркалом, а сущности [j] - светом и наоборот). Однако, поскольку список сущностей хранит объекты типа Entity, вместо этого вызывается метод Collide (Entity e1, Entity e2).
Что я пытался преодолеть эту проблему:
- Если столкновение обнаружено, проверьте, какие типы сущностей сталкиваясь и вызвать соответствующий метод. Это довольно уродливое решение, так как метод следует менять каждый раз при добавлении нового типа столкновения.
Использование дженериков:
Collide (Entity e1, e2 Entity) где T: Лайтбрус где U: ЗеркалоОднако это решение не делает компилятор счастливым.
- Я нашел ссылки на шаблон и шаблон фабрики Builder, но это не похоже на то, что исправляет мою проблему.
Мне кажется, что есть простое решение этой проблемы, но я не мог найти в Интернете (используя комбинации ключевых слов, как следующие: дженерик, подкласс, метод, перегрузки, список, автоматический литье) ,
Этот подход предполагает, что входные сущности упорядочены так же, как и параметры согласованного метода – houlgap
@houlgap: Хорошая точка. Я действительно не принимал это во внимание. Для этого всегда можно было бы сочетать методы. 'Collide (Mirror m0, LightBeam lb0) и Collide (LightBeam lb0, Mirror m0)', где он просто указывает на другой. Подобно тому, как это делают точки OP. Основная проблема заключалась в том, что ОП искал подходящее ключевое слово для учета его ситуации, которая является 'dynamic';) –
@myermian: Спасибо! Динамическое ключевое слово работает как шарм!:) @houlgap: Я уже подумал об этом и придумал ту же идею, что и myermian, добавленный к его примеру. Это не так важно для поддержания этого, поскольку столкновения могут существовать только между типами объектов. – Wytse