From 3561f6c9b0d982ee9c90e9cd65a2dbcdacf5c846 Mon Sep 17 00:00:00 2001
From: Claudio Hoffmann <hoffmanncl72341@th-nuernberg.de>
Date: Tue, 19 Jan 2021 23:33:25 +0100
Subject: [PATCH] Level: Directly add a spawner trooper, rather than returning
 a std::unique_ptr

Avoids the nullptr.
---
 Level.cpp | 16 +++++++---------
 Level.hpp |  3 ++-
 main.cpp  |  2 +-
 3 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/Level.cpp b/Level.cpp
index 74232bb..49e0a47 100644
--- a/Level.cpp
+++ b/Level.cpp
@@ -132,21 +132,19 @@ void Level::addPlayerProjectile(PlayerProjectile const& projectile)
 // weberma73121> ----------------------------------------------------------------------
 
 // <kruegerzo72182 ----------------------------------------------------------------------
-// pops the last trooper from the trooperSpawner and reduces the vector capacity
-std::unique_ptr<Enemy> Level::getTrooperSpawn()
+void Level::addTrooperFromSpawner()
 {
-    if(trooperSpawner.back() != 0){
-    std::unique_ptr<Enemy> enemy_ptr = std::move(trooperSpawner.back());
-    trooperSpawner.pop_back();
-    trooperSpawner.shrink_to_fit();
-    return enemy_ptr;
+    if(trooperSpawner.size() > 0){
+        // Where is the std::vector pop_back() method that returns an rvalue
+        // reference, dear C++ committee?! Where is it?!? --hoffmanncl72341
+        this->enemyVector_PushBack(std::move(trooperSpawner.back()));
+        trooperSpawner.pop_back();
     }
-    else return nullptr;
 }
 
 unsigned int Level::getEnemySpawnCount()
 {
-    return static_cast<unsigned int>(trooperSpawner.capacity());
+    return static_cast<unsigned int>(trooperSpawner.size());
 }
 
 void Level::enemyVector_PushBack(std::unique_ptr<Enemy> enemy_)
diff --git a/Level.hpp b/Level.hpp
index bd2666f..8d5d898 100644
--- a/Level.hpp
+++ b/Level.hpp
@@ -127,7 +127,8 @@ public:
     void addScenery(Position const &topleft, SceneryType type);
     void addEnemy(std::unique_ptr<Enemy> enemy_);
     void fillTrooperSpawner(float posX, float posY, unsigned int nmbrEnemies);
-    std::unique_ptr<Enemy> getTrooperSpawn();
+    // Adds a new trooper from the trooper spawner, if any.
+    void addTrooperFromSpawner();
     unsigned int getEnemySpawnCount();
     bool checkCollision(float posX, float posY, int bufferWidth, int bufferHeigth);
     // Did an enemy entity hit the player?
diff --git a/main.cpp b/main.cpp
index 3c2ecf2..c65f8d3 100644
--- a/main.cpp
+++ b/main.cpp
@@ -92,7 +92,7 @@ public:
           trooperTimer = trooperTimer + frame_time.count();
           if(level.getEnemySpawnCount() != 0){
               if(trooperTimer > trooperSpawnTime){
-                  level.enemyVector_PushBack(level.getTrooperSpawn());
+                  level.addTrooperFromSpawner();
                   trooperTimer = 0.0f;
               }
             }
-- 
GitLab