Skip to content
This repository has been archived by the owner on Nov 15, 2022. It is now read-only.
Antek Bizon edited this page Mar 5, 2022 · 1 revision

Funkcja Update

Ona odpowiada za to co i kiedy powinno zmienić swoją wartość. Robi to na podstawie aktualnego stanu (state) gry. Przykładowo, gdy stan gry ustawiony jest MAIN_MENU, funkcja sprawdzi czy wybraliśmy jakiś element w menu. Jeśli tak to zmieni stan gry na na przykład GAME_START, co w rezultacie doprowadzi do rozpoczęcia się gry.

void Game::Update() {
    frameCounter++;

    for (int i = 0; i < 4; i++) {
        if (lifeTime[i] != 0)
            CheckTime();
    }

    if (GetKeyPressed() == KEY_ESCAPE) {
        if (state == State::PAUSED) {
            ChangeState(State::ACTIVE);
            PlaySound(audio[MENU_BACK]);
        } else if (state == State::ACTIVE) {
            ChangeState(State::PAUSED);
            PlaySound(audio[MENU_BACK]);
        } else if (state == State::SAVE_MENU) {
            ChangeState(State::PAUSED);
            PlaySound(audio[MENU_BACK]);
        } else if (state == State::LOAD_MENU) {
            ChangeState(State::MAIN_MENU);
            PlaySound(audio[MENU_BACK]);
        } else if (state == State::MAIN_MENU) {
            ChangeState(State::MOD_MENU);
            PlaySound(audio[MENU_BACK]);
        } else if (state == State::DIFFLVL_MENU) {
            ChangeState(State::MOD_MENU);
            PlaySound(audio[MENU_BACK]);
        } else if (state == State::RANKING) {
            ChangeState(State::MAIN_MENU);
            PlaySound(audio[MENU_BACK]);
        }
    }  

    switch (state) {
    case Game::State::MAIN_MENU:
        if (mainMenu.selected == "Start") {
            ChangeState(State::GAME_START);
            mainMenu.selected = "";
        } else if (mainMenu.selected == "Load") {
            ChangeState(State::LOAD_MENU);
            loadMenu.Reload(FindLoadFiles());
            mainMenu.selected = "";
        } else if (mainMenu.selected == "Level") {
            ChangeState(State::LEVEL_SELECTOR);
            mainMenu.selected = "";
        } else if (mainMenu.selected == "Ranking") {
            ChangeState(State::RANKING);
            mainMenu.selected = "";
        }
        mainMenu.Update();
        break;
    case Game::State::MOD_MENU:
        if (modMenu.selected == "Mod 1") {
            ChangeState(State::DIFFLVL_MENU);
            modNum = 1;
            modMenu.selected = "";
        } else if (modMenu.selected == "Mod 2") {
            ChangeState(State::MAIN_MENU);
            modNum = 2;
            level = 1;
            modMenu.selected = "";
        } else if (modMenu.selected == "Mod 3") {
            ChangeState(State::MAIN_MENU);
            modNum = 3;
            level = 16;
            modMenu.selected = "";
        }
        modMenu.Update();
        break;
    case Game::State::DIFFLVL_MENU:
        if (diffLvlMenu.selected == "Easy") {
            level = GetRandomValue(1, 5);
            ChangeState(State::GAME_START);
            diffLvlMenu.selected = "";
        } else if (diffLvlMenu.selected == "Normal") {
            level = GetRandomValue(6, 10);
            ChangeState(State::GAME_START);
            diffLvlMenu.selected = "";
        } else if (diffLvlMenu.selected == "Hard") {
            level = GetRandomValue(11, 15);
            ChangeState(State::GAME_START);
            diffLvlMenu.selected = "";
        }
        diffLvlMenu.Update();
        break;
    case Game::State::LEVEL_SELECTOR:
        if (IsKeyPressed(KEY_ENTER)) {
            PlaySound(audio[MENU_ENTER]);
            ChangeState(State::GAME_START);
        } else if (IsKeyPressed(KEY_ESCAPE)) {
            ChangeState(State::MAIN_MENU);
        } else if (IsKeyPressed(KEY_RIGHT)) {
            if (modNum == 2) {
                if (level < 15) {
                    level += 1;
                    PlaySoundMulti(audio[MENU_SELECT]);
                }
            } else {
                if (level < NUM_LEVELS) {
                    level += 1;
                    PlaySoundMulti(audio[MENU_SELECT]);
                }
            }
        } else if (IsKeyPressed(KEY_LEFT)) {
            if (modNum == 2) {
                if (level > 1) {
                    level -= 1;
                    PlaySoundMulti(audio[MENU_SELECT]);
                }
            } else {
                if (level > 16) {
                    level -= 1;
                    PlaySoundMulti(audio[MENU_SELECT]);
                }
            }
        }
        break;
    case Game::State::SAVE_MENU:
        if (saveMenu.selected == "Save 1") {
            saveNum = 1;
            ChangeState(State::OVERWRITE_MENU);
            saveMenu.selected = "";
        } else if (saveMenu.selected == "Save 2") {
            saveNum = 2;
            ChangeState(State::OVERWRITE_MENU);
            saveMenu.selected = "";
        } else if (saveMenu.selected == "Save 3") {
            saveNum = 3;
            ChangeState(State::OVERWRITE_MENU);
            saveMenu.selected = "";
        } else if (saveMenu.selected == "Save 4") {
            saveNum = 4;
            ChangeState(State::OVERWRITE_MENU);
            saveMenu.selected = "";
        } else if (saveMenu.selected == "Empty slot") {
            if (SaveGame(numFiles + 1))
                ChangeState(State::GAME_SAVED);
            else
                ChangeState(State::ERROR);

            saveMenu.selected = "";
        }
        saveMenu.Update();
        break;
    case Game::State::OVERWRITE_MENU:
        if (overwriteMenu.selected == "Overwrite?") {
            if (SaveGame(saveNum))
                ChangeState(State::GAME_SAVED);
            else
                ChangeState(State::ERROR);
        } else if (overwriteMenu.selected == "Cancel")
            ChangeState(State::SAVE_MENU);

        overwriteMenu.selected = "";
        overwriteMenu.Update();
        break;
    case Game::State::LOAD_MENU:
        if (loadMenu.selected == "Save 1") {
            LoadGame(1);
            ChangeState(State::ACTIVE);
            loadMenu.selected = "";
        } else if (loadMenu.selected == "Save 2") {
            LoadGame(2);
            ChangeState(State::ACTIVE);
            loadMenu.selected = "";
        } else if (loadMenu.selected == "Save 3") {
            LoadGame(3);
            ChangeState(State::ACTIVE);
            loadMenu.selected = "";
        } else if (loadMenu.selected == "Save 4") {
            LoadGame(4);
            ChangeState(State::ACTIVE);
            loadMenu.selected = "";
        } else if (loadMenu.remove == "Save 1") {
            RemoveSave(1);
            loadMenu.remove = "";
        } else if (loadMenu.remove == "Save 2") {
            RemoveSave(2);
            loadMenu.remove = "";
        } else if (loadMenu.remove == "Save 3") {
            RemoveSave(3);
            loadMenu.remove = "";
        } else if (loadMenu.remove == "Save 4") {
            RemoveSave(4);
            loadMenu.remove = "";
        }
        loadMenu.Update();
        break;
    case Game::State::ACTIVE:
        if (lives <= 0) {
            ChangeState(State::GAME_OVER);
            break;
        }
        if (endLevelTime > 0) {
            std::time_t now = std::time(nullptr);
            elapsedLevelTime = endLevelTime - now;
            if (elapsedLevelTime <= 0) {
                elapsedLevelTime = 0;
                endLevelTime = 0;
                ChangeState(State::GAME_OVER);
            }
        }
        MoveSprites();

        if (laserCooldown > 0)
            laserCooldown--;

        if (backMusic != NUM_MUSIC)
            UpdateMusicStream(music[backMusic]);
        break;
    case Game::State::PAUSED:
        if (ingameMenu.selected == "Save Game") {
            ChangeState(State::SAVE_MENU);
            saveMenu.Reload(FindSaveFiles());
            ingameMenu.selected = "";
        } else if (ingameMenu.selected == "Continue") {
            ChangeState(State::ACTIVE);
            ingameMenu.selected = "";
        } else if (ingameMenu.selected == "Back to Menu") {
            ChangeState(State::GAME_OVER);
            ingameMenu.selected = "";
        }
        ingameMenu.Update();

        endLevelTime = std::time(nullptr) + elapsedLevelTime;
        break;
    case Game::State::LEVEL_FINISHED:
        if (sequenceFrameCounter > frameCounter) return;

        level += 1;
        if (modNum == 2) {
            if (level > 15)
                ChangeState(State::GAME_FINISHED);
            else
                RestartLevel();
        } else {
            if (level > NUM_LEVELS)
                ChangeState(State::GAME_FINISHED);
            else
                RestartLevel();
        }
        break;
    case Game::State::GAME_START:
        if (sequenceFrameCounter > frameCounter) return;

        StartGame();
        break;
    case Game::State::GAME_OVER:
        if (sequenceFrameCounter > frameCounter) return;

        if (backMusic != NUM_MUSIC && IsMusicStreamPlaying(music[backMusic])) {
            StopMusicStream(music[backMusic]);
            backMusic = NUM_MUSIC;
        }
        if (modNum == 2) {
            for (int i = 0; i < 10; i++) {
                if (rankScore[i] < score) {
                    if (i != 9) {
                        for (int j = 9; j > i; j--) {
                            rankScore[j] = rankScore[j - 1];
                        }
                        rankScore[i] = score;
                    } else
                        rankScore[i] = score;
                    break;
                }
            }
        }
        if (modNum == 1)
            ChangeState(State::DIFFLVL_MENU);
        else
            ChangeState(State::MAIN_MENU);
        backTexture = BACKGROUND_ANI2;
        break;
    case Game::State::GAME_FINISHED:
        for (int i = 0; i < 10; i++) {
            if (rankScore[i] < score) {
                if (i != 9) {
                    for (int j = 9; j > i; j--) {
                        rankScore[j] = rankScore[j - 1];
                    }
                    rankScore[i] = score;
                } else 
                    rankScore[i] = score;
            }
        }

        if (sequenceFrameCounter > frameCounter) return;

        ChangeState(State::MAIN_MENU);
        break;
    case Game::State::GAME_SAVED:
        if (sequenceFrameCounter > frameCounter) return;

        saveMenu.Reload(FindSaveFiles());
        ChangeState(State::SAVE_MENU);
        break;
    default:
        break;
    }
}
}
Clone this wiki locally