C++ 独特的ptr和StateManager用于我的基本SFML游戏,我从命令屏幕上得到了错误 void游戏管理器::pushMenuState() { states.push_back(std::move(std::make_unique(window));//std::make_unique(window) } void GameManager::pushPlayState() { states.push_back(std::move(std::make_unique(window));//std::make_unique(window) } /*-------------------------------------------------*/ void GameManager::popState() { states.erase(states.begin()); } //////////////////////////////////////////////////// void GameManager::Update() { 同时(窗口->等参线() { 如果(sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { isMenu=假; } 如果(sf::Keyboard::isKeyPressed(sf::Keyboard::S)) { isMenu=真; } //////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// 如果(isMenu) { if(states.empty()) pushMenuState(); else if(states.size()getStateType()!=状态::菜单) pushMenuState(); if(states.size()>1&&states.front()->getStateType()!=状态::菜单) popState(); states.back()->更新(窗口); } //////////////////////////////////////////////////////////////////////////////////////////////////////// 其他的 { if(states.empty()) pushPlayState(); else if(states.size()getStateType()!=状态::播放) pushPlayState(); if(states.size()>1&&states.front()->getStateType()!=State::PLAY) popState(); states.back()->更新(窗口); } //////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// } }
这是我的密码。首先是菜单状态。我按“D”键切换播放状态。它正在工作。但当我想再次进入菜单状态时,我按下了“S”,我从命令提示符得到了错误,错误不是来自IDE: 错误说明: AL_无效的_操作 当前状态下不允许指定的操作 SoundStream.cpp(317)中的内部OpenAL调用失败。 表达方式: alSourcePlay(m_源) 错误说明: AL_无效的_操作 当前状态下不允许指定的操作 SoundStream.cpp(329)中的内部OpenAL调用失败。 表达方式: alGetSourcei(m_源、AL_缓冲区、已处理和已处理) 错误说明: AL_无效的_操作 当前状态下不允许指定的操作 SoundSource.cpp(196)中的内部OpenAL调用失败。 表达方式: alGetSourcei(m_源、AL_源、状态和状态) 错误说明: AL_无效的_操作 当前状态下不允许指定的操作 SoundSource.cpp(196)中的内部OpenAL调用失败。 表达方式: alGetSourcei(m_源、AL_源、状态和状态) 错误说明: AL_无效的_操作 当前状态下不允许指定的操作 SoundStream.cpp(317)中的内部OpenAL调用失败。 表达方式: alSourcePlay(m_源) 错误说明: AL_无效的_操作 当前状态下不允许指定的操作 SoundStream.cpp(329)中的内部OpenAL调用失败。 表达方式: alGetSourcei(m_源、AL_缓冲区、已处理和已处理) 错误说明: AL_无效的_操作 当前状态下不允许指定的操作 SoundSource.cpp(196)中的内部OpenAL调用失败。 表达方式: alGetSourcei(m_源、AL_源、状态和状态) 错误说明: AL_无效的_操作 当前状态下不允许指定的操作 SoundSource.cpp(196)中的内部OpenAL调用失败。 表达方式: alGetSourcei(m_源、AL_源、状态和状态) 错误de 返回的进程-1073741819(0xC0000005)执行时间:4.611s 按任意键继续C++ 独特的ptr和StateManager用于我的基本SFML游戏,我从命令屏幕上得到了错误 void游戏管理器::pushMenuState() { states.push_back(std::move(std::make_unique(window));//std::make_unique(window) } void GameManager::pushPlayState() { states.push_back(std::move(std::make_unique(window));//std::make_unique(window) } /*-------------------------------------------------*/ void GameManager::popState() { states.erase(states.begin()); } //////////////////////////////////////////////////// void GameManager::Update() { 同时(窗口->等参线() { 如果(sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { isMenu=假; } 如果(sf::Keyboard::isKeyPressed(sf::Keyboard::S)) { isMenu=真; } //////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// 如果(isMenu) { if(states.empty()) pushMenuState(); else if(states.size()getStateType()!=状态::菜单) pushMenuState(); if(states.size()>1&&states.front()->getStateType()!=状态::菜单) popState(); states.back()->更新(窗口); } //////////////////////////////////////////////////////////////////////////////////////////////////////// 其他的 { if(states.empty()) pushPlayState(); else if(states.size()getStateType()!=状态::播放) pushPlayState(); if(states.size()>1&&states.front()->getStateType()!=State::PLAY) popState(); states.back()->更新(窗口); } //////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// } },c++,state,sfml,unique-ptr,C++,State,Sfml,Unique Ptr,这是我的密码。首先是菜单状态。我按“D”键切换播放状态。它正在工作。但当我想再次进入菜单状态时,我按下了“S”,我从命令提示符得到了错误,错误不是来自IDE: 错误说明: AL_无效的_操作 当前状态下不允许指定的操作 SoundStream.cpp(317)中的内部OpenAL调用失败。 表达方式: alSourcePlay(m_源) 错误说明: AL_无效的_操作 当前状态下不允许指定的操作 SoundStream.cpp(329)中的内部OpenAL调用失败。 表达方式: alGetSou
为什么我会这样?推送状态有什么问题?解释:我有PlayState类和MenuState类继承自State类。我是veGameManager类。GameManager有“unique_ptr states”变量。当我在菜单上时,我正在将make_unique(窗口)按到状态,当我处于播放状态并且正在执行状态时,我正在将make_unique(窗口)按到状态。如果一个状态有多个状态,则删除(states.begin())。我的播放状态有player变量。和播放器有着色器,纹理和音频。当我从go to MenuStates的状态中删除播放状态时,播放状态唯一指针会删除自身。我从openAL和openGL得到了错误信息。我能做什么?
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);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
}
}