Я пытаюсь создать класс, в котором хранится вектор Chest
, где Chest
- это собственный класс, который я создал. Вот соответствующая часть ItemManager.h
:C++ - Объекты в векторе не могут быть изменены
А то здесь (соответствующие части) ItemManager.cpp
:
void ItemManager::GenerateItems(sf::Vector2u currentPos)
{
if (rand() % 50 == 0)
chests.push_back(Chest(sf::Vector2f(16 * currentPos.x + 1, 16 * currentPos.y - 4 - 2)));
}
void ItemManager::CheckCollisions(Collider & collider)
{
for (Chest chest : chests)
if (collider.CheckCollision(chest.getCollider(), 1.0f))
chest.OnInteract();
}
Проблема, которую я теперь имею в том, что даже тогда, когда chest.OnInteract()
вызывается в CheckCollisions()
, ничего не происходит с сундуком. Однако это не проблема с этим методом, потому что, когда я вызываю chest.OnInteract()
по методу GenerateItems()
, он применяет то, что следует ожидать от сундука. Я убежден, что, поскольку я создаю локальную переменную в другом методе для добавления vector
, добавляемый объект выходит за рамки, и я больше не могу ссылаться на него. Однако я полагал, что добавление к vector
создает копию, и поэтому это не должно быть проблемой. Любая помощь приветствуется.
Редактировать
Вот мой OnInteract()
метод:
void Chest::OnInteract()
{
open = true;
chest.setSize(sf::Vector2f(14, 16));
chest.move(sf::Vector2f(0, -2));
chest.setTextureRect(sf::IntRect(14, 0, 14, 16));
}
где open
и chest
переменные члены Chest
.
Хорошо, я подумал, что это будет что-то в этом роде. Тем не менее, я просто попробовал то, что вы сказали, и это, похоже, не имеет никакого значения: нужно ли мне также редактировать, как я обращаюсь к сундуку внутри цикла? –
Нет, все в порядке. Как выглядит ваш метод 'OnInteract()'? – simpel01
Кроме того, вы уверены, что условие оператора 'if' когда-либо будет возвращено' true'? Возможно, ваша программа никогда не выполняет метод OnInteract(), потому что 'if' никогда не берется. – simpel01