0

Это относится к физическому движку. Как только происходит столкновение, он возвращает мне информацию о том, что два объекта gameObject сталкиваются. Все объекты, такие как игрок, монстр, пуля и т. Д., Производятся (наследуются) от GameObject.Что такое хороший способ определить, какие конкретные объекты gameObjects сталкиваются?

Что такое хороший способ определить, какие конкретные объекты gameObjects сталкиваются?

Перечисления: Я думал об использовании перечислений, но как только вы начнете добавлять больше объектов, становится неуправляемым отслеживать все возможные комбинации.

EDIT: Я нашел потенциальное решение здесь для C#: http://blogs.msdn.com/b/laurionb/archive/2009/08/13/multimethods-in-c-4-0-with-dynamic.aspx

Но все же, если я должен сделать это в C++, как бы я это сделать?

+0

Какие языки задействованы? – Kurru

+0

ну, я сейчас делаю это в C#, но в конце концов, я перенесу его на C++, поэтому я могу использовать его на разных платформах. – brainydexter

ответ

1

Типичное решения сделать два уровня отправки, как это:

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... 
    } 
} 

Это становится немного громоздким, как число различных классов идет вверх, но у него есть некоторые вещи, которые идут для этого:

  1. Это быстро. Он опирается на встроенную динамическую рассылку, которая довольно хорошо оптимизирована.
  2. Это типичный. Вы заметите, что кастинг не происходит.

Недостатком является:

  1. Не открытого состава для расширения. Добавление нового класса требует, чтобы вы касались всех остальных.

Более расширяемое решение заключается в создании таблицы 2D-рассылки, в которой каждая ячейка определяет пару сталкивающихся классов. В каждой ячейке вы помещаете функцию, которая обрабатывает столкновение между этими двумя типами классов. Это тоже хорошо работает, но он немного изменяет систему типов. Вы в конечном итоге сделаете кастинг, и вам придётся придумать хороший способ определить класс.

Я бы не использование C# dynamic поддержка. Моя сильная догадка заключается в том, что он будет слишком медленным для физического движка.

Я также укажу, что есть Game Development Stack Exchange, который намного лучше отвечает на такие вопросы. Увидимся там!

+0

Разве это не похоже на шаблон посетителя? Я читал об этом и динамически отправлял в более эффективную книгу. Но, спасибо за такой продуманный ответ. Как вы уже упоминали, мне не нравилось обманывать систему типов на рассылке. Я все еще ищу решение, где мне не придется перекомпилировать все, если я добавлю новый класс, а также добавлю все соответствующие функции для завершения декартова произведения отношений между сущностями. – brainydexter

+0

Кроме того, я являюсь любопытным, чтобы узнать, как динамическая система работает в фоновом режиме для разрешения объектов и правильно отображает правильный вызов функции с правильным типом аргумента. – brainydexter

+0

Это очень похоже на шаблон посетителя. Это в основном посетитель, сложенный на себе, где класс, посещаемый и выполняющий посещение, является тем же классом ('Thing').В других реализациях посетителя это не всегда так. – munificent

 Смежные вопросы

  • Нет связанных вопросов^_^