Skip to content

Commit bfb0e8c

Browse files
author
GauravDe-git
committed
Fix: Crash when pickup items
1 parent 028f271 commit bfb0e8c

File tree

1 file changed

+32
-23
lines changed

1 file changed

+32
-23
lines changed

Mini_Assailants/src/Level.cpp

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ void Level::draw(Image& image)
233233
//GO text
234234
if (goTextTimer > 0.0f)
235235
{
236+
image.drawText(tafelSans, "GO->", glm::vec2{ SCREEN_WIDTH - 48, SCREEN_HEIGHT / 2 + 2 }, Color::Black);
236237
image.drawText(tafelSans, "GO->", glm::vec2{ SCREEN_WIDTH - 50, SCREEN_HEIGHT / 2 }, Color::Yellow);
237238
}
238239

@@ -557,34 +558,42 @@ void Level::doPlaying(float deltaTime)
557558
}
558559

559560
// Picking up the Items dropped by Enemies
560-
for (const auto entity : entities)
561-
{
562-
// Check if the entity is an item
563-
if (ItemDrop* item = dynamic_cast<ItemDrop*>(entity))
564-
{
561+
562+
// Adding the items to remove in a vector, and delete them later.
563+
// Deleting them within the iteration loop led to undefined behaviour.
564+
std::vector<ItemDrop*> itemsToRemove;
565+
566+
for (auto& entity : entities) {
567+
if (ItemDrop* item = dynamic_cast<ItemDrop*>(entity)) {
565568
item->update(deltaTime);
566569

567-
if (item->canPickUp() && player.getAABB().intersect(item->getAABB()))
568-
{
569-
switch (item->getType())
570-
{
571-
case ItemDrop::Type::HP:
572-
hpSFX.play();
570+
if (item->canPickUp() && player.getAABB().intersect(item->getAABB())) {
571+
switch (item->getType())
572+
{
573+
case ItemDrop::Type::HP:
574+
hpSFX.play();
573575
player.setHP(std::min(player.getHP() + item->getValue(), player.getMaxHP()));
574-
break;
575-
case ItemDrop::Type::MP:
576-
mpSFX.play();
577-
player.setMP(std::min(player.getMP() + item->getValue(), player.getMaxMP()));
578-
break;
579-
case ItemDrop::Type::Coin:
576+
break;
577+
case ItemDrop::Type::MP:
578+
mpSFX.play();
579+
player.setMP(std::min(player.getMP() + item->getValue(), player.getMaxMP()));
580+
break;
581+
case ItemDrop::Type::Coin:
580582
coinSFX.play();
581-
player.setCoins(player.getCoins() + item->getValue());
583+
player.setCoins(player.getCoins() + item->getValue());
582584
break;
583-
}
584-
std::erase(entities, item);
585-
delete item;
586-
}
587-
}
585+
}
586+
// Add to the list of items to remove
587+
itemsToRemove.push_back(item);
588+
}
589+
}
590+
}
591+
592+
// Remove items after iterating
593+
for (ItemDrop* item : itemsToRemove) {
594+
// Erase and delete the item
595+
std::erase(entities, item);
596+
delete item;
588597
}
589598

590599
// Removing Enemies when they are in none state.

0 commit comments

Comments
 (0)