gpt4 book ai didi

c++ - 我在 SFML sf::RenderWindow 中只有黑屏

转载 作者:行者123 更新时间:2023-11-28 05:22:17 26 4
gpt4 key购买 nike

我尝试在 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), "电池警报:系统电源已更改!");

我的示例解决方案是替换

m_sfrChangePowerMessage.setSize
(
sf::Vector2f(m_sfwChangePowerMessage.getSize().x, m_sfwChangePowerMessage.getSize().y)
);

m_sfrChangePowerMessage.setSize(sf::Vector2f(800,600));

您可能还对 Observer Pattern 感兴趣,它可能会对您的申请有所帮助。

关于c++ - 我在 SFML sf::RenderWindow 中只有黑屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41233085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com