我在SFML SF :: Renderwindow中获得了黑屏
I get just black screen in an SFML sf::RenderWindow
我尝试在C Windows表单项目中使用SFML(我仍然是新手)的优点(此处也是新的:D)。我的想法是,当事件发生此事件时,此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 miliseconds(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));
您也可能对观察者模式感兴趣,它可能会帮助您进行应用。
- 获取用C/C++打印的最后一个字符串
- 我已经通过了该问题的所有测试用例,甚至是Udebugg上的所有测试用例,并且仍然在UVA在线法官上获得了WA裁决
- 需要知道 Windows API 才能在我的应用程序激活时获取回调
- C OpenCV:尝试打印垫子值,但要获得空打印
- C 获得了C 自动对象
- C QTNETWORKREQUEST下载图像,但获得了HTML
- 特征样条插值 - 如何在任意点 x 处获取样条曲线 y 值
- 如何获取用"::"分隔的标记化字符串中的最后一个元素C++?
- 我的代码在在线评判上获得了 TLE(超出时间限制),即使我已经根据社论进行了编码
- 如果我得了标准::bad_alloc该怎么办
- 如果在 Linux 上的特定目录中创建文件,如何获取回调
- 获得数组中所有数字组合的最快方法,没有空格
- JavaScript获得数组大小效率
- 如何在其他类的嵌套循环中获得主事件循环QCoreApplication,以实现网络操作
- 从 C# 中的C++ DLL 获取回调时,WinXP 中的内存限制是多少?
- 如何从指针中获得数组的长度
- 凉亭 2.2.2.获得联合部队;获得力扭矩"Warning [ODEJoint.cc:1105] GetForceTorque: forgot to set <provide_feedback&