Чтобы ответить на вопрос о деструкторах, никто, похоже, еще не рассмотрел.Согласно 6.6 / 2, деструкторы будут вызываться для вас.Цитата:
При выходе из области (хотя и выполненной) деструкторы (12.4) вызываются для всех построенных объектов с автоматической продолжительностью хранения (3.7.2) (именованные объекты или временные объекты), которые объявлены вэта область, в обратном порядке их объявления.Передача из цикла, из блока или обратно после инициализированной переменной с автоматическим сроком хранения включает в себя уничтожение переменных с автоматическим сроком хранения, которые находятся в области действия в точке, перенесенной из, но не в точке, переданной в.
Однако я все еще не предлагаю goto
в этом случае вообще.Это не ясно (для меня так или иначе) указывает на то, что происходит.Вы должны просто использовать цикл while и заставить его работать вместо условий.
Даже что-то настолько простое, как это, должно быть более понятным (хотя, возможно, есть способ переписать его без внутреннего разрыва).Совершенно очевидно, что местные жители убираются в цикле while, например так:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// initiate sdl
sdl_init();
// seed rng
srand(time(NULL));
bool gamerunning = true;
while(gamerunning)
{
Game game(GAME_WIDTH, GAME_HEIGHT, 1, screen);
// keydowns
bool fastfall = false;
Uint32 lastupdate = 0;
while (gamerunning && game.isalive()) {
// game running stuff here
}
// game over stuff here
while (gamerunning) {
if (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
gamerunning = false;
} else if (event.type == SDL_KEYDOWN) {
if (event.key.keysym.sym == SDLK_r) break; // yay a new game - get out of the "what to do next" loop.
}
}
}
}
TTF_Quit();
SDL_Quit();
return 0;
}