SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Итераторы
В этой теме 2 ответа, 2 участника, последнее обновление spoty76 6 года/лет, 4 мес. назад.
-
АвторСообщения
-
Наверное глупый вопрос, но я не знаю как это решить. У меня есть два массива: массив врага и текста. Я хочу чтобы над каждым врагом был текст с его здоровбем, и мне обязательно это через список текста надо сделать, проблема в том, что я не знаю как каждый элемент текста присвою к конкретному элементу врага?
C++123456789101112131415161718class Up {public:int size;bool life = true;Font f;Text t;Up(int size, Font Fo){f = Fo;t.setFont(f);t.setCharacterSize(size);}void update(float X, float Y, String h){t.setPosition(X, Y);t.setString(h);}};C++1234567std::list<Entity*> enemyArray;std::list<Entity*>::iterator iter1;std::vector<Object> e = lvl.GetObjects("zombie");for (int i = 0; i < e.size(); i++)enemyArray.push_back(new Enemy(zombieIm, lvl, lvl2, e[i].rect.left, e[i].rect.top, 300, 400, "zombie"));std::list<Up*> upArray;std::list<Up*>::iterator upIt;То есть, как мне сделать чтобы у каждого врага был свой текст только со своим здоровьем над головой, примерно используя такую схему?
C++1234567for (iter1 = enemyArray.begin(); iter1 != enemyArray.end(); iter1++){for (upIt = upArray.begin(); upIt != upArray.end(); upIt++){(*upIt)->update((*iter1)->x, (*iter1)->y, std::to_string((*iter1)->health));}}Ну начнем с того, что возможно ты делаешь что-то неправильно, если тебе нужен текст в отдельном списке. Ведь твоя задача так и звучит: “Нужно чтобы у каждого врага был свой текст со своим здоровьем”, а как минимум это уже значит, что текст должен быть в классе врага.
Но если вдруг возникла такая необходимость, то можно попробовать следующие варианты:- Вместо 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));}Такой вариант на производительность никак не повлияет, но мало чем отличается от простого хранения текста в классе врага. И нужно подумать как присвоить тексту его врага при создании.
Я же говорил глупый вопрос, как я не додумался просто в классе врага текст делать, спасибо!
- Вместо std::list использовать std::deque. В нем можно получать доступ к элементам по их номеру, а значит можно сделать так:
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.