Динамический массив объектов.
|
|
Alkosha | Дата: Воскресенье, 14 Декабря 2014, 11:38 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Гутен морген/абенд/таг.
Как лучше сделать массив "взрывов" ? С индексами не понятно.
Объявлен вектор объектов. Код class myExplosion { public: float x,y; int framenum, ft; void update() { ... } void display() { ... }
}; vector <myExplosion> explosion;
Код void render (){ if(!explosion.empty()) { for(int i=0; i<explosion.size(); i++) { explosion[i]->display(); } } }
проблема в том, что в разной ситуации, разное кол-во анимашек взрыва должно проигрываться. Как быть с индексами? Каждый раз проходиться по массиву в поисках свободного от проигрывания анимации объекта , и пускать на проигрывание анимашки ? Или есть более оптимальные варианты ?
Сообщение отредактировал Alkosha - Воскресенье, 14 Декабря 2014, 11:39 |
|
| |
Saitei | Дата: Воскресенье, 14 Декабря 2014, 12:39 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Цитата Alkosha ( ) проблема в том, что в разной ситуации, разное кол-во анимашек взрыва должно проигрываться. Как быть с индексами? Каждый раз проходиться по массиву в поисках свободного от проигрывания анимации объекта , и пускать на проигрывание анимашки ? Или есть более оптимальные варианты ? Хранить вектор объектов. У объектов хранить текущий кадр и изменять его в их Update методе. Или я что-то не догнал... Хз
Сообщение отредактировал Saitei - Воскресенье, 14 Декабря 2014, 12:39 |
|
| |
Alkosha | Дата: Воскресенье, 14 Декабря 2014, 15:07 | Сообщение # 3 |
участник
Сейчас нет на сайте
| Цитата Saitei ( ) Хранить вектор объектов. У объектов хранить текущий кадр и изменять его в их Update методе. Или я что-то не догнал... Хз
Да, так я и делаю. Но, например ,произошёл где-то один взрыв. Ему будет присвоен первый индекс. Потом второй взрыв - второй индекс. Пока взрывался второй, первый взрыв "угас". Но тут надо произвести третий взрыв. Не расширять же вектор до бесконечности, можно воспользоваться "потухшим взрывом". Но для того, чтоб узнать, который из них потух, нужно проходиться по образованному массиву, проверяя флаг активности взрыва.
Сообщение отредактировал Alkosha - Воскресенье, 14 Декабря 2014, 15:07 |
|
| |
Saitei | Дата: Воскресенье, 14 Декабря 2014, 18:13 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| Цитата Alkosha ( ) Да, так я и делаю. Но, например ,произошёл где-то один взрыв. Ему будет присвоен первый индекс. Потом второй взрыв - второй индекс. Пока взрывался второй, первый взрыв "угас". Но тут надо произвести третий взрыв. Не расширять же вектор до бесконечности, можно воспользоваться "потухшим взрывом". Но для того, чтоб узнать, который из них потух, нужно проходиться по образованному массиву, проверяя флаг активности взрыва. Создай очередь\вектор "освобождённых индексов", в чём проблема?
|
|
| |
Apati | Дата: Воскресенье, 14 Декабря 2014, 19:00 | Сообщение # 5 |
заслуженный участник
Сейчас нет на сайте
| Цитата Alkosha ( ) explosion[i]->display(); Сразу после этой строки проверяешь завершилась ли анимация, если да - берешь последний элемент коллекции, перемещаешь в массиве его на позицию i, потом уменьшаешь массив на 1 и делаешь --i, чтобы перемещенный врзыв обработался на следующей итерации.
|
|
| |
Alkosha | Дата: Воскресенье, 14 Декабря 2014, 21:15 | Сообщение # 6 |
участник
Сейчас нет на сайте
| Как удалить последний элемент вектора я ещё знаю. Но перемещать элементы я не знаю как.
|
|
| |
Apati | Дата: Воскресенье, 14 Декабря 2014, 21:17 | Сообщение # 7 |
заслуженный участник
Сейчас нет на сайте
| Код delete explosion[i]; explosion[i] = explosion[explosion.size()-1] Примерно так.
|
|
| |
Snake174 | Дата: Понедельник, 15 Декабря 2014, 06:36 | Сообщение # 8 |
участник
Сейчас нет на сайте
| Код vector <myExplosion *> explosion;
...
// Создаём взрыв и заносим в вектор myExplosion *ex = new myExplosion(); explosion.push_back( ex );
...
// Когда проиграется вся анимация удалить взрыв void removeExplosion( myExplosion *ex ) { vector<myExplosion *>::iterator it = find( explosion.begin(), explosion.end(), ex );
if (it != explosion.end()) { int pos = distance( explosion.begin(), it );
delete explosion.at( pos ); explosion.at( pos ) = 0;
explosion.erase( it ); } }
Вроде ничего не напутал. На работоспособность не проверял.
Не следует обманывать инспектора Pipmak Assistant Love2D Exporter Love2D-Helpers Old Consoles Games
|
|
| |
OpenGOO | Дата: Понедельник, 15 Декабря 2014, 12:28 | Сообщение # 9 |
почти ветеран
Сейчас нет на сайте
| Alkosha, Можешь еще воспользоваться таким паттерном проектирования как объектный пул (object pool).
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |