SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Контейнеры в классе › Ответ в теме: Контейнеры в классе
вызываешь draw, который у тебя в классе не описан.
1 |
(*it)->draw( window ); //Ошибка компиляции |
просто так рисовать через итератор у тебя не получится, ты должен рисовать спрайт объекта списка.
1 |
window.draw(*it); //Ошибка компиляции |
вспомни, мы ведь в int main не рисуем объект player, мы рисуем только его спрайт.
Я думаю сможешь нарисовать так, как написал draw(*it) только если закинешь в список одни лишь спрайты.
Чтобы нарисовать объект – тебе нужен спрайт.
Чтобы вызвать функцию (метод) (или обратиться к свойству) объекта нужно пройтись итератором по эл-там списка и вызвать её так: (*it)->функция();
Далее приведу отрывки переписки с Heisenberg’ом в вконтакте, чтобы другие тоже знали.
Итератор нужен для прохождения по элементам списка. И у всех элементов должна быть ф-ция, которую ты вызываешь (или у их базового класса), иначе скажет, что такой ф-ции или переменной нету.
Список хранит в себе объекты, итератор пробегается от начала до конца. В каждом элементе списка есть адрес на следующий элемент (такая конструкция называется односвязный или однонаправленный список). Когда ты захочешь удалить элемент посередине списка – адресация от предыдущего элемента направится с предыдущего от удаленного, на следующий к удаленному. Например в списке лежат объекты 1->2->3 , удалишь 2 будет 1->3. Очень удобно удалять, например пули в игре. Если удаляешь с вектора, то нужно будет вынуть и назад запихнуть из него элементы. Поэтому тут список лучше.
и в списке нельзя обращаться по индексу к элементу, поэтому прём итератором.
и нам не надо писать кучу строк типа player1.update();
player2.update(); и тд
а просто закинуть в список плеер и вызывать it->update()