void MenuLoop(MenuSystem *menu) { assert(menu->numExitTypes > 0); for (;; SDL_Delay(10)) { // Input InputPoll(menu->joysticks, menu->keyboard); // Update if (menu->current->type == MENU_TYPE_KEYS && menu->current->u.normal.changeKeyMenu != NULL) { MenuProcessChangeKey(menu->current); } else { int cmd = GetMenuCmd(); menu->current = MenuProcessCmd(menu->current, cmd); } if (MenuHasExitType(menu, menu->current->type)) { break; } // Draw if (menu->bkg != NULL) { memcpy( GetDstScreen(), menu->bkg, GraphicsGetMemSize(&gGraphicsDevice.cachedConfig)); } ShowControls(); MenuDisplay(menu); CopyToScreen(); } }
void MenuLoop(MenuSystem *menu) { assert(menu->numExitTypes > 0); for (;; SDL_Delay(10)) { MusicSetPlaying(&gSoundDevice, SDL_GetAppState() & SDL_APPINPUTFOCUS); // Input InputPoll(menu->inputDevices, SDL_GetTicks()); // Update if (menu->current->type == MENU_TYPE_KEYS && menu->current->u.normal.changeKeyMenu != NULL) { MenuProcessChangeKey(menu->current); } else { int cmd = GetMenuCmd(gPlayerDatas); MenuProcessCmd(menu, cmd); } if (MenuIsExit(menu)) { break; } // Draw GraphicsBlitBkg(menu->graphics); ShowControls(); MenuDisplay(menu); BlitFlip(menu->graphics, &gConfig.Graphics); } }
static GameLoopResult MenuUpdate(void *data) { MenuSystem *ms = data; if (ms->current->type == MENU_TYPE_KEYS && ms->current->u.normal.changeKeyMenu != NULL) { MenuProcessChangeKey(ms->current); } else { const int cmd = GetMenuCmd(ms->handlers); if (cmd) { MenuProcessCmd(ms, cmd); } } // Check if anyone pressed escape, or we need a hard exit int cmds[MAX_LOCAL_PLAYERS]; memset(cmds, 0, sizeof cmds); GetPlayerCmds(&gEventHandlers, &cmds); const bool aborted = ms->allowAborts && EventIsEscape(&gEventHandlers, cmds, GetMenuCmd(&gEventHandlers)); if (aborted || ms->handlers->HasQuit) { ms->hasAbort = true; return UPDATE_RESULT_EXIT; } if (MenuIsExit(ms)) { return UPDATE_RESULT_EXIT; } if (ms->current->customPostUpdateFunc) { ms->current->customPostUpdateFunc( ms->current, ms->current->customPostUpdateData); } return UPDATE_RESULT_DRAW; }