Имея экземплярный производный класс, поместите указатель на себя в массив? - PullRequest
1 голос
/ 17 марта 2011

Хорошо, вот реальный вопрос - я даже не знаю, что искать.

Я задал вопрос, связанный с системой обработки сущностей в игре: Инициирование производного класса с конкретными значениями переменных

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

Как найти конкретный экземпляр производного класса по координатам?

Например, найти baseObject: Enemy (), расположенный в 22,22, и получить значение "nType" из него

Что приходит на ум, это поместить некоторый указатель на экземпляр в массиве и переместить его, когда упомянутая сущность перемещается ... но как я заставляю производный класс добавлять указатель на себя в массив ? и как мне тогда извлечь что-то из переменных этого экземпляра?

Уф. Надеюсь, это имеет смысл.

Ответы [ 3 ]

1 голос
/ 21 марта 2011

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

Допустим, у вас есть моб, как кто-то сказал ранее, у вас может быть объект "наблюдатель моба".Идея состоит в том, что когда GameEntity является частью моба, эта сущность подписывается на «наблюдателя моба».Если эта сущность покидает моб, она сообщит об этом «наблюдателю моба» (отписаться).

Итак, когда вам нужно узнать, кто составляет моб, вы можете просто попросить наблюдателя моба«Список мобов», если вам нужно выполнить поиск по позиции сущности, то вы можете самостоятельно просмотреть список сущностей, составляющих моб, и найти его в «позиции интереса».

Если ваши мобы гигантскиеВы можете добавить некоторую пространственную хеш-функцию для вашего наблюдателя моба, чтобы вы могли легко фильтровать и запрашивать «парней в мобе, которые находятся в gameGrid [10] [13]».

Если вы используете событиеПроходя мимо, это очень круто, потому что, если вы хотите пересылать сообщения между мобом, отправка события наблюдателю моба может быть использована для пересылки вышеупомянутого события подписанным сущностям.

Если вы используете делегатов, этоработает аналогичным образом.

Шаблон наблюдателя Шаблон делегата

0 голосов
/ 17 марта 2011

Вам нужно будет создать новый объект, работа которого заключается в том, чтобы отслеживать, где находятся «мобы». Согласно вашему вопросу, этот новый объект должен содержать как минимум std :: vector, который содержит указатель на каждого «моба» в мире, а также функцию-член, такую ​​как:

mob* findEnemy( int x, int y );

К сожалению, то, что вы просили в своем вопросе, вероятно, не то, что вы хотите. Вы, вероятно, хотите, чтобы все "мобы" находились рядом с точкой:

std::vector<mob*> findEnemiesNearPoint( int x, int y );

... но возвращение std :: vector может быть очень медленным, поэтому вы, вероятно, хотите использовать вместо него массив, но размер массива должен быть тщательно определен, и теперь мы намного превышаем объем информации, представленной в вашем вопросе. пока что.

0 голосов
/ 17 марта 2011

На конкретный вопрос, который вы задаете, легко ответить: псевдопеременная this доступна во всех функциях-членах;он указывает на текущий объект.

Часть "поиск по координатам" сложнее;Вы можете рассмотреть возможность использования структуры октодерева для организации ваших объектов (Google - ваш друг там).

...