0

我正在使用 VS 2010。我的游戏内菜单在发布模式下没有关闭有问题。它在调试模式下工作。这是我的代码,尽可能多地删除了无关代码,希望您仍然可以看到它的作用。

应该发生的是当按下 ESC 键时,菜单显示,然后用户单击一个按钮并返回一个 int 告诉 Game 类该做什么。当我单击退出时,它可以工作。但是,当我单击其他任何内容时,会执行正确的操作,菜单会关闭一闪而过,然后又重新启动。我不知道为什么它保持开放。如果我在菜单启动时按下按钮(例如 ESC),菜单会按预期关闭。

Game::GameLoop
{ //etc code &Update and Draw Functions
    if(currentEvent.Type == sf::Event::KeyPressed && currentEvent.Key.Code == sf::Key::Escape)
    {
        ShowGameMenu();
    }
    //Code
    //Display() - clear buffer to the screen
}

void Game::ShowGameMenu()
{
    int bMenu = 0;
    bMenu = menu.Show(m_MainWindow);

    switch (bMenu) {
    case 1: //gameOn
        m_GameState = dlb::Playing;
        break;//etc cases that aren't the problem
    }
}

int Menu::Show(sf::RenderWindow& window)
{//Various menuState code that isn't the problem removed - This passes the returnCode back to game
    int code = 0;
    code = MainMenu(window);
    return code;
}

//returns 1-gameOn, 2-SplashScreen, 0-close, 3-restartLvl, 4-restartGame, 5-option,
int Menu::MainMenu(sf::RenderWindow& window)
{
    int returnCode = -1;
    bool running = true;
    sprite.SetPosition(center);

    sf::Event currentEvent;
    
    while (running)
    {
        window.GetEvent(currentEvent);

        Draw(window); //Displays the menu on top of game window

        if(currentEvent.Type == sf::Event::KeyPressed && currentEvent.Key.Code == sf::Key::Escape) //This works too
        {
            returnCode = 1;
            running = false;
        }

        if (currentEvent.Type == sf::Event::MouseButtonReleased && currentEvent.MouseButton.Button == sf::Mouse::Left)
        {
            sf::Vector2f mouse = sf::Vector2f((float)currentEvent.MouseButton.X, (float)currentEvent.MouseButton.Y);

            while ((*currItr)->IsEnd() != true)
            {
                if ((*currItr)->isClicked(mouse))
                {
                    //returns 1-gameOn, 2-SplashScreen, 0-close, 3-restartLvl, 4-restartGame, 5-option,
                    switch ((*currItr)->GetType())
                    {
                    case dlb::Exit:
                        returnCode = 0;
                        break;
                    case dlb::ReturnGame:
                        returnCode = 1;
                        break;
                        //various cases removed here because they matter not
                    }
                    running = false;
                    break;
                }
                else
                {
                    ++currItr;
                }
            }
        }
    }

    return returnCode;
}

很抱歉有这么多代码,我试图删除所有无助于解释发生了什么的东西。如果您需要更多,我可以发布更多代码并尝试解释我不清楚的任何内容。在这一点上,任何想法都会受到赞赏,我已经尝试了我能想到的一切,除了打破它并不得不修复它之外什么也没做。

[更新]

它返回正确的代码,如果我选择重新启动(任一风味)、退出或 SplashScreen,我会得到正确的行为。当我返回 1 继续游戏时,菜单闪烁关闭然后重新打开。但只有当我点击时。如果我按下代码中其他任何位置的任何其他键或按钮,它就会关闭。(例如,在单击之前按住向上箭头移动播放器,它将正确关闭菜单并移动角色。)我已经上下搜索了我的代码,并且在任何地方都没有看到任何未初始化的变量。我愿意尝试任何事情;我完全不知所措。

4

0 回答 0