Не пойму в чем проблема, работа с while()

файл main.cpp

#include "menu.h"

using namespace sf;

int main() {

    bool isGame = true;
    bool isg = true;

    while (game.isOpen()) {
        while (isg) {
            while (isGame) {
                ...
                if (y > 500) {
                    isGame = false;
                    Menu(game, score);
                    break;
                }
                ...
            }
            isGame = true;
        }
    }
    return 0;
}

файл menu.h


#pragma once
#ifndef _MENU_H
#define _MENU_H
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <iostream>
#include <Time.h>

using namespace sf;

void Menu(RenderWindow& game,int score) {
    bool isMenu = true;

    while (isMenu) {
        if (Mouse::isButtonPressed(Mouse::Left)) {
            if (menuNum == 1) {
                isMenu = false;
            }
        }
    }
}
#endif _MENU_H

По-моей задумке, когда объект опускается ниже 500 единиц, вызывается функция void Menu(). Затем, если я хочу сыграть снова, в данном случае вот это условие `

if (Mouse::isButtonPressed(Mouse::Left)) {
            if (menuNum == 1) {
                isMenu = false;
            }

` То я просто выхожу из цикла ф-ии void Menu() и возвращаюсь в первоначальный цикл. Но, при этом ничего не происходит, но по задумке -- затем выхожу из самого "глубокого" цикла в файле main, ставлю переменной true и обратно захожу в самый "глубокий" цикл. Извините если замучал этим текстом, мне кажется что ошибка лежит на поверхности, но я никак не могу до этого додуматься


Ответы (1 шт):

Автор решения: Alex Krass

В данном случае нужно какое-либо совместно используемое хранилище, которое бы позволило получать значение как из одной функции, так и из другой. А так же какой-либо механизм переключения с одной функции на другую.

Хранить общие ресурсы можно в глобальных переменных, промежуточных классах или статических классах. Для примера можно взять последний, должно выглядеть как-то так:

MySettings.cpp

class MySettings
{
    private:
        static bool isGame;
    public:
        static bool getIsGame() { return isGame; }
        static void setIsGame(bool status) { isGame = status; } 
};
bool MySettings::isGame = true;

Дальше подключаем наш файл к menu.h. Теперь надо разобраться с тем, что между функциями надо переключаться. Для этого лучше поместить код из main в отдельную функцию и убрать прямой вызов Menu.

void RenderGame(){
    while (MySettings::getIsGame()) {
        ...
        if (y > 500) {
            MySettings::setIsGame(false);
            break;
        }
        ...
    }
}

int main() {
    while(game.isOpen()){
        if(MySettings::getIsGame()){
            renderGame();
        } else {
            Menu(game, score);
        }
    }
    return 0;
}

Ну и меню поменять из этого же условия.

void Menu(RenderWindow& game,int score) {
    bool isMenu = true;

    while (isMenu) {
        if (Mouse::isButtonPressed(Mouse::Left)) {
            if (menuNum == 1) {
                MySettings::setIsGame(true);
                break;
            }
        }
    }
}
→ Ссылка