0

VS 2010 を使用しています。リリース モードでゲーム内メニューが閉じないという問題があります。デバッグモードで動作します。これは、余分なコードを可能な限り削除した私のコードです。うまくいけば、それが何をするかを見ることができます。

ESC キーが押されてメニューが表示され、ユーザーがボタンをクリックすると、Game クラスに何をすべきかを伝える int が返されます。[終了] をクリックすると、機能します。ただし、他のものをクリックすると、適切なアクションが実行され、メニューが一瞬だけ閉じられ、その後元に戻ります。なぜ開いたままなのかはわかりません。メニューが表示されているときにボタン (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;
}

コードが多すぎて申し訳ありません。何が起こっているのかを説明するのに役立たないものはすべて削除しようとしました。さらに必要な場合は、さらにコードを投稿して、不明な点を説明することができます。この時点で任意のアイデアを歓迎します。考えられることはすべて試しましたが、それを壊して修正する以外に何も達成できませんでした。

[アップデート]

再起動 (いずれかのフレーバー)、Exit、または SplashScreen を選択すると、正しいコードが返されます。正しい動作が得られます。ゲームを続行するために 1 を返すと、メニューが点滅して閉じてから再度開きます。しかし、それは私がクリックしたときだけです。コード内の他の場所にある他のキーまたはボタンを押すと、閉じます。(たとえば、クリックする前にプレイヤーを移動するために上向き矢印を押したままにすると、メニューが適切に閉じられ、キャラクターが移動します。) コードを上下に検索しましたが、初期化されていない変数はどこにもありません。私は何でも試してみたいと思っています。私は絶対に途方に暮れています。

4

0 に答える 0