SFML window 没有响应
SFML window is not responding
我是一名初学者 C++ 程序员,我正在制作贪吃蛇游戏,并且正在尝试使用 SFML 库。我想制作我的 snake 控制台应用程序,但我想向 SFML window 显示分数。不仅如此,即使我整夜都在寻找解决方案,我也不知道如何将分数显示为 window。另外我的 SFML window 一直没有响应。
我使用以下代码渲染了 window:
sf::RenderWindow window(sf::VideoMode(200, 75), "Score");
sf::Font font;
if (!font.loadFromFile("font.tff"))
cout << "ERROR LOADING FONT" << endl;
sf::Text text;
text.setFont(font);
text.setString("hello");
// sf::String scoredis;
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
然后我尝试在游戏循环中显示分数:
do{
...
window.clear();
window.draw(text);
window.display();
...
}while()
main() 中的完整代码:
{
ShowConsoleCursor(false);//nastavimo da ne kaze kurzorja
//Nalozimo zvok ki ga bomo predvajali ko pojemo sadez
sf::SoundBuffer buffer;
if (!buffer.loadFromFile("sound.wav"))//v buffer vstavimo zvok
{
cout << "ERROR LOADING SOUND" << endl;//ce je kaksna napaka se prikaze to
}
sf::Sound sound;
sound.setBuffer(buffer);//nastavimo nas zvok na to kaj je v bufferju
/*sf::Font font;
if (!font.loadFromFile("font.tff"))
cout << "ERROR LOADING FONT" << endl;
sf::Text text;
text.setFont(font);
text.setString("hello");
// sf::String scoredis;*/
sf::RenderWindow window(sf::VideoMode(200, 75), "Score");
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
}
int score = 0;
int weight = 0;
srand(time(0));
narisi(); //draw map
setup();
thread NitZaVnos(spremembaSmeri); //ustvari in zažene se nova nit, ki opravlja delo funkcije spremembaSmeri
do
{
if (weight>50)
{
changed = false;
premik(preberiSmer());
weight = 0;
}
if (fruitPickup())//Funkcija ki pogleda ce je glava kace na sadezu
{
genFruit();//generira novi sadez
score += 10;//dodamo tocke
sSize++;//povecamo velikost kace
sound.play();//predvajamo zvok
}
weight++;
if (zalet())// Pogledamo ce se glava zaleti v telo ce vrne funkcija true skocimo izben zanke
break;
//stringstream ss;
// ss << score;
//scoredis.SetText(ss.str().c_str());
window.clear();
//window.draw(text);
window.display();
Sleep(5); //program pocaka 5 ms
} while (!gameOver());
gotoxy(0, visinaM + 1);
run = false; //nastavi se vrednost spremenljivke run na false, da se lahko stranska nit zakljuci
NitZaVnos.join(); //stranska nit ze sedaj sinhronizira z glavnim programom
return 0;
}
window SFML 无响应与您不再轮询事件有关。确保你的事件循环在主循环中没有被触及,并且它在游戏运行时仍然运行。如果您发布完整代码,将会有所帮助。
在这种情况下,while(window.isOpen()){} 应该是您的主要游戏循环。事件轮询是在主循环中以这种方式完成的,而不仅仅是在开始时进行一次。重构你的代码,让它没有 3 个循环,让你的 main() 是线性的,在你的主循环之前完成你的加载和东西。然后,在那个主循环中,你应该有你的事件轮询循环,之后是所有的更新内容,最后是你的绘制内容。
我是一名初学者 C++ 程序员,我正在制作贪吃蛇游戏,并且正在尝试使用 SFML 库。我想制作我的 snake 控制台应用程序,但我想向 SFML window 显示分数。不仅如此,即使我整夜都在寻找解决方案,我也不知道如何将分数显示为 window。另外我的 SFML window 一直没有响应。
我使用以下代码渲染了 window:
sf::RenderWindow window(sf::VideoMode(200, 75), "Score");
sf::Font font;
if (!font.loadFromFile("font.tff"))
cout << "ERROR LOADING FONT" << endl;
sf::Text text;
text.setFont(font);
text.setString("hello");
// sf::String scoredis;
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
然后我尝试在游戏循环中显示分数:
do{
...
window.clear();
window.draw(text);
window.display();
...
}while()
main() 中的完整代码:
{
ShowConsoleCursor(false);//nastavimo da ne kaze kurzorja
//Nalozimo zvok ki ga bomo predvajali ko pojemo sadez
sf::SoundBuffer buffer;
if (!buffer.loadFromFile("sound.wav"))//v buffer vstavimo zvok
{
cout << "ERROR LOADING SOUND" << endl;//ce je kaksna napaka se prikaze to
}
sf::Sound sound;
sound.setBuffer(buffer);//nastavimo nas zvok na to kaj je v bufferju
/*sf::Font font;
if (!font.loadFromFile("font.tff"))
cout << "ERROR LOADING FONT" << endl;
sf::Text text;
text.setFont(font);
text.setString("hello");
// sf::String scoredis;*/
sf::RenderWindow window(sf::VideoMode(200, 75), "Score");
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
}
int score = 0;
int weight = 0;
srand(time(0));
narisi(); //draw map
setup();
thread NitZaVnos(spremembaSmeri); //ustvari in zažene se nova nit, ki opravlja delo funkcije spremembaSmeri
do
{
if (weight>50)
{
changed = false;
premik(preberiSmer());
weight = 0;
}
if (fruitPickup())//Funkcija ki pogleda ce je glava kace na sadezu
{
genFruit();//generira novi sadez
score += 10;//dodamo tocke
sSize++;//povecamo velikost kace
sound.play();//predvajamo zvok
}
weight++;
if (zalet())// Pogledamo ce se glava zaleti v telo ce vrne funkcija true skocimo izben zanke
break;
//stringstream ss;
// ss << score;
//scoredis.SetText(ss.str().c_str());
window.clear();
//window.draw(text);
window.display();
Sleep(5); //program pocaka 5 ms
} while (!gameOver());
gotoxy(0, visinaM + 1);
run = false; //nastavi se vrednost spremenljivke run na false, da se lahko stranska nit zakljuci
NitZaVnos.join(); //stranska nit ze sedaj sinhronizira z glavnim programom
return 0;
}
window SFML 无响应与您不再轮询事件有关。确保你的事件循环在主循环中没有被触及,并且它在游戏运行时仍然运行。如果您发布完整代码,将会有所帮助。
while(window.isOpen()){} 应该是您的主要游戏循环。事件轮询是在主循环中以这种方式完成的,而不仅仅是在开始时进行一次。重构你的代码,让它没有 3 个循环,让你的 main() 是线性的,在你的主循环之前完成你的加载和东西。然后,在那个主循环中,你应该有你的事件轮询循环,之后是所有的更新内容,最后是你的绘制内容。