Ошибка сегментации при попытке изменить состояние игры

Я делаю конечный автомат для переключения игровых состояний (Игра-> Меню-> Настройка) в моем игровом движке, но у меня ошибка сегментации. Я могу изменить состояние игры нормально с верхнего уровня, но как я могу изменить игровое состояние из игрового состояния?

Вот минимальный пример кода:

#include <iostream>
#include <vector>

class GameStateManager;

class GameState {
public:
GameState(GameStateManager* StateManager) {
StateManager = stateManager;
};

virtual ~GameState();

virtual void update() = 0;

GameStateManager* stateManager;
};

class GameStateManager {
public:
GameStateManager();
~GameStateManager();

void changeGameState(GameState* state) {
if(!running) {
running = true;
}

// Cleanup the current state
if(!gameStates.empty()) {
for(unsigned int i = 0; i < gameStates.size(); i++) {
delete gameStates[i];
}
gameStates.clear();

std::cout << "Cleaning up GameState" << std::endl;
}

// Store and initialize the new game state
gameStates.push_back(state);
};

void update() {
if(!gameStates.empty()) {
gameStates.back()->update();
}
};

std::vector<GameState*> gameStates;
bool running;
};

class PlayState : public GameState {
public:
PlayState(GameStateManager* stateManager) : GameState(stateManager) {};
~PlayState();

void update() override {
// On some flag, initiate the next level
nextLevel();
};

void nextLevel() {
stateManager->changeGameState(new PlayState(stateManager));
};
};

int main() {
GameStateManager stateManager;

stateManager.changeGameState(new PlayState(&stateManager));

while(stateManager.running) {
for(unsigned int i = 0; i < 10000; i++) {
std::cout << "Round: " << i << std::endl;

// Segmentation fault here
stateManager.update();

// This works
//stateManager.changeGameState(new PlayState(&stateManager));
}
stateManager.running = false;
}
return 0;
}

1

Решение

по какой-то причине stateManager не устанавливается в GameState конструктор.

так что попробуйте это:

class GameState {
public:
GameState(GameStateManager* StateManager) : stateManager(StateManager)
{
};

virtual ~GameState();

virtual void update() = 0;

GameStateManager* stateManager;
};
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]