Указатель, который может указывать на несколько классов - PullRequest
1 голос
/ 09 августа 2011

Я занимаюсь разработкой игры.Есть класс "Player" и класс "NPC".

Каждый экземпляр этих классов может иметь "цель".Та цель может быть другим игроком или другим NPC.Мне бы хотелось, чтобы это «целевое» значение указывало на экземпляр Player / NPC, который выбрал Player / NPC.

Так что проблема в том, что с моей текущей настройкой у меня есть 2 указателя для каждогоИгрок / NPC в виде:

Player* target_p;
NPC* target_n;

Это явно не оптимально.Я спрашиваю, есть ли способ создать указатель, который может указывать на любой из этих классов, а не на один.

Заранее спасибо.

Ответы [ 6 ]

3 голосов
/ 09 августа 2011

Вы можете создать базовый класс Targetable, от которого наследуются Player и NPC, а затем использовать указатель типа Targetable*.

3 голосов
/ 09 августа 2011

Вы можете сделать общий базовый класс для Player и NPC. Этот базовый класс может иметь общее поле из Player и NPC или просто может быть пустым (но должен иметь виртуальный деструктор), тогда вы можете хранить указатель этого типа.

class Target
{
public:
    virtual ~Target(){}
};

class Player : public Target
{
    ...
};

class NPC : public Target
{
    ...
};
2 голосов
/ 09 августа 2011

Вы можете создать базовый класс, если он действительно имеет какой-то общий интерфейс.Может быть, что-то вроде этого:

class Target { /* common interface, like a method both Player and NPC use */ };
class Player : public Target { ... };
class NPC    : public Target { ... };

Если у вас нет общего интерфейса, вы не должны его использовать.Затем вы должны переосмыслить свой дизайн.

0 голосов
/ 09 августа 2011

Ах, ах!

Я тоже программирую игру, и сам немного задумался.

Использование наследования - это хороший способ, но ответы с "таргетингом"базовый класс не оптимален.Очевидно, что общее между «персонажем» и «неигровым персонажем» (наследование) - это не атрибут «таргетируемый», а целый «персонаж»: (дерево для наследования)

  • символ:
    • неигровой персонаж
    • игровой персонаж

Если подумать, свойство таргетинга не ограничено персонажами.Это дает нам:

  • интерактивные вещи: (нацеливаемые, но также имеют размер, вес и т. Д.)
    • пассивный или неодушевленный = объект, артефакт (вы можете нацелить наобъект)
      • дверь (например, стучит в дверь)
      • статуя
      • и т. д.
    • активные или анимированные = обычно живые существа
      • мобов (может сражаться, но не разговаривать с игроком)
      • символов (дополнительные функции, такие как говорение)
        • неигровые персонажи
        • игровые персонажи

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

Удачи!

0 голосов
/ 09 августа 2011
  1. Использовать наследование, выводить оба класса из одного базового класса, как предлагали другие.
  2. Объявить union с указателями обоих этих классов.
  3. Использовать void*
  4. Используйте стиль C или reinterpret_cast для преобразования одного класса в другой тип класса.
0 голосов
/ 09 августа 2011

Вы должны использовать наследование, выводя ваши классы Player и NPC из базового класса, скажем GameCharacter (который, возможно, является производным от GameObject или чего-либо еще).Тогда вы можете просто объявить одну цель: GameCharacter* target;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...