Как хранить и использовать данные о стрельбе из оружия в игре? - PullRequest
1 голос
/ 05 мая 2011

В этой игре у меня есть 3 защитные башни (число настраивается), которые стреляют "пулей" каждые 3 секунды со скоростью 30 км / ч. Эти защитные башни имеют радар, и они начинают стрелять, только когда игрок находится под радаром башни. Это не проблема.

Мой вопрос: как хранить данные о стрельбе из пистолета? Я не уверен, какие именно данные мне нужны для каждой пули, но на ум приходит позиция пули, конечно. Давайте предположим, что мне нужно только сохранить это (у меня уже есть структура, определенная для 3D-точки).

Должен ли я попытаться выяснить максимальное количество пуль, которое может иметь игра в определенной точке, и объявить массив с таким размером? Должен ли я использовать связанный список? Или может быть что-то еще?

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

P.S .: Я не разместил этот вопрос на веб-сайте разработки игр (несмотря на тег), потому что я думаю, что он подходит здесь лучше.

Ответы [ 4 ]

3 голосов
/ 05 мая 2011

Обычно массивы фиксированной длины не очень хорошая идея.

Учитывая вашу игровую модель, я бы не стал использовать структуру данных, которая не позволяет удалять O (1). В любом случае это исключает простые массивы и может предложить связанный список. Однако базовые детали следует абстрагировать, используя универсальный контейнерный класс с правильными атрибутами.

Что касается что вы должны хранить:

  1. Позиция (как вы упомянули)
  2. Скорость
  3. Коэффициент урона (ваше оружие может быть улучшено, не так ли?)
  4. Максимальный диапазон (то же самое)

РЕДАКТИРОВАТЬ Для немного более сложных вопросов классы STL всегда берут копии вставленных в них элементов, поэтому на практике, если какой-либо из атрибутов может измениться за время существования объекта, вам необходимо выделить ваши структуры в куче и хранят (умные?) указатели на них в коллекции.

2 голосов
/ 05 мая 2011

Я бы, вероятно, использовал std::vector или std::list. Что бы ни было проще.

Предупреждение: если вы кодируете для очень ограниченной платформы (медленный процессор, мало памяти), то может иметь смысл использовать обычный старый массив C фиксированного размера. Но это очень маловероятно в наши дни. Начните с того, что проще всего кодировать, и измените его позже, если и только если окажется, что вы не можете позволить себе абстракции.

1 голос
/ 06 мая 2011

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

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

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

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

1 голос
/ 05 мая 2011

Полагаю, вы можете начать с std::vector<BulletInfo> и посмотреть, как это будет работать. Он предоставляет интерфейс, подобный массиву, но динамически изменяемого размера.

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