Witam
Tworzę grę platformową i chciałbym po wyjściu z mapy do menu żeby cała mapa została zwalniana.
W zasadzie to wygląda to tak, że mam klasę GameScreen
, która jest matką dla klas : menu główne, opcje, pauza, gra.
Ta klasa posiada parę metod w tym 2 :
void onEntry(); // < alokujemy co potrzeba
void onExit(); // < zwalniamy to co zaalokowaliśmy
I do tego jest manager, który dodaje nam właśnie te klasy i ustawia, która klasa jest aktualnie aktywna.
Główna klasa z pętlą gry posiada metodę update, która w zależności od stanu, wywołuję onEntry() i onExit()
void MainGame::Update(float deltaTime)
{
if (currentScreen) {
switch (currentScreen->getState()) {
case ScreenState::RUNNING:
currentScreen->Update(deltaTime);
break;
case ScreenState::CHANGE_NEXT:
currentScreen->onExit();
currentScreen = screenManager->MoveNext();
if (currentScreen) {
currentScreen->setRunning();
currentScreen->onEntry();
}
break;
case ScreenState::CHANGE_PREVIOUS:
currentScreen->onExit();
currentScreen = screenManager->MovePrevious();
if (currentScreen) {
currentScreen->setRunning();
currentScreen->onEntry();
}
break;
case ScreenState::EXIT:
exitGame();
break;
default:
break;
}
} else exitGame();
}
W momencie kliknięcia escape kiedy jesteśmy na mapie, powinno przenosić nas do menu głównego a cała pamięć, która jest wykorzystywana do tworzenia tej mapy powinna zostać zwolniona.
Mam klasę Mapa
która jest matką dla różnych typów oraz manager do tego:
class MapManager
{
...
private:
std::vector<std::unique_ptr<Map>> map;
};
MapManager::MapManager() {}
MapManager::~MapManager() { Free(); }
void MapManager::AddMap(Map* m)
{
map.push_back(std::unique_ptr<Map>(m));
}
void MapManager::Update(float deltaTime, Player& player)
{
for (const auto& m : map) {
m->Update(deltaTime, player);
}
/*for (auto &m : map)
{
auto removeIf = std::remove_if(map.begin(), map.end(), [](const std::unique_ptr<Map> &ma) {
//return ma->mapState == Map::Destroy; TODO: create return
});
map.erase(removeIf, map.end());
}*/
}
void MapManager::UpdateInput(InputManager input)
{
for (const auto& m : map) {
m->UpdateInput(input);
}
}
void MapManager::Draw(Renderer& renderer)
{
for (const auto& m : map) {
m->Draw(renderer);
}
}
int MapManager::getNumEnviroment()
{
return (int)map.size();
}
void MapManager::Free()
{
map.resize(0);
for (auto& m : map) {
m.reset();
}
map.clear();
}
I GameplayScreen, który onEntry dodaje mapę metodą void AddMap(Map* m);
, a onExit powinien wywoływać metodę void Free();
Jednak gdy klikam escape i zaczyna dziać się cała magia pojawia się kod:
nawet przy samym map.clear();
czy map.resize(0);
pojawia się to samo.
Co jest tego problemem? Dlaczego nie moge zwolnić pamięci?