[英]I get just black screen in an SFML sf::RenderWindow
我嘗試在C ++ Windows窗體項目(在這里也是新的:D)中使用SFML的優點(在這里我還是很新的)。 我的想法是,當事件發生時,此SFML窗口彈出以顯示圖像。 我設法使SFML窗口在事件發生時彈出,但是它僅出現在空白屏幕上,但沒有顯示我想要的紋理。這是涉及SFML的代碼摘錄,帶有“ //”。 。”我將剪切不必要的代碼:
BatteryAlarmDlg.h
class CBatteryAlarmDlg : public CDialog
{
// ...
protected:
// ...
// timers
Timer m_tPowerCheck; // the struct Timer has just two members - int id and int duration
Timer m_tWindowRefresh;
// sounds
sf::SoundBuffer m_sfsbWarningMessageBuffer;
sf::Sound m_sfsWarningMessageSound;
std::string m_sPathToWarningMessageSoundFile;
// sfml window management support
sf::RenderWindow m_sfwChangePowerMessage;
sf::Texture m_sftChangePowerMessage;
sf::RectangleShape m_sfrChangePowerMessage;
bool m_bIsWindowAlive;
sf::Event m_sfeEvent;
// ...
};
在上面的代碼中,我只聲明成員。
BatteryAlarmDlg.cpp
// ...
BOOL CBatteryAlarmDlg::OnInitDialog()
{
// ...
/// init timers ///
m_tPowerCheck = Timer(42, 1000); // a timer with id == 42 and with a duration == 1,000 ms
SetTimer(m_tPowerCheck.id, m_tPowerCheck.duration, nullptr);
m_tWindowRefresh = Timer(1, 15);
SetTimer(m_tWindowRefresh.id, m_tWindowRefresh.duration, nullptr);
/// init sounds ///
m_sPathToWarningMessageSoundFile = "warning-message-2.wav";
if (!m_sfsbWarningMessageBuffer.loadFromFile(m_sPathToWarningMessageSoundFile))
{
MessageBox("Error loading of warning message sound file!");
}
m_sfsWarningMessageSound.setBuffer(m_sfsbWarningMessageBuffer);
/// init messages windows ///
m_sfwChangePowerMessage.setFramerateLimit(60);
if (!m_sftChangePowerMessage.loadFromFile("ChagePowerMessage.png"))
{
MessageBox("Error loading of warning message image file!");
}
m_sfrChangePowerMessage.setSize
(
sf::Vector2f(m_sfwChangePowerMessage.getSize().x, m_sfwChangePowerMessage.getSize().y)
);
m_sfrChangePowerMessage.setPosition(0, 0);
m_sfrChangePowerMessage.setTexture(&m_sftChangePowerMessage);
m_bIsWindowAlive = false;
return TRUE; // return TRUE unless you set the focus to a control
}
// ...
void CBatteryAlarmDlg::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == m_tPowerCheck.id)
{
if (GetSystemPowerStatus(&m_spsPower) == 0)
{
// message = "Error: Could not get the system power status!";
MessageBox("Error: Could not get the system power status!");
}
if (m_spsPower.ACLineStatus == 0 & m_iPowerChange == 1)
{
if (!m_sfwChangePowerMessage.isOpen())
{
m_sfwChangePowerMessage.create(sf::VideoMode(800, 600), "Battery allarm : System Power Changed!");
}
m_sfwChangePowerMessage.clear();
m_sfwChangePowerMessage.draw(m_sfrChangePowerMessage);
m_sfwChangePowerMessage.display();
m_iPowerChange = 0;
m_sfsWarningMessageSound.play();
m_bIsWindowAlive = true;
}
if (m_spsPower.ACLineStatus == 1 & m_iPowerChange == 0)
{
m_iPowerChange = 1;
}
}
if (nIDEvent = m_tWindowRefresh.id)
{
if (m_bIsWindowAlive)
{
while (m_sfwChangePowerMessage.pollEvent(m_sfeEvent))
{
if
(
m_sfeEvent.type == sf::Event::Closed ||
(m_sfeEvent.type == sf::Event::KeyPressed && m_sfeEvent.key.code == sf::Keyboard::Escape)
)
{
m_bIsWindowAlive = false;
}
}
m_sfwChangePowerMessage.clear();
m_sfwChangePowerMessage.draw(m_sfrChangePowerMessage);
m_sfwChangePowerMessage.display();
}
if(!m_bIsWindowAlive && m_sfwChangePowerMessage.isOpen())
{
m_sfwChangePowerMessage.close();
}
}
CDialog::OnTimer(nIDEvent);
}
背后的基本思想是,如果有一個事件,並且第一個計時器(每1秒鍾執行一次m_tPowerCheck),然后顯示SFML窗口繪制圖像,然后播放聲音。 每隔15毫秒(m_tWindowRefresh)檢查sfml窗口是否打開並重新繪制圖片-在這里我不確定是否有必要,因為這是靜止圖像,但最初我認為黑屏是因為我不刷新它不斷。 但仍然-只有黑屏...:\\
編輯:SFML的聲音工作正常。
看起來您將sf::RectangleShape m_sfrChangePowerMessage
大小設置為sf::Vector2f(0,0)
。 發生這種情況是因為您致電:
m_sfrChangePowerMessage.setSize
(
sf::Vector2f(m_sfwChangePowerMessage.getSize().x, m_sfwChangePowerMessage.getSize().y)
);
在創建窗口之前:
m_sfwChangePowerMessage.create(sf::VideoMode(800, 600), "Battery allarm : System Power Changed!");
我的示例解決方案是替換
m_sfrChangePowerMessage.setSize
(
sf::Vector2f(m_sfwChangePowerMessage.getSize().x, m_sfwChangePowerMessage.getSize().y)
);
到m_sfrChangePowerMessage.setSize(sf::Vector2f(800,600));
另外,您可能對Observer Pattern感興趣,它可能對您的應用程序有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.