|
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 7
|
|
Взаимодействие двух контейнеров объектов15.12.2015, 09:36. Показов 1411. Ответов 14
Здравствуйте. Вопрос, наверное, уместнее задать на геймдеве, но всё же попробую здесь.
Есть два контейнера объектов (монстры и пули), количество элементов которых непрерывно изменяется в силу различных обстоятельств (пуля попадает в монстра и исчезает, у монстра заканчивается здоровье и он исчезает и т.п.). Само собой, удаление объектов происходит по произвольному индексу в зависимости от соответствующего игрового события. Пробовал использовать вектора указателей, а удалять элемент с помощью swap с последним элементом, вызова для нового последнего delete и последующего pop_back. Всё работает, но сдаётся мне, что такое жонглирование динамической памятью не есть хорошо и работает медленно. Как лучше поступить в такой ситуации (довольно тривиальной, как мне кажется) - возможно, стоит использовать статические объекты и просто менять их статусы/координаты, используя один и тот же объект многократно?
0
|
|
| 15.12.2015, 09:36 | |
|
Ответы с готовыми решениями:
14
Взаимодействие двух объектов Объединение двух контейнеров Использование двух контейнеров из STL |
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
| 15.12.2015, 10:02 | |
Сообщение было отмечено just_one как решение
Решение
Ну, можно иметь вектор монстров, из которого они никогда не удаляются, а только добавляются, если их не хватает, и два списка индексов этого вектора - один для живых, другой для мертвых. Если нужно ввести монстра в игру, то берем индекс из мертвых и перемещаем его в список живых. Если список индексов мертвых пуст, то добавляем в вектор элемент, а его индекс добавляем в список живых. Если нужно удалить монстра из игры, то переносим его индекс из списка живых в список мертвых.
1
|
|
|
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 7
|
|
| 15.12.2015, 10:14 [ТС] | |
|
Спасибо, а как быть с пулями? По аналогичному принципу? Их одновременно может быть довольно немного даже при максимальной скорострельности, они удаляются при столкновении или достижении края экрана, а летят очень быстро.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|
| 15.12.2015, 10:40 | |
|
std::list и удаление по итератору чем не мило? Как раз будет константное время удаления/вставки в середину, с сохранением валидности ссылок на не удаленные элементы.
0
|
|
|
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 7
|
|
| 15.12.2015, 10:48 [ТС] | |
|
Да всё в порядке с std::list, меня изначально смущает сам факт постоянного выделения/очистки памяти вне зависимости от выбора конкретного контейнера. Класс игрового объекта у меня не очень большой пока, но будет расширяться, и я не могу спрогнозировать, как упадёт производительность от постоянных new/delete, потому и спрашиваю про удачное в такой ситуации решение.
0
|
|
|
|
|
| 15.12.2015, 10:59 | |
|
Для монстров следует использовать, что-то вроде вектора т.к. как скорость появления/исчезновения монстров не высока.
А вот для пуль придется писать свой класс, управляющий всеми пулями в сцене. Так как они создаются и уничтожаются очень быстро, то полагаю следует создать что-то похожее на пул.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
| 15.12.2015, 11:11 | |||
|
0
|
|||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 15.12.2015, 11:29 | ||
|
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 15.12.2015, 11:56 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 7
|
|||
| 15.12.2015, 11:59 [ТС] | |||
|
0
|
|||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 15.12.2015, 12:17 | ||
|
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 15.12.2015, 13:04 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 7
|
||
| 15.12.2015, 13:12 [ТС] | ||
|
0
|
||
| 15.12.2015, 13:17 | |
|
Не по теме: Воспоминания из прошлого:
0
|
|
| 15.12.2015, 13:17 | |
|
Помогаю со студенческими работами здесь
15
Не осуществляется объединение двух контейнеров Разработать программу с использованием двух последовательных контейнеров STL и трех методов Взаимодействие объектов Взаимодействие объектов 1-го класса Напечатать все буквы, входящие в текст не менее двух раз с использованием контейнеров map и multimap Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|