Кодирование Roguelike: помощь в логистике массива объектов - PullRequest
0 голосов
/ 15 марта 2011

В настоящее время я нахожусь в процессе написания кода, похожего на roguelike, и обучаю себя тому, что мне нужно, по ходу.

Я застрял в проблеме, на которую я нашел несколько ответов: Лучший способ организовать сущности в игре?

Мне нужно дерево сущностей с классами, как описано в лучшем ответе на этот вопрос.

В нем упоминается итерация по std :: set для запуска «скрипта» каждой сущности, но некоторые вещи, которые мне нужно знать, остаются необъясненными.

  1. В такой реализации, как мне найти что-то с координатами (целыми числами в классе)? Я подозреваю, что это проще, чем запустить For, который перебирает все, пока не найдет соответствующий результат ...

  2. Как бы я справился с несколькими вещами, находящимися в одном месте (стеки предметов и т. Д.)? Я знаю, что у меня может быть несколько экземпляров класса, содержащих одинаковые координаты, но что я получу в результате поиска в такой ситуации?

  3. Есть ли способ, например, выполнять итерацию в порядке убывания статистики "скорости" объекта?

спасибо ~

Ответы [ 2 ]

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

Вы будете манипулировать сущностями с помощью указателей, так что есть Нет проблем, поместив один объект в несколько контейнеров. Так за 1) Матрица> уровень; (где Matrix - это простой двумерный массив, который вы реализуете себя), это также обрабатывает более одного элемента в данный момент место. И уровень [строка] [столбец] будет возвращать ссылку на станд :: вектор. (На самом деле, я бы, наверное, обернуть std :: vector в пользовательском классе, скажем EntityList, с очень простой интерфейс. Это оставляет мои варианты открытыми для будущее.)

Что касается 3, самое простое решение - просто скопировать список в локальный список EntityList и отсортировать его в соответствии с любые критерии, которые вы хотите.

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

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

Имейте сущность базового типа, получайте различные вещи из таких, как клеть, враг и прочее, и, возможно, разные классы, полученные из тех, которые специализируются на разных типах (например, у grue и bat могут быть отдельные классы? Это может превратиться во множество разных классы, поэтому лучше всего иметь параметры для каждого объекта (например, для врага у него будет здоровье, урон, скорость и т. д.)).

Храните их все в одном массиве и используйте функцию виртуального обновления, которую вы вызываете для каждого из них каждый кадр,

...