SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Итераторы › Ответ в теме: Итераторы
Ну начнем с того, что возможно ты делаешь что-то неправильно, если тебе нужен текст в отдельном списке. Ведь твоя задача так и звучит: “Нужно чтобы у каждого врага был свой текст со своим здоровьем”, а как минимум это уже значит, что текст должен быть в классе врага.
Но если вдруг возникла такая необходимость, то можно попробовать следующие варианты:
- Вместо std::list использовать std::deque. В нем можно получать доступ к элементам по их номеру, а значит можно сделать так:
C++12345for(int i = 0; i < enemyArray.size(); i++){enemyArray[i].update(...);upArray[i].update(enemyArray[i].x, enemyArray[i].y...)}
Но нужно знать, что в этом массиве доступ к элементу по оператору [i] происходит долго, а значит при большом количестве врагов и текста игра начнет тормозить.
- Использовать контейнер ключ-значение, в твоем случае подойдет std::unordered_map<Entity*, Up*>. Но циклы по этому контейнеру также очень медленные.
- Хранить в каждом объекте текста указатель на его врага(или наоборот). Например:
C++1234567891011121314151617181920class Up {public:int size;bool life = true;Font f;Text t;Enemy* myEnemy;Up(int size, Font Fo, Enemy* enemy){f = Fo;t.setFont(f);t.setCharacterSize(size);myEnemy = enemy;}void update(float X, float Y, String h){t.setPosition(X, Y);t.setString(h);}};
тогда можно будет создать простой цикл:
C++12345for (upIt = upArray.begin(); upIt != upArray.end(); upIt++){Enemy* enemy = (*upIt)->myEnemy;(*upIt)->update(enemy->x, enemy->y, std::to_string(enemy->health));}Такой вариант на производительность никак не повлияет, но мало чем отличается от простого хранения текста в классе врага. И нужно подумать как присвоить тексту его врага при создании.