我的基本SFML游戏的unique_ptr和StateManager,从命令屏幕出现错误

问题描述

void GameManager::pushMenuState()
{
    states.push_back(std::move(std::make_unique<MenuState>(window)));//std::make_unique<MenuState>(window)
}

void GameManager::pushPlayState()
{
    states.push_back(std::move(std::make_unique<PlayState>(window)));//std::make_unique<PlayState>(window)
}
/*-------------------------------------------------*/
void GameManager::popState()
{
    states.erase(states.begin());
}
////////////////////////////////////////////////////


void GameManager::Update()
{
    while(window->isopen())
    {
        if(sf::Keyboard::isKeypressed(sf::Keyboard::D))
        {
            isMenu=false;
        }
        if(sf::Keyboard::isKeypressed(sf::Keyboard::S))
        {
            isMenu=true;

        }
////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
        if(isMenu)
        {
            if(states.empty())
                pushMenuState();
            else if(states.size()<=1&&states.front()->getStateType()!=State::MENU)
                pushMenuState();
            
            if(states.size()>1&&states.front()->getStateType()!=State::MENU)
                popState();
            states.back()->Update(window);

        }
////////////////////////////////////////////////////////////////////////////////////////////////////////
        else
        {
            if(states.empty())
                pushPlayState();
            else if(states.size()<=1&&states.front()->getStateType()!=State::PLAY)
                pushPlayState();
            
            if(states.size()>1&&states.front()->getStateType()!=State::PLAY)
                popState();
            states.back()->Update(window);
        }
////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////

    }


}

这是我的代码。首先,我处于菜单状态。我按“ D”键切换到播放状态。这是工作。但是,当我想再次进入菜单状态时,我按下了“ S”,命令提示符出现错误错误不是来自IDE:

错误说明: AL_INVALID_OPERATION 当前状态不允许执行指定的操作。

内部OpenAL调用在SoundStream.cpp(317)中失败。 表达: alSourcePlay(m_source) 错误说明: AL_INVALID_OPERATION 当前状态不允许执行指定的操作。

内部OpenAL调用在SoundStream.cpp(329)中失败。 表达: alGetSourcei(m_source,AL_BUFFERS_PROCESSED和&nbProcessed) 错误说明: AL_INVALID_OPERATION 当前状态不允许执行指定的操作。

内部OpenAL调用在SoundSource.cpp(196)中失败。 表达: alGetSourcei(m_source,AL_SOURCE_STATE和&status) 错误说明: AL_INVALID_OPERATION 当前状态不允许执行指定的操作。

内部OpenAL调用在SoundSource.cpp(196)中失败。 表达: alGetSourcei(m_source,AL_SOURCE_STATE和&status) 错误说明: AL_INVALID_OPERATION 当前状态不允许执行指定的操作。

内部OpenAL调用在SoundStream.cpp(317)中失败。 表达: alSourcePlay(m_source) 错误说明: AL_INVALID_OPERATION 当前状态不允许执行指定的操作。

内部OpenAL调用在SoundStream.cpp(329)中失败。 表达: alGetSourcei(m_source,AL_BUFFERS_PROCESSED和&nbProcessed) 错误说明: AL_INVALID_OPERATION 当前状态不允许执行指定的操作。

内部OpenAL调用在SoundSource.cpp(196)中失败。 表达: alGetSourcei(m_source,AL_SOURCE_STATE和&status) 错误说明: AL_INVALID_OPERATION 当前状态不允许执行指定的操作。

内部OpenAL调用在SoundSource.cpp(196)中失败。 表达: alGetSourcei(m_source,AL_SOURCE_STATE和&status) 错误 进程返回-1073741819(0xC0000005)执行时间:4.611 s 按任意键继续。

为什么我明白了?推送状态有什么问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)