@@ -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